aboutsummaryrefslogblamecommitdiff
path: root/contrib/ipfilter/lib/printipfexpr.c
blob: 06b987e07575155dd9aafd5981ecbcf2be94ed77 (plain) (tree)
1
2
3
4
5
6
7
8




                                     
                
                                      
      






























































































































































































                                                                          
#include "ipf.h"

static void printport __P((int *));
static void printhosts __P((int *));
static void printsingle __P((int *));
#ifdef USE_INET6
static void printhostsv6 __P((int *));
#endif

void
printipfexpr(array)
	int *array;
{
	int i, nelems, j, not;
	ipfexp_t *ipfe;

	nelems = array[0];

	for (i = 1; i < nelems; ) {
		ipfe = (ipfexp_t *)(array + i);
		if (ipfe->ipfe_cmd == IPF_EXP_END)
			break;

		not = ipfe->ipfe_not;

		switch (ipfe->ipfe_cmd)
		{
		case IPF_EXP_IP_ADDR :
			PRINTF("ip.addr %s= ", not ? "!" : "");
			printhosts(array + i);
			break;

		case IPF_EXP_IP_PR :
			PRINTF("ip.p %s= ", not ? "!" : "");
			printsingle(array + i);
			break;

		case IPF_EXP_IP_SRCADDR :
			PRINTF("ip.src %s= ", not ? "!" : "");
			printhosts(array + i);
			break;

		case IPF_EXP_IP_DSTADDR :
			PRINTF("ip.dst %s= ", not ? "!" : "");
			printhosts(array + i);
			break;

		case IPF_EXP_TCP_PORT :
			PRINTF("tcp.port %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_TCP_DPORT :
			PRINTF("tcp.dport %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_TCP_SPORT :
			PRINTF("tcp.sport %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_TCP_FLAGS :
			PRINTF("tcp.flags %s= ", not ? "!" : "");

			for (j = 0; j < ipfe->ipfe_narg; ) {
				printtcpflags(array[i + 4], array[i + 5]);
				j += 2;
				if (j < array[4])
					putchar(',');
			}
			break;

		case IPF_EXP_UDP_PORT :
			PRINTF("udp.port %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_UDP_DPORT :
			PRINTF("udp.dport %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_UDP_SPORT :
			PRINTF("udp.sport %s= ", not ? "!" : "");
			printport(array + i);
			break;

		case IPF_EXP_IDLE_GT :
			PRINTF("idle-gt %s= ", not ? "!" : "");
			printsingle(array + i);
			break;

		case IPF_EXP_TCP_STATE :
			PRINTF("tcp-state %s= ", not ? "!" : "");
			printsingle(array + i);
			break;

#ifdef USE_INET6
		case IPF_EXP_IP6_ADDR :
			PRINTF("ip6.addr %s= ", not ? "!" : "");
			printhostsv6(array + i);
			break;

		case IPF_EXP_IP6_SRCADDR :
			PRINTF("ip6.src %s= ", not ? "!" : "");
			printhostsv6(array + i);
			break;

		case IPF_EXP_IP6_DSTADDR :
			PRINTF("ip6.dst %s= ", not ? "!" : "");
			printhostsv6(array + i);
			break;
#endif

		case IPF_EXP_END :
			break;

		default :
			PRINTF("#%#x,len=%d;",
			       ipfe->ipfe_cmd, ipfe->ipfe_narg);
		}

		if (array[i] != IPF_EXP_END)
			putchar(';');

		i += ipfe->ipfe_size;
		if (array[i] != IPF_EXP_END)
			putchar(' ');
	}
}


static void
printsingle(array)
	int *array;
{
	ipfexp_t *ipfe = (ipfexp_t *)array;
	int i;

	for (i = 0; i < ipfe->ipfe_narg; ) {
		PRINTF("%d", array[i + 4]);
		i++;
		if (i < ipfe->ipfe_narg)
			putchar(',');
	}
}


static void
printport(array)
	int *array;
{
	ipfexp_t *ipfe = (ipfexp_t *)array;
	int i;

	for (i = 0; i < ipfe->ipfe_narg; ) {
		PRINTF("%d", ntohs(array[i + 4]));
		i++;
		if (i < ipfe->ipfe_narg)
			putchar(',');
	}
}


static void
printhosts(array)
	int *array;
{
	ipfexp_t *ipfe = (ipfexp_t *)array;
	int i, j;

	for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
		printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
			      (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
		i += 2;
		if (i < ipfe->ipfe_narg)
			putchar(',');
	}
}


#ifdef USE_INET6
static void
printhostsv6(array)
	int *array;
{
	ipfexp_t *ipfe = (ipfexp_t *)array;
	int i, j;

	for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
		printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
			      (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
		i += 8;
		if (i < ipfe->ipfe_size)
			putchar(',');
	}
}
#endif