diff options
-rw-r--r-- | regress/sys/Makefile | 4 | ||||
-rw-r--r-- | regress/sys/net/Makefile | 13 | ||||
-rw-r--r-- | regress/sys/net/pf_print_test.c | 112 |
3 files changed, 127 insertions, 2 deletions
diff --git a/regress/sys/Makefile b/regress/sys/Makefile index 6ee123441a6..5b6768fc376 100644 --- a/regress/sys/Makefile +++ b/regress/sys/Makefile @@ -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 index 00000000000..3504d8cda06 --- /dev/null +++ b/regress/sys/net/Makefile @@ -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 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" |