summaryrefslogtreecommitdiff
path: root/regress/sys/net/pf_print_test.c
diff options
context:
space:
mode:
authorAlexander Bluhm <bluhm@cvs.openbsd.org>2008-08-22 00:48:34 +0000
committerAlexander Bluhm <bluhm@cvs.openbsd.org>2008-08-22 00:48:34 +0000
commitd80ce27e03cf2c2ccd13df2117ba876bd5f4efff (patch)
treea276434c2b053d4d6e854857a11b8401fec40b2a /regress/sys/net/pf_print_test.c
parent347683e58165eca28a35d2e716eef3d5e7835a97 (diff)
Test the IPv6 address printing of pf_print_host() in net/pf.c.
help and ok mpf
Diffstat (limited to 'regress/sys/net/pf_print_test.c')
-rw-r--r--regress/sys/net/pf_print_test.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/regress/sys/net/pf_print_test.c b/regress/sys/net/pf_print_test.c
new file mode 100644
index 00000000000..1323ecc88b5
--- /dev/null
+++ b/regress/sys/net/pf_print_test.c
@@ -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"