summaryrefslogtreecommitdiffstats
path: root/src/test/reader_unixsock.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2022-01-14 15:03:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2022-01-14 15:03:48 +0000
commitbe956cd27353a4bb585b1a648e8469cf7adb5edf (patch)
treea473793c3fd59ace461f23a8d75d9ca29a82b4ff /src/test/reader_unixsock.c
parentInitial commit. (diff)
downloaddnswire-be956cd27353a4bb585b1a648e8469cf7adb5edf.tar.xz
dnswire-be956cd27353a4bb585b1a648e8469cf7adb5edf.zip
Adding upstream version 0.2.0.upstream/0.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/reader_unixsock.c')
-rw-r--r--src/test/reader_unixsock.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/test/reader_unixsock.c b/src/test/reader_unixsock.c
new file mode 100644
index 0000000..f9f0f56
--- /dev/null
+++ b/src/test/reader_unixsock.c
@@ -0,0 +1,86 @@
+#include <dnswire/writer.h>
+#include <dnswire/reader.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+#include "print_dnstap.c"
+
+int main(int argc, const char* argv[])
+{
+ if (argc < 2) {
+ return 1;
+ }
+
+ struct sockaddr_un path;
+ memset(&path, 0, sizeof(struct sockaddr_un));
+ path.sun_family = AF_UNIX;
+ strncpy(path.sun_path, argv[1], sizeof(path.sun_path) - 1);
+
+ int readfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (readfd == -1
+ || bind(readfd, (struct sockaddr*)&path, sizeof(struct sockaddr_un))
+ || listen(readfd, 1)) {
+ close(readfd);
+ return 1;
+ }
+ fprintf(stderr, "bind & listen\n");
+
+ int fd, ret = 1;
+ alarm(5);
+ if ((fd = accept(readfd, 0, 0))) {
+ fprintf(stderr, "accept\n");
+
+ struct dnswire_reader reader;
+ if (dnswire_reader_init(&reader) != dnswire_ok) {
+ return 1;
+ }
+ dnswire_reader_allow_bidirectional(&reader, true);
+
+ // force small buffers to trigger buf resizing
+ reader.write_size = 4;
+ reader.write_inc = 4;
+ if (dnswire_reader_set_bufsize(&reader, 4) != dnswire_ok) {
+ return 1;
+ }
+ if (dnswire_reader_set_bufinc(&reader, 4) != dnswire_ok) {
+ return 1;
+ }
+
+ int done = 0;
+
+ while (!done) {
+ switch (dnswire_reader_read(&reader, fd)) {
+ case dnswire_have_dnstap:
+ print_dnstap(dnswire_reader_dnstap(reader));
+ fflush(stdout);
+ break;
+ case dnswire_again:
+ case dnswire_need_more:
+ break;
+ case dnswire_endofdata:
+ done = 1;
+ break;
+ default:
+ fprintf(stderr, "dnswire_reader_read() error\n");
+ shutdown(fd, SHUT_RDWR);
+ close(fd);
+ close(readfd);
+ return 1;
+ }
+ }
+
+ dnswire_reader_destroy(reader);
+ shutdown(fd, SHUT_RDWR);
+ close(fd);
+ }
+ close(readfd);
+ return ret;
+}