xref: /netbsd-src/external/bsd/ipf/dist/lib/printipfexpr.c (revision b757af438b42b93f8c6571f026d8b8ef3eaf5fc9)
1 /*	$NetBSD: printipfexpr.c,v 1.1.1.1 2012/03/23 21:20:09 christos 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 
9 
10 void
11 printipfexpr(array)
12 	int *array;
13 {
14 	int i, nelems, j, not;
15 	ipfexp_t *ipfe;
16 
17 	nelems = array[0];
18 
19 	for (i = 1; i < nelems; ) {
20 		ipfe = (ipfexp_t *)(array + i);
21 		if (ipfe->ipfe_cmd == IPF_EXP_END)
22 			break;
23 
24 		not = ipfe->ipfe_not;
25 
26 		switch (ipfe->ipfe_cmd)
27 		{
28 		case IPF_EXP_IP_ADDR :
29 			PRINTF("ip.addr %s= ", not ? "!" : "");
30 			printhosts(array + i);
31 			break;
32 
33 		case IPF_EXP_IP_PR :
34 			PRINTF("ip.p %s= ", not ? "!" : "");
35 			printsingle(array + i);
36 			break;
37 
38 		case IPF_EXP_IP_SRCADDR :
39 			PRINTF("ip.src %s= ", not ? "!" : "");
40 			printhosts(array + i);
41 			break;
42 
43 		case IPF_EXP_IP_DSTADDR :
44 			PRINTF("ip.dst %s= ", not ? "!" : "");
45 			printhosts(array + i);
46 			break;
47 
48 		case IPF_EXP_TCP_PORT :
49 			PRINTF("tcp.port %s= ", not ? "!" : "");
50 			printport(array + i);
51 			break;
52 
53 		case IPF_EXP_TCP_DPORT :
54 			PRINTF("tcp.dport %s= ", not ? "!" : "");
55 			printport(array + i);
56 			break;
57 
58 		case IPF_EXP_TCP_SPORT :
59 			PRINTF("tcp.sport %s= ", not ? "!" : "");
60 			printport(array + i);
61 			break;
62 
63 		case IPF_EXP_TCP_FLAGS :
64 			PRINTF("tcp.flags %s= ", not ? "!" : "");
65 
66 			for (j = 0; j < ipfe->ipfe_narg; ) {
67 				printtcpflags(array[i + 3], array[i + 4]);
68 				j += 2;
69 				if (j < array[3])
70 					putchar(',');
71 			}
72 			break;
73 
74 		case IPF_EXP_UDP_PORT :
75 			PRINTF("udp.port %s= ", not ? "!" : "");
76 			printport(array + i);
77 			break;
78 
79 		case IPF_EXP_UDP_DPORT :
80 			PRINTF("udp.dport %s= ", not ? "!" : "");
81 			printport(array + i);
82 			break;
83 
84 		case IPF_EXP_UDP_SPORT :
85 			PRINTF("udp.sport %s= ", not ? "!" : "");
86 			printport(array + i);
87 			break;
88 
89 		case IPF_EXP_IDLE_GT :
90 			PRINTF("idle-gt %s= ", not ? "!" : "");
91 			printsingle(array + i);
92 			break;
93 
94 		case IPF_EXP_TCP_STATE :
95 			PRINTF("tcp-state %s= ", not ? "!" : "");
96 			printsingle(array + i);
97 			break;
98 
99 		case IPF_EXP_END :
100 			break;
101 
102 		default :
103 			PRINTF("#%#x,len=%d;",
104 			       ipfe->ipfe_cmd, ipfe->ipfe_narg);
105 		}
106 
107 		if (array[i] != IPF_EXP_END)
108 			putchar(';');
109 
110 		i += ipfe->ipfe_narg + 3;
111 		if (array[i] != IPF_EXP_END)
112 			putchar(' ');
113 	}
114 }
115 
116 
117 static void printsingle(array)
118 	int *array;
119 {
120 	ipfexp_t *ipfe = (ipfexp_t *)array;
121 	int i;
122 
123 	for (i = 0; i < ipfe->ipfe_narg; ) {
124 		PRINTF("%d", array[i + 3]);
125 		i++;
126 		if (i < ipfe->ipfe_narg)
127 			putchar(',');
128 	}
129 }
130 
131 
132 static void printport(array)
133 	int *array;
134 {
135 	ipfexp_t *ipfe = (ipfexp_t *)array;
136 	int i;
137 
138 	for (i = 0; i < ipfe->ipfe_narg; ) {
139 		PRINTF("%d", ntohs(array[i + 3]));
140 		i++;
141 		if (i < ipfe->ipfe_narg)
142 			putchar(',');
143 	}
144 }
145 
146 
147 static void printhosts(array)
148 	int *array;
149 {
150 	ipfexp_t *ipfe = (ipfexp_t *)array;
151 	int i;
152 
153 	for (i = 0; i < ipfe->ipfe_narg; ) {
154 		printhostmask(AF_INET, (u_32_t *)(array + i + 3),
155 			      (u_32_t *)(array + i + 4));
156 		i += 2;
157 		if (i < ipfe->ipfe_narg)
158 			putchar(',');
159 	}
160 }
161