Home | History | Annotate | Line # | Download | only in lib
      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
     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
    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
    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
    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
    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