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