xref: /netbsd-src/external/bsd/ipf/dist/lib/printipfexpr.c (revision f44489f8dc8d71cd25a1bf30a50ca8ed13a40da3)
1 /*	$NetBSD: printipfexpr.c,v 1.2 2014/12/20 13:15:48 prlw1 Exp $	*/
2 
3 #include "ipf.h"
4 
5 static void printport __P((int *));
6 static void printhosts __P((int *));
7 static void printsingle __P((int *));
8 #ifdef USE_INET6
9 static void printhostsv6 __P((int *));
10 #endif
11 
12 void
printipfexpr(array)13 printipfexpr(array)
14 	int *array;
15 {
16 	int i, nelems, j, not;
17 	ipfexp_t *ipfe;
18 
19 	nelems = array[0];
20 
21 	for (i = 1; i < nelems; ) {
22 		ipfe = (ipfexp_t *)(array + i);
23 		if (ipfe->ipfe_cmd == IPF_EXP_END)
24 			break;
25 
26 		not = ipfe->ipfe_not;
27 
28 		switch (ipfe->ipfe_cmd)
29 		{
30 		case IPF_EXP_IP_ADDR :
31 			PRINTF("ip.addr %s= ", not ? "!" : "");
32 			printhosts(array + i);
33 			break;
34 
35 		case IPF_EXP_IP_PR :
36 			PRINTF("ip.p %s= ", not ? "!" : "");
37 			printsingle(array + i);
38 			break;
39 
40 		case IPF_EXP_IP_SRCADDR :
41 			PRINTF("ip.src %s= ", not ? "!" : "");
42 			printhosts(array + i);
43 			break;
44 
45 		case IPF_EXP_IP_DSTADDR :
46 			PRINTF("ip.dst %s= ", not ? "!" : "");
47 			printhosts(array + i);
48 			break;
49 
50 		case IPF_EXP_TCP_PORT :
51 			PRINTF("tcp.port %s= ", not ? "!" : "");
52 			printport(array + i);
53 			break;
54 
55 		case IPF_EXP_TCP_DPORT :
56 			PRINTF("tcp.dport %s= ", not ? "!" : "");
57 			printport(array + i);
58 			break;
59 
60 		case IPF_EXP_TCP_SPORT :
61 			PRINTF("tcp.sport %s= ", not ? "!" : "");
62 			printport(array + i);
63 			break;
64 
65 		case IPF_EXP_TCP_FLAGS :
66 			PRINTF("tcp.flags %s= ", not ? "!" : "");
67 
68 			for (j = 0; j < ipfe->ipfe_narg; ) {
69 				printtcpflags(array[i + 4], array[i + 5]);
70 				j += 2;
71 				if (j < array[4])
72 					putchar(',');
73 			}
74 			break;
75 
76 		case IPF_EXP_UDP_PORT :
77 			PRINTF("udp.port %s= ", not ? "!" : "");
78 			printport(array + i);
79 			break;
80 
81 		case IPF_EXP_UDP_DPORT :
82 			PRINTF("udp.dport %s= ", not ? "!" : "");
83 			printport(array + i);
84 			break;
85 
86 		case IPF_EXP_UDP_SPORT :
87 			PRINTF("udp.sport %s= ", not ? "!" : "");
88 			printport(array + i);
89 			break;
90 
91 		case IPF_EXP_IDLE_GT :
92 			PRINTF("idle-gt %s= ", not ? "!" : "");
93 			printsingle(array + i);
94 			break;
95 
96 		case IPF_EXP_TCP_STATE :
97 			PRINTF("tcp-state %s= ", not ? "!" : "");
98 			printsingle(array + i);
99 			break;
100 
101 #ifdef USE_INET6
102 		case IPF_EXP_IP6_ADDR :
103 			PRINTF("ip6.addr %s= ", not ? "!" : "");
104 			printhostsv6(array + i);
105 			break;
106 
107 		case IPF_EXP_IP6_SRCADDR :
108 			PRINTF("ip6.src %s= ", not ? "!" : "");
109 			printhostsv6(array + i);
110 			break;
111 
112 		case IPF_EXP_IP6_DSTADDR :
113 			PRINTF("ip6.dst %s= ", not ? "!" : "");
114 			printhostsv6(array + i);
115 			break;
116 #endif
117 
118 		case IPF_EXP_END :
119 			break;
120 
121 		default :
122 			PRINTF("#%#x,len=%d;",
123 			       ipfe->ipfe_cmd, ipfe->ipfe_narg);
124 		}
125 
126 		if (array[i] != IPF_EXP_END)
127 			putchar(';');
128 
129 		i += ipfe->ipfe_size;
130 		if (array[i] != IPF_EXP_END)
131 			putchar(' ');
132 	}
133 }
134 
135 
136 static void
printsingle(array)137 printsingle(array)
138 	int *array;
139 {
140 	ipfexp_t *ipfe = (ipfexp_t *)array;
141 	int i;
142 
143 	for (i = 0; i < ipfe->ipfe_narg; ) {
144 		PRINTF("%d", array[i + 4]);
145 		i++;
146 		if (i < ipfe->ipfe_narg)
147 			putchar(',');
148 	}
149 }
150 
151 
152 static void
printport(array)153 printport(array)
154 	int *array;
155 {
156 	ipfexp_t *ipfe = (ipfexp_t *)array;
157 	int i;
158 
159 	for (i = 0; i < ipfe->ipfe_narg; ) {
160 		PRINTF("%d", ntohs(array[i + 4]));
161 		i++;
162 		if (i < ipfe->ipfe_narg)
163 			putchar(',');
164 	}
165 }
166 
167 
168 static void
printhosts(array)169 printhosts(array)
170 	int *array;
171 {
172 	ipfexp_t *ipfe = (ipfexp_t *)array;
173 	int i, j;
174 
175 	for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
176 		printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
177 			      (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
178 		i += 2;
179 		if (i < ipfe->ipfe_narg)
180 			putchar(',');
181 	}
182 }
183 
184 
185 #ifdef USE_INET6
186 static void
printhostsv6(array)187 printhostsv6(array)
188 	int *array;
189 {
190 	ipfexp_t *ipfe = (ipfexp_t *)array;
191 	int i, j;
192 
193 	for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
194 		printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
195 			      (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
196 		i += 8;
197 		if (i < ipfe->ipfe_size)
198 			putchar(',');
199 	}
200 }
201 #endif
202