1254219Scy#include "ipf.h"
2254219Scy
3254219Scystatic void printport __P((int *));
4254219Scystatic void printhosts __P((int *));
5254219Scystatic void printsingle __P((int *));
6268937Scy#ifdef USE_INET6
7254219Scystatic void printhostsv6 __P((int *));
8268937Scy#endif
9254219Scy
10254219Scyvoid
11254219Scyprintipfexpr(array)
12254219Scy	int *array;
13254219Scy{
14254219Scy	int i, nelems, j, not;
15254219Scy	ipfexp_t *ipfe;
16254219Scy
17254219Scy	nelems = array[0];
18254219Scy
19254219Scy	for (i = 1; i < nelems; ) {
20254219Scy		ipfe = (ipfexp_t *)(array + i);
21254219Scy		if (ipfe->ipfe_cmd == IPF_EXP_END)
22254219Scy			break;
23254219Scy
24254219Scy		not = ipfe->ipfe_not;
25254219Scy
26254219Scy		switch (ipfe->ipfe_cmd)
27254219Scy		{
28254219Scy		case IPF_EXP_IP_ADDR :
29254219Scy			PRINTF("ip.addr %s= ", not ? "!" : "");
30254219Scy			printhosts(array + i);
31254219Scy			break;
32254219Scy
33254219Scy		case IPF_EXP_IP_PR :
34254219Scy			PRINTF("ip.p %s= ", not ? "!" : "");
35254219Scy			printsingle(array + i);
36254219Scy			break;
37254219Scy
38254219Scy		case IPF_EXP_IP_SRCADDR :
39254219Scy			PRINTF("ip.src %s= ", not ? "!" : "");
40254219Scy			printhosts(array + i);
41254219Scy			break;
42254219Scy
43254219Scy		case IPF_EXP_IP_DSTADDR :
44254219Scy			PRINTF("ip.dst %s= ", not ? "!" : "");
45254219Scy			printhosts(array + i);
46254219Scy			break;
47254219Scy
48254219Scy		case IPF_EXP_TCP_PORT :
49254219Scy			PRINTF("tcp.port %s= ", not ? "!" : "");
50254219Scy			printport(array + i);
51254219Scy			break;
52254219Scy
53254219Scy		case IPF_EXP_TCP_DPORT :
54254219Scy			PRINTF("tcp.dport %s= ", not ? "!" : "");
55254219Scy			printport(array + i);
56254219Scy			break;
57254219Scy
58254219Scy		case IPF_EXP_TCP_SPORT :
59254219Scy			PRINTF("tcp.sport %s= ", not ? "!" : "");
60254219Scy			printport(array + i);
61254219Scy			break;
62254219Scy
63254219Scy		case IPF_EXP_TCP_FLAGS :
64254219Scy			PRINTF("tcp.flags %s= ", not ? "!" : "");
65254219Scy
66254219Scy			for (j = 0; j < ipfe->ipfe_narg; ) {
67254219Scy				printtcpflags(array[i + 4], array[i + 5]);
68254219Scy				j += 2;
69254219Scy				if (j < array[4])
70254219Scy					putchar(',');
71254219Scy			}
72254219Scy			break;
73254219Scy
74254219Scy		case IPF_EXP_UDP_PORT :
75254219Scy			PRINTF("udp.port %s= ", not ? "!" : "");
76254219Scy			printport(array + i);
77254219Scy			break;
78254219Scy
79254219Scy		case IPF_EXP_UDP_DPORT :
80254219Scy			PRINTF("udp.dport %s= ", not ? "!" : "");
81254219Scy			printport(array + i);
82254219Scy			break;
83254219Scy
84254219Scy		case IPF_EXP_UDP_SPORT :
85254219Scy			PRINTF("udp.sport %s= ", not ? "!" : "");
86254219Scy			printport(array + i);
87254219Scy			break;
88254219Scy
89254219Scy		case IPF_EXP_IDLE_GT :
90254219Scy			PRINTF("idle-gt %s= ", not ? "!" : "");
91254219Scy			printsingle(array + i);
92254219Scy			break;
93254219Scy
94254219Scy		case IPF_EXP_TCP_STATE :
95254219Scy			PRINTF("tcp-state %s= ", not ? "!" : "");
96254219Scy			printsingle(array + i);
97254219Scy			break;
98254219Scy
99254219Scy#ifdef USE_INET6
100254219Scy		case IPF_EXP_IP6_ADDR :
101254219Scy			PRINTF("ip6.addr %s= ", not ? "!" : "");
102254219Scy			printhostsv6(array + i);
103254219Scy			break;
104254219Scy
105254219Scy		case IPF_EXP_IP6_SRCADDR :
106254219Scy			PRINTF("ip6.src %s= ", not ? "!" : "");
107254219Scy			printhostsv6(array + i);
108254219Scy			break;
109254219Scy
110254219Scy		case IPF_EXP_IP6_DSTADDR :
111254219Scy			PRINTF("ip6.dst %s= ", not ? "!" : "");
112254219Scy			printhostsv6(array + i);
113254219Scy			break;
114254219Scy#endif
115254219Scy
116254219Scy		case IPF_EXP_END :
117254219Scy			break;
118254219Scy
119254219Scy		default :
120254219Scy			PRINTF("#%#x,len=%d;",
121254219Scy			       ipfe->ipfe_cmd, ipfe->ipfe_narg);
122254219Scy		}
123254219Scy
124254219Scy		if (array[i] != IPF_EXP_END)
125254219Scy			putchar(';');
126254219Scy
127254219Scy		i += ipfe->ipfe_size;
128254219Scy		if (array[i] != IPF_EXP_END)
129254219Scy			putchar(' ');
130254219Scy	}
131254219Scy}
132254219Scy
133254219Scy
134254219Scystatic void
135254219Scyprintsingle(array)
136254219Scy	int *array;
137254219Scy{
138254219Scy	ipfexp_t *ipfe = (ipfexp_t *)array;
139254219Scy	int i;
140254219Scy
141254219Scy	for (i = 0; i < ipfe->ipfe_narg; ) {
142254219Scy		PRINTF("%d", array[i + 4]);
143254219Scy		i++;
144254219Scy		if (i < ipfe->ipfe_narg)
145254219Scy			putchar(',');
146254219Scy	}
147254219Scy}
148254219Scy
149254219Scy
150254219Scystatic void
151254219Scyprintport(array)
152254219Scy	int *array;
153254219Scy{
154254219Scy	ipfexp_t *ipfe = (ipfexp_t *)array;
155254219Scy	int i;
156254219Scy
157254219Scy	for (i = 0; i < ipfe->ipfe_narg; ) {
158254219Scy		PRINTF("%d", ntohs(array[i + 4]));
159254219Scy		i++;
160254219Scy		if (i < ipfe->ipfe_narg)
161254219Scy			putchar(',');
162254219Scy	}
163254219Scy}
164254219Scy
165254219Scy
166254219Scystatic void
167254219Scyprinthosts(array)
168254219Scy	int *array;
169254219Scy{
170254219Scy	ipfexp_t *ipfe = (ipfexp_t *)array;
171254219Scy	int i, j;
172254219Scy
173254219Scy	for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
174254219Scy		printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
175254219Scy			      (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
176254219Scy		i += 2;
177254219Scy		if (i < ipfe->ipfe_narg)
178254219Scy			putchar(',');
179254219Scy	}
180254219Scy}
181254219Scy
182254219Scy
183254219Scy#ifdef USE_INET6
184254219Scystatic void
185254219Scyprinthostsv6(array)
186254219Scy	int *array;
187254219Scy{
188254219Scy	ipfexp_t *ipfe = (ipfexp_t *)array;
189254219Scy	int i, j;
190254219Scy
191254219Scy	for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
192254219Scy		printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
193254219Scy			      (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
194254219Scy		i += 8;
195254219Scy		if (i < ipfe->ipfe_size)
196254219Scy			putchar(',');
197254219Scy	}
198254219Scy}
199254219Scy#endif
200