Home | History | Annotate | Line # | Download | only in lib
printipfexpr.c revision 1.1.1.1.2.2
      1 /*	$NetBSD: printipfexpr.c,v 1.1.1.1.2.2 2012/04/17 00:03:20 yamt 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