1/*
2 * Copyright (C) 2012 by Darren Reed.
3 *
4 * See the IPFILTER.LICENCE file for details on licencing.
5 *
6 * $Id: printpoolfield.c,v 1.1.2.4 2012/01/26 05:44:26 darren_r Exp $
7 */
8
9#include "ipf.h"
10
11wordtab_t poolfields[] = {
12	{ "all",	-2 },
13	{ "address",	1 },
14	{ "mask",	2 },
15	{ "ifname",	3 },
16	{ "pkts",	4 },
17	{ "bytes",	5 },
18	{ "family",	6 },
19	{ NULL, 0 }
20};
21
22
23void
24printpoolfield(p, ptype, fieldnum)
25	void *p;
26	int ptype;
27	int fieldnum;
28{
29	addrfamily_t *a;
30	char abuf[80];
31	int i;
32
33	switch (fieldnum)
34	{
35	case -2 :
36		for (i = 1; poolfields[i].w_word != NULL; i++) {
37			if (poolfields[i].w_value > 0) {
38				printpoolfield(p, ptype, i);
39				if (poolfields[i + 1].w_value > 0)
40					putchar('\t');
41			}
42		}
43		break;
44
45	case 1:
46		if (ptype == IPLT_POOL) {
47			ip_pool_node_t *node = (ip_pool_node_t *)p;
48
49			if (node->ipn_info)
50				PRINTF("!");
51			a = &node->ipn_addr;
52			PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
53					       abuf, sizeof(abuf)));
54		} else if (ptype == IPLT_HASH) {
55			iphtent_t *node = (iphtent_t *)p;
56
57			PRINTF("%s", inet_ntop(node->ipe_family,
58					       &node->ipe_addr,
59					       abuf, sizeof(abuf)));
60		} else if (ptype == IPLT_DSTLIST) {
61			ipf_dstnode_t *node = (ipf_dstnode_t *)p;
62
63			a = &node->ipfd_dest.fd_addr;
64			PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
65					       abuf, sizeof(abuf)));
66		}
67		break;
68
69	case 2:
70		if (ptype == IPLT_POOL) {
71			ip_pool_node_t *node = (ip_pool_node_t *)p;
72
73			a = &node->ipn_mask;
74			PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
75					       abuf, sizeof(abuf)));
76		} else if (ptype == IPLT_HASH) {
77			iphtent_t *node = (iphtent_t *)p;
78
79			PRINTF("%s", inet_ntop(node->ipe_family,
80					       &node->ipe_mask,
81					       abuf, sizeof(abuf)));
82		} else if (ptype == IPLT_DSTLIST) {
83			PRINTF("%s", "");
84		}
85		break;
86
87	case 3:
88		if (ptype == IPLT_POOL) {
89			PRINTF("%s", "");
90		} else if (ptype == IPLT_HASH) {
91			PRINTF("%s", "");
92		} else if (ptype == IPLT_DSTLIST) {
93			ipf_dstnode_t *node = (ipf_dstnode_t *)p;
94
95			if (node->ipfd_dest.fd_name == -1) {
96				PRINTF("%s", "");
97			} else {
98				PRINTF("%s", node->ipfd_names +
99				       node->ipfd_dest.fd_name);
100			}
101		}
102		break;
103
104	case 4:
105		if (ptype == IPLT_POOL) {
106			ip_pool_node_t *node = (ip_pool_node_t *)p;
107
108#ifdef USE_QUAD_T
109			PRINTF("%"PRIu64"", node->ipn_hits);
110#else
111			PRINTF("%lu", node->ipn_hits);
112#endif
113		} else if (ptype == IPLT_HASH) {
114			iphtent_t *node = (iphtent_t *)p;
115
116#ifdef USE_QUAD_T
117			PRINTF("%"PRIu64"", node->ipe_hits);
118#else
119			PRINTF("%lu", node->ipe_hits);
120#endif
121		} else if (ptype == IPLT_DSTLIST) {
122			printf("0");
123		}
124		break;
125
126	case 5:
127		if (ptype == IPLT_POOL) {
128			ip_pool_node_t *node = (ip_pool_node_t *)p;
129
130#ifdef USE_QUAD_T
131			PRINTF("%"PRIu64"", node->ipn_bytes);
132#else
133			PRINTF("%lu", node->ipn_bytes);
134#endif
135		} else if (ptype == IPLT_HASH) {
136			iphtent_t *node = (iphtent_t *)p;
137
138#ifdef USE_QUAD_T
139			PRINTF("%"PRIu64"", node->ipe_bytes);
140#else
141			PRINTF("%lu", node->ipe_bytes);
142#endif
143		} else if (ptype == IPLT_DSTLIST) {
144			printf("0");
145		}
146		break;
147
148	case 6:
149		if (ptype == IPLT_POOL) {
150			ip_pool_node_t *node = (ip_pool_node_t *)p;
151
152			PRINTF("%s", familyname(node->ipn_addr.adf_family));
153		} else if (ptype == IPLT_HASH) {
154			iphtent_t *node = (iphtent_t *)p;
155
156			PRINTF("%s", familyname(node->ipe_family));
157		} else if (ptype == IPLT_DSTLIST) {
158			ipf_dstnode_t *node = (ipf_dstnode_t *)p;
159
160			a = &node->ipfd_dest.fd_addr;
161			PRINTF("%s", familyname(a->adf_family));
162		}
163		break;
164
165	default :
166		break;
167	}
168}
169