Home | History | Annotate | Line # | Download | only in lib
printipfexpr.c revision 1.1.1.2
      1      1.1  christos /*	$NetBSD: printipfexpr.c,v 1.1.1.2 2012/07/22 13:44:41 darrenr Exp $	*/
      2      1.1  christos 
      3      1.1  christos #include "ipf.h"
      4      1.1  christos 
      5      1.1  christos static void printport __P((int *));
      6      1.1  christos static void printhosts __P((int *));
      7      1.1  christos static void printsingle __P((int *));
      8  1.1.1.2   darrenr static void printhostsv6 __P((int *));
      9      1.1  christos 
     10      1.1  christos void
     11      1.1  christos printipfexpr(array)
     12      1.1  christos 	int *array;
     13      1.1  christos {
     14      1.1  christos 	int i, nelems, j, not;
     15      1.1  christos 	ipfexp_t *ipfe;
     16      1.1  christos 
     17      1.1  christos 	nelems = array[0];
     18      1.1  christos 
     19      1.1  christos 	for (i = 1; i < nelems; ) {
     20      1.1  christos 		ipfe = (ipfexp_t *)(array + i);
     21      1.1  christos 		if (ipfe->ipfe_cmd == IPF_EXP_END)
     22      1.1  christos 			break;
     23      1.1  christos 
     24      1.1  christos 		not = ipfe->ipfe_not;
     25      1.1  christos 
     26      1.1  christos 		switch (ipfe->ipfe_cmd)
     27      1.1  christos 		{
     28      1.1  christos 		case IPF_EXP_IP_ADDR :
     29      1.1  christos 			PRINTF("ip.addr %s= ", not ? "!" : "");
     30      1.1  christos 			printhosts(array + i);
     31      1.1  christos 			break;
     32      1.1  christos 
     33      1.1  christos 		case IPF_EXP_IP_PR :
     34      1.1  christos 			PRINTF("ip.p %s= ", not ? "!" : "");
     35      1.1  christos 			printsingle(array + i);
     36      1.1  christos 			break;
     37      1.1  christos 
     38      1.1  christos 		case IPF_EXP_IP_SRCADDR :
     39      1.1  christos 			PRINTF("ip.src %s= ", not ? "!" : "");
     40      1.1  christos 			printhosts(array + i);
     41      1.1  christos 			break;
     42      1.1  christos 
     43      1.1  christos 		case IPF_EXP_IP_DSTADDR :
     44      1.1  christos 			PRINTF("ip.dst %s= ", not ? "!" : "");
     45      1.1  christos 			printhosts(array + i);
     46      1.1  christos 			break;
     47      1.1  christos 
     48      1.1  christos 		case IPF_EXP_TCP_PORT :
     49      1.1  christos 			PRINTF("tcp.port %s= ", not ? "!" : "");
     50      1.1  christos 			printport(array + i);
     51      1.1  christos 			break;
     52      1.1  christos 
     53      1.1  christos 		case IPF_EXP_TCP_DPORT :
     54      1.1  christos 			PRINTF("tcp.dport %s= ", not ? "!" : "");
     55      1.1  christos 			printport(array + i);
     56      1.1  christos 			break;
     57      1.1  christos 
     58      1.1  christos 		case IPF_EXP_TCP_SPORT :
     59      1.1  christos 			PRINTF("tcp.sport %s= ", not ? "!" : "");
     60      1.1  christos 			printport(array + i);
     61      1.1  christos 			break;
     62      1.1  christos 
     63      1.1  christos 		case IPF_EXP_TCP_FLAGS :
     64      1.1  christos 			PRINTF("tcp.flags %s= ", not ? "!" : "");
     65      1.1  christos 
     66      1.1  christos 			for (j = 0; j < ipfe->ipfe_narg; ) {
     67  1.1.1.2   darrenr 				printtcpflags(array[i + 4], array[i + 5]);
     68      1.1  christos 				j += 2;
     69  1.1.1.2   darrenr 				if (j < array[4])
     70      1.1  christos 					putchar(',');
     71      1.1  christos 			}
     72      1.1  christos 			break;
     73      1.1  christos 
     74      1.1  christos 		case IPF_EXP_UDP_PORT :
     75      1.1  christos 			PRINTF("udp.port %s= ", not ? "!" : "");
     76      1.1  christos 			printport(array + i);
     77      1.1  christos 			break;
     78      1.1  christos 
     79      1.1  christos 		case IPF_EXP_UDP_DPORT :
     80      1.1  christos 			PRINTF("udp.dport %s= ", not ? "!" : "");
     81      1.1  christos 			printport(array + i);
     82      1.1  christos 			break;
     83      1.1  christos 
     84      1.1  christos 		case IPF_EXP_UDP_SPORT :
     85      1.1  christos 			PRINTF("udp.sport %s= ", not ? "!" : "");
     86      1.1  christos 			printport(array + i);
     87      1.1  christos 			break;
     88      1.1  christos 
     89      1.1  christos 		case IPF_EXP_IDLE_GT :
     90      1.1  christos 			PRINTF("idle-gt %s= ", not ? "!" : "");
     91      1.1  christos 			printsingle(array + i);
     92      1.1  christos 			break;
     93      1.1  christos 
     94      1.1  christos 		case IPF_EXP_TCP_STATE :
     95      1.1  christos 			PRINTF("tcp-state %s= ", not ? "!" : "");
     96      1.1  christos 			printsingle(array + i);
     97      1.1  christos 			break;
     98      1.1  christos 
     99  1.1.1.2   darrenr #ifdef USE_INET6
    100  1.1.1.2   darrenr 		case IPF_EXP_IP6_ADDR :
    101  1.1.1.2   darrenr 			PRINTF("ip6.addr %s= ", not ? "!" : "");
    102  1.1.1.2   darrenr 			printhostsv6(array + i);
    103  1.1.1.2   darrenr 			break;
    104  1.1.1.2   darrenr 
    105  1.1.1.2   darrenr 		case IPF_EXP_IP6_SRCADDR :
    106  1.1.1.2   darrenr 			PRINTF("ip6.src %s= ", not ? "!" : "");
    107  1.1.1.2   darrenr 			printhostsv6(array + i);
    108  1.1.1.2   darrenr 			break;
    109  1.1.1.2   darrenr 
    110  1.1.1.2   darrenr 		case IPF_EXP_IP6_DSTADDR :
    111  1.1.1.2   darrenr 			PRINTF("ip6.dst %s= ", not ? "!" : "");
    112  1.1.1.2   darrenr 			printhostsv6(array + i);
    113  1.1.1.2   darrenr 			break;
    114  1.1.1.2   darrenr #endif
    115  1.1.1.2   darrenr 
    116      1.1  christos 		case IPF_EXP_END :
    117      1.1  christos 			break;
    118      1.1  christos 
    119      1.1  christos 		default :
    120      1.1  christos 			PRINTF("#%#x,len=%d;",
    121      1.1  christos 			       ipfe->ipfe_cmd, ipfe->ipfe_narg);
    122      1.1  christos 		}
    123      1.1  christos 
    124      1.1  christos 		if (array[i] != IPF_EXP_END)
    125      1.1  christos 			putchar(';');
    126      1.1  christos 
    127  1.1.1.2   darrenr 		i += ipfe->ipfe_size;
    128      1.1  christos 		if (array[i] != IPF_EXP_END)
    129      1.1  christos 			putchar(' ');
    130      1.1  christos 	}
    131      1.1  christos }
    132      1.1  christos 
    133      1.1  christos 
    134  1.1.1.2   darrenr static void
    135  1.1.1.2   darrenr printsingle(array)
    136      1.1  christos 	int *array;
    137      1.1  christos {
    138      1.1  christos 	ipfexp_t *ipfe = (ipfexp_t *)array;
    139      1.1  christos 	int i;
    140      1.1  christos 
    141      1.1  christos 	for (i = 0; i < ipfe->ipfe_narg; ) {
    142  1.1.1.2   darrenr 		PRINTF("%d", array[i + 4]);
    143      1.1  christos 		i++;
    144      1.1  christos 		if (i < ipfe->ipfe_narg)
    145      1.1  christos 			putchar(',');
    146      1.1  christos 	}
    147      1.1  christos }
    148      1.1  christos 
    149      1.1  christos 
    150  1.1.1.2   darrenr static void
    151  1.1.1.2   darrenr printport(array)
    152      1.1  christos 	int *array;
    153      1.1  christos {
    154      1.1  christos 	ipfexp_t *ipfe = (ipfexp_t *)array;
    155      1.1  christos 	int i;
    156      1.1  christos 
    157      1.1  christos 	for (i = 0; i < ipfe->ipfe_narg; ) {
    158  1.1.1.2   darrenr 		PRINTF("%d", ntohs(array[i + 4]));
    159      1.1  christos 		i++;
    160      1.1  christos 		if (i < ipfe->ipfe_narg)
    161      1.1  christos 			putchar(',');
    162      1.1  christos 	}
    163      1.1  christos }
    164      1.1  christos 
    165      1.1  christos 
    166  1.1.1.2   darrenr static void
    167  1.1.1.2   darrenr printhosts(array)
    168      1.1  christos 	int *array;
    169      1.1  christos {
    170      1.1  christos 	ipfexp_t *ipfe = (ipfexp_t *)array;
    171  1.1.1.2   darrenr 	int i, j;
    172      1.1  christos 
    173  1.1.1.2   darrenr 	for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
    174  1.1.1.2   darrenr 		printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
    175  1.1.1.2   darrenr 			      (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
    176      1.1  christos 		i += 2;
    177      1.1  christos 		if (i < ipfe->ipfe_narg)
    178      1.1  christos 			putchar(',');
    179      1.1  christos 	}
    180      1.1  christos }
    181  1.1.1.2   darrenr 
    182  1.1.1.2   darrenr 
    183  1.1.1.2   darrenr #ifdef USE_INET6
    184  1.1.1.2   darrenr static void
    185  1.1.1.2   darrenr printhostsv6(array)
    186  1.1.1.2   darrenr 	int *array;
    187  1.1.1.2   darrenr {
    188  1.1.1.2   darrenr 	ipfexp_t *ipfe = (ipfexp_t *)array;
    189  1.1.1.2   darrenr 	int i, j;
    190  1.1.1.2   darrenr 
    191  1.1.1.2   darrenr 	for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
    192  1.1.1.2   darrenr 		printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
    193  1.1.1.2   darrenr 			      (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
    194  1.1.1.2   darrenr 		i += 8;
    195  1.1.1.2   darrenr 		if (i < ipfe->ipfe_size)
    196  1.1.1.2   darrenr 			putchar(',');
    197  1.1.1.2   darrenr 	}
    198  1.1.1.2   darrenr }
    199  1.1.1.2   darrenr #endif
    200