xref: /openbsd-src/regress/sys/net/pf_print/pf_print_test.c (revision f0a35bce36287194e6853eb8503560544277c405)
1*f0a35bceSbluhm /*	$OpenBSD: pf_print_test.c,v 1.1 2016/08/24 22:31:41 bluhm Exp $ */
2*f0a35bceSbluhm 
3*f0a35bceSbluhm /*
4*f0a35bceSbluhm  * Copyright (c) 2008, 2013 Alexander Bluhm <bluhm@openbsd.org>
5*f0a35bceSbluhm  *
6*f0a35bceSbluhm  * Permission to use, copy, modify, and distribute this software for any
7*f0a35bceSbluhm  * purpose with or without fee is hereby granted, provided that the above
8*f0a35bceSbluhm  * copyright notice and this permission notice appear in all copies.
9*f0a35bceSbluhm  *
10*f0a35bceSbluhm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*f0a35bceSbluhm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*f0a35bceSbluhm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*f0a35bceSbluhm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*f0a35bceSbluhm  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*f0a35bceSbluhm  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*f0a35bceSbluhm  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*f0a35bceSbluhm  */
18*f0a35bceSbluhm 
19*f0a35bceSbluhm #include <sys/types.h>
20*f0a35bceSbluhm #include <sys/socket.h>
21*f0a35bceSbluhm #include <sys/wait.h>
22*f0a35bceSbluhm 
23*f0a35bceSbluhm #include <net/if.h>
24*f0a35bceSbluhm #include <net/route.h>
25*f0a35bceSbluhm #include <netinet/in.h>
26*f0a35bceSbluhm #include <arpa/inet.h>
27*f0a35bceSbluhm 
28*f0a35bceSbluhm #include <net/pfvar.h>
29*f0a35bceSbluhm 
30*f0a35bceSbluhm #include <err.h>
31*f0a35bceSbluhm #include <stdio.h>
32*f0a35bceSbluhm #include <stdlib.h>
33*f0a35bceSbluhm #include <string.h>
34*f0a35bceSbluhm #include <unistd.h>
35*f0a35bceSbluhm 
36*f0a35bceSbluhm #define	INET	1
37*f0a35bceSbluhm #define	INET6	1
38*f0a35bceSbluhm 
39*f0a35bceSbluhm void			pf_print_host(struct pf_addr *, u_int16_t, u_int8_t);
40*f0a35bceSbluhm #define	addlog		printf
41*f0a35bceSbluhm 
42*f0a35bceSbluhm char *ipv6_addrs[] = {
43*f0a35bceSbluhm 	"::",
44*f0a35bceSbluhm 	"::1",
45*f0a35bceSbluhm 	"1::",
46*f0a35bceSbluhm 	"1::1",
47*f0a35bceSbluhm 	"0:1::1:0",
48*f0a35bceSbluhm 	"::1:2:0",
49*f0a35bceSbluhm 	"0:1::",
50*f0a35bceSbluhm 	"::1:0:0:0",
51*f0a35bceSbluhm 	"1:2:3:4:5:6:7:8",
52*f0a35bceSbluhm 	"0:2:3:4:5:6:7:8",
53*f0a35bceSbluhm 	"1:2:3:4:5:6:7:0",
54*f0a35bceSbluhm 	"1:0:3:0:5:0:7:8",
55*f0a35bceSbluhm 	"::3:4:5:6:7:8",
56*f0a35bceSbluhm 	"1:2:3:4:5:6::",
57*f0a35bceSbluhm 	"0:2:3::6:7:8",
58*f0a35bceSbluhm 	"1:2:0:4:5::8",
59*f0a35bceSbluhm 	"1::4:5:0:0:8",
60*f0a35bceSbluhm 	"1::5:0:0:8",
61*f0a35bceSbluhm 	"1:0:0:4::8",
62*f0a35bceSbluhm 	"::4:5:6:0:0",
63*f0a35bceSbluhm 	"0:0:3:4:5::",
64*f0a35bceSbluhm 	"::4:5:0:0:0",
65*f0a35bceSbluhm 	"1234:5678:90ab:cdef:1234:5678:90ab:cdef",
66*f0a35bceSbluhm 	NULL
67*f0a35bceSbluhm };
68*f0a35bceSbluhm 
69*f0a35bceSbluhm int
main(int argc,char * argv[])70*f0a35bceSbluhm main(int argc, char *argv[])
71*f0a35bceSbluhm {
72*f0a35bceSbluhm 	char str[100];
73*f0a35bceSbluhm 	struct pf_addr addr;
74*f0a35bceSbluhm 	FILE *fpipe;
75*f0a35bceSbluhm 	char **in, *out;
76*f0a35bceSbluhm 	size_t len;
77*f0a35bceSbluhm 	pid_t pid;
78*f0a35bceSbluhm 	int fds[2];
79*f0a35bceSbluhm 	int status, ret = 0;
80*f0a35bceSbluhm 
81*f0a35bceSbluhm 	for (in = ipv6_addrs; *in; in++) {
82*f0a35bceSbluhm 		if (!inet_pton(AF_INET6, *in, &addr.v6))
83*f0a35bceSbluhm 			errx(2, "inet_pton %s", *in);
84*f0a35bceSbluhm 		if (!inet_ntop(AF_INET6, &addr.v6, str, sizeof(str)))
85*f0a35bceSbluhm 			errx(2, "inet_ntop %s", *in);
86*f0a35bceSbluhm 		if (strcmp(*in, str) != 0) {
87*f0a35bceSbluhm 			warnx("not equal\nin:\t%s\nstr:\t%s", *in, str);
88*f0a35bceSbluhm 			ret = 2;
89*f0a35bceSbluhm 		}
90*f0a35bceSbluhm 		if (pipe(fds) == -1)
91*f0a35bceSbluhm 			err(2, "pipe");
92*f0a35bceSbluhm 		if ((pid = fork()) == -1)
93*f0a35bceSbluhm 			err(2, "fork");
94*f0a35bceSbluhm 		if (pid == 0) {
95*f0a35bceSbluhm 			close(fds[0]);
96*f0a35bceSbluhm 			if (dup2(fds[1], 1) == -1)
97*f0a35bceSbluhm 				err(2, "dup2");
98*f0a35bceSbluhm 			close(fds[1]);
99*f0a35bceSbluhm 			pf_print_host(&addr, 0, AF_INET6);
100*f0a35bceSbluhm 			fflush(stdout);
101*f0a35bceSbluhm 			_exit(0);
102*f0a35bceSbluhm 		}
103*f0a35bceSbluhm 		close(fds[1]);
104*f0a35bceSbluhm 		if ((fpipe = fdopen(fds[0], "r")) == NULL)
105*f0a35bceSbluhm 			err(2, "fdopen");
106*f0a35bceSbluhm 		if ((out = fgetln(fpipe, &len)) == NULL)
107*f0a35bceSbluhm 			err(2, "fgetln");
108*f0a35bceSbluhm 		if (out[len - 1] == '\n')
109*f0a35bceSbluhm 			out[len - 1] = '\0';
110*f0a35bceSbluhm 		else {
111*f0a35bceSbluhm 			char *tmp;
112*f0a35bceSbluhm 			/* EOF without EOL, copy and add the NUL */
113*f0a35bceSbluhm 			if ((tmp = malloc(len + 1)) == NULL)
114*f0a35bceSbluhm 				err(2, "malloc");
115*f0a35bceSbluhm 			memcpy(tmp, out, len);
116*f0a35bceSbluhm 			tmp[len] = '\0';
117*f0a35bceSbluhm 			out = tmp;
118*f0a35bceSbluhm 		}
119*f0a35bceSbluhm 		if (fclose(fpipe) == EOF)
120*f0a35bceSbluhm 			err(2, "fclose");
121*f0a35bceSbluhm 		if (wait(&status) <= 0)
122*f0a35bceSbluhm 			err(2, "wait");
123*f0a35bceSbluhm 		if (status != 0)
124*f0a35bceSbluhm 			errx(2, "child exit status: %d", status);
125*f0a35bceSbluhm 		if (strcmp(*in, out) != 0) {
126*f0a35bceSbluhm 			warnx("not equal\nin:\t%s\nout:\t%s", *in, out);
127*f0a35bceSbluhm 			ret = 1;
128*f0a35bceSbluhm 		}
129*f0a35bceSbluhm 	}
130*f0a35bceSbluhm 	return (ret);
131*f0a35bceSbluhm }
132*f0a35bceSbluhm 
133*f0a35bceSbluhm #include "pf_print_host.c"
134