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