printpool.c revision 145519
1145519Sdarrenr/*	$FreeBSD: head/contrib/ipfilter/lib/printpool.c 145519 2005-04-25 18:20:15Z darrenr $	*/
2145510Sdarrenr
3145510Sdarrenr/*
4145510Sdarrenr * Copyright (C) 2002 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr */
8145510Sdarrenr
9145510Sdarrenr#include "ipf.h"
10145510Sdarrenr
11145510Sdarrenr#define	PRINTF	(void)printf
12145510Sdarrenr#define	FPRINTF	(void)fprintf
13145510Sdarrenr
14145510Sdarrenrip_pool_t *printpool(pp, copyfunc, name, opts)
15145510Sdarrenrip_pool_t *pp;
16145510Sdarrenrcopyfunc_t copyfunc;
17145510Sdarrenrchar *name;
18145510Sdarrenrint opts;
19145510Sdarrenr{
20145510Sdarrenr	ip_pool_node_t *ipnp, *ipnpn, ipn;
21145510Sdarrenr	ip_pool_t ipp;
22145510Sdarrenr
23145510Sdarrenr	if ((*copyfunc)(pp, &ipp, sizeof(ipp)))
24145510Sdarrenr		return NULL;
25145510Sdarrenr
26145510Sdarrenr	if ((name != NULL) && strncmp(name, ipp.ipo_name, FR_GROUPLEN))
27145510Sdarrenr		return ipp.ipo_next;
28145510Sdarrenr
29145510Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
30145510Sdarrenr		if ((ipp.ipo_flags & IPOOL_ANON) != 0)
31145510Sdarrenr			PRINTF("# 'anonymous' tree %s\n", ipp.ipo_name);
32145510Sdarrenr		PRINTF("table role = ");
33145510Sdarrenr	} else {
34145510Sdarrenr		PRINTF("Name: %s", ipp.ipo_name);
35145510Sdarrenr		if ((ipp.ipo_flags & IPOOL_ANON) == IPOOL_ANON)
36145510Sdarrenr			PRINTF("(anon)");
37145510Sdarrenr		putchar(' ');
38145510Sdarrenr		PRINTF("Role: ");
39145510Sdarrenr	}
40145510Sdarrenr
41145510Sdarrenr	switch (ipp.ipo_unit)
42145510Sdarrenr	{
43145510Sdarrenr	case IPL_LOGIPF :
44145510Sdarrenr		printf("ipf");
45145510Sdarrenr		break;
46145510Sdarrenr	case IPL_LOGNAT :
47145510Sdarrenr		printf("nat");
48145510Sdarrenr		break;
49145510Sdarrenr	case IPL_LOGSTATE :
50145510Sdarrenr		printf("state");
51145510Sdarrenr		break;
52145510Sdarrenr	case IPL_LOGAUTH :
53145510Sdarrenr		printf("auth");
54145510Sdarrenr		break;
55145510Sdarrenr	case IPL_LOGSYNC :
56145510Sdarrenr		printf("sync");
57145510Sdarrenr		break;
58145510Sdarrenr	case IPL_LOGSCAN :
59145510Sdarrenr		printf("scan");
60145510Sdarrenr		break;
61145510Sdarrenr	case IPL_LOGLOOKUP :
62145510Sdarrenr		printf("lookup");
63145510Sdarrenr		break;
64145510Sdarrenr	case IPL_LOGCOUNT :
65145510Sdarrenr		printf("count");
66145510Sdarrenr		break;
67145510Sdarrenr	default :
68145510Sdarrenr		printf("unknown(%d)", ipp.ipo_unit);
69145510Sdarrenr	}
70145510Sdarrenr
71145510Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
72145510Sdarrenr		PRINTF(" type = tree number = %s\n", ipp.ipo_name);
73145510Sdarrenr		PRINTF("\t{");
74145510Sdarrenr	} else {
75145510Sdarrenr		putchar(' ');
76145510Sdarrenr
77145510Sdarrenr		PRINTF("\tReferences: %d\tHits: %lu\n", ipp.ipo_ref,
78145510Sdarrenr			ipp.ipo_hits);
79145510Sdarrenr		PRINTF("\tNodes Starting at %p\n", ipp.ipo_list);
80145510Sdarrenr	}
81145510Sdarrenr
82145510Sdarrenr	ipnpn = ipp.ipo_list;
83145510Sdarrenr	ipp.ipo_list = NULL;
84145510Sdarrenr	while (ipnpn != NULL) {
85145510Sdarrenr		ipnp = (ip_pool_node_t *)malloc(sizeof(*ipnp));
86145510Sdarrenr		(*copyfunc)(ipnpn, ipnp, sizeof(ipn));
87145510Sdarrenr		ipnpn = ipnp->ipn_next;
88145510Sdarrenr		ipnp->ipn_next = ipp.ipo_list;
89145510Sdarrenr		ipp.ipo_list = ipnp;
90145510Sdarrenr	}
91145510Sdarrenr
92145510Sdarrenr	if (ipp.ipo_list == NULL) {
93145510Sdarrenr		putchar(';');
94145510Sdarrenr	} else {
95145510Sdarrenr		for (ipnp = ipp.ipo_list; ipnp != NULL; ) {
96145510Sdarrenr			ipnp = printpoolnode(ipnp, opts);
97145510Sdarrenr
98145510Sdarrenr			if ((opts & OPT_DEBUG) == 0) {
99145510Sdarrenr				putchar(';');
100145510Sdarrenr			}
101145510Sdarrenr		}
102145510Sdarrenr	}
103145510Sdarrenr
104145510Sdarrenr	if ((opts & OPT_DEBUG) == 0)
105145510Sdarrenr		PRINTF(" };\n");
106145510Sdarrenr
107145510Sdarrenr	return ipp.ipo_next;
108145510Sdarrenr}
109