Test the IPv6 address printing of pf_print_host() in net/pf.c.
authorbluhm <bluhm@openbsd.org>
Fri, 22 Aug 2008 00:48:33 +0000 (00:48 +0000)
committerbluhm <bluhm@openbsd.org>
Fri, 22 Aug 2008 00:48:33 +0000 (00:48 +0000)
help and ok mpf

regress/sys/Makefile
regress/sys/net/Makefile [new file with mode: 0644]
regress/sys/net/pf_print_test.c [new file with mode: 0644]

index 6ee1234..5b6768f 100644 (file)
@@ -1,7 +1,7 @@
-#      $OpenBSD: Makefile,v 1.17 2005/12/06 20:18:56 pedro Exp $
+#      $OpenBSD: Makefile,v 1.18 2008/08/22 00:48:33 bluhm Exp $
 #      $NetBSD: Makefile,v 1.4 1995/04/20 22:41:08 cgd Exp $
 
-SUBDIR+= copy crypto ddb fifofs kern ptrace sys uvm dev
+SUBDIR+= copy crypto ddb fifofs kern net ptrace sys uvm dev
 .if exists(arch/${MACHINE})
 SUBDIR+= arch/${MACHINE}
 .endif
diff --git a/regress/sys/net/Makefile b/regress/sys/net/Makefile
new file mode 100644 (file)
index 0000000..3504d8c
--- /dev/null
@@ -0,0 +1,13 @@
+PROG=          pf_print_test
+CLEANFILES=    pf_print_host.c
+CFLAGS=                -Wall
+CPPFLAGS=      -I.
+
+pf_print_host.c: ../../../sys/net/pf.c Makefile
+       sed -n '/^pf_print_host/{x;p;x;};/^pf_print_host/,/^}/p;h' \
+           ${.CURDIR}/../../../sys/net/pf.c >$@.tmp
+       mv $@.tmp $@
+
+pf_print_test.o: pf_print_test.c pf_print_host.c
+
+.include <bsd.regress.mk>
diff --git a/regress/sys/net/pf_print_test.c b/regress/sys/net/pf_print_test.c
new file mode 100644 (file)
index 0000000..1323ecc
--- /dev/null
@@ -0,0 +1,112 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <net/pfvar.h>
+#include <net/route.h>
+#include <netinet/in.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define        INET    1
+#define        INET6   1
+
+void                    pf_print_host(struct pf_addr *, u_int16_t, u_int8_t);
+
+char *ipv6_addrs[] = {
+       "::",
+       "::1",
+       "1::",
+       "1::1",
+       "0:1::1:0",
+       "::1:2:0",
+       "0:1::",
+       "::1:0:0:0",
+       "1:2:3:4:5:6:7:8",
+       "0:2:3:4:5:6:7:8",
+       "1:2:3:4:5:6:7:0",
+       "1:0:3:0:5:0:7:8",
+       "::3:4:5:6:7:8",
+       "1:2:3:4:5:6::",
+       "0:2:3::6:7:8",
+       "1:2:0:4:5::8",
+       "1::4:5:0:0:8",
+       "1::5:0:0:8",
+       "1:0:0:4::8",
+       "::4:5:6:0:0",
+       "0:0:3:4:5::",
+       "::4:5:0:0:0",
+       "1234:5678:90ab:cdef:1234:5678:90ab:cdef",
+       NULL
+};
+
+int
+main(int argc, char *argv[])
+{
+       char str[100];
+       struct pf_addr addr;
+       FILE *fpipe;
+       char **in, *out;
+       size_t len;
+       pid_t pid;
+       int fds[2];
+       int status, ret = 0;
+
+       for (in = ipv6_addrs; *in; in++) {
+               if (!inet_pton(AF_INET6, *in, &addr.v6))
+                       errx(2, "inet_pton %s", *in);
+               if (!inet_ntop(AF_INET6, &addr.v6, str, sizeof(str)))
+                       errx(2, "inet_ntop %s", *in);
+               if (strcmp(*in, str) != 0) {
+                       warnx("not equal\nin:\t%s\nstr:\t%s", *in, str);
+                       ret = 2;
+               }
+               if (pipe(fds) == -1)
+                       err(2, "pipe");
+               if ((pid = fork()) == -1)
+                       err(2, "fork");
+               if (pid == 0) {
+                       close(fds[0]);
+                       if (dup2(fds[1], 1) == -1)
+                               err(2, "dup2");
+                       close(fds[1]);
+                       pf_print_host(&addr, 0, AF_INET6);
+                       fflush(stdout);
+                       _exit(0);
+               }
+               close(fds[1]);
+               if ((fpipe = fdopen(fds[0], "r")) == NULL)
+                       err(2, "fdopen");
+               if ((out = fgetln(fpipe, &len)) == NULL)
+                       err(2, "fgetln");
+               if (out[len - 1] == '\n')
+                       out[len - 1] = '\0';
+               else {
+                       char *tmp;
+                       /* EOF without EOL, copy and add the NUL */
+                       if ((tmp = malloc(len + 1)) == NULL)
+                               err(2, "malloc");
+                       memcpy(tmp, out, len);
+                       tmp[len] = '\0';
+                       out = tmp;
+               }
+               if (fclose(fpipe) == EOF)
+                       err(2, "fclose");
+               if (wait(&status) <= 0)
+                       err(2, "wait");
+               if (status != 0)
+                       errx(2, "child exit status: %d", status);
+               if (strcmp(*in, out) != 0) {
+                       warnx("not equal\nin:\t%s\nout:\t%s", *in, out);
+                       ret = 1;
+               }
+       }
+       return (ret);
+}
+
+#include "pf_print_host.c"