printhash.c revision 145510
1145510Sdarrenr/*	$NetBSD$	*/
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
14145510Sdarrenr
15145510Sdarrenriphtable_t *printhash(hp, copyfunc, name, opts)
16145510Sdarrenriphtable_t *hp;
17145510Sdarrenrcopyfunc_t copyfunc;
18145510Sdarrenrchar *name;
19145510Sdarrenrint opts;
20145510Sdarrenr{
21145510Sdarrenr	iphtent_t *ipep, **table;
22145510Sdarrenr	iphtable_t iph;
23145510Sdarrenr	int i, printed;
24145510Sdarrenr	size_t sz;
25145510Sdarrenr
26145510Sdarrenr	if ((*copyfunc)((char *)hp, (char *)&iph, sizeof(iph)))
27145510Sdarrenr		return NULL;
28145510Sdarrenr
29145510Sdarrenr	if ((name != NULL) && strncmp(name, iph.iph_name, FR_GROUPLEN))
30145510Sdarrenr		return iph.iph_next;
31145510Sdarrenr
32145510Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
33145510Sdarrenr		if ((iph.iph_type & IPHASH_ANON) == IPHASH_ANON)
34145510Sdarrenr			PRINTF("# 'anonymous' table\n");
35145510Sdarrenr		switch (iph.iph_type & ~IPHASH_ANON)
36145510Sdarrenr		{
37145510Sdarrenr		case IPHASH_LOOKUP :
38145510Sdarrenr			PRINTF("table");
39145510Sdarrenr			break;
40145510Sdarrenr		case IPHASH_GROUPMAP :
41145510Sdarrenr			PRINTF("group-map");
42145510Sdarrenr			if (iph.iph_flags & FR_INQUE)
43145510Sdarrenr				PRINTF(" in");
44145510Sdarrenr			else if (iph.iph_flags & FR_OUTQUE)
45145510Sdarrenr				PRINTF(" out");
46145510Sdarrenr			else
47145510Sdarrenr				PRINTF(" ???");
48145510Sdarrenr			break;
49145510Sdarrenr		default :
50145510Sdarrenr			PRINTF("%#x", iph.iph_type);
51145510Sdarrenr			break;
52145510Sdarrenr		}
53145510Sdarrenr		PRINTF(" role = ");
54145510Sdarrenr	} else {
55145510Sdarrenr		PRINTF("Hash Table Number: %s", iph.iph_name);
56145510Sdarrenr		if ((iph.iph_type & IPHASH_ANON) == IPHASH_ANON)
57145510Sdarrenr			PRINTF("(anon)");
58145510Sdarrenr		putchar(' ');
59145510Sdarrenr		PRINTF("Role: ");
60145510Sdarrenr	}
61145510Sdarrenr
62145510Sdarrenr	switch (iph.iph_unit)
63145510Sdarrenr	{
64145510Sdarrenr	case IPL_LOGNAT :
65145510Sdarrenr		PRINTF("nat");
66145510Sdarrenr		break;
67145510Sdarrenr	case IPL_LOGIPF :
68145510Sdarrenr		PRINTF("ipf");
69145510Sdarrenr		break;
70145510Sdarrenr	case IPL_LOGAUTH :
71145510Sdarrenr		PRINTF("auth");
72145510Sdarrenr		break;
73145510Sdarrenr	case IPL_LOGCOUNT :
74145510Sdarrenr		PRINTF("count");
75145510Sdarrenr		break;
76145510Sdarrenr	default :
77145510Sdarrenr		PRINTF("#%d", iph.iph_unit);
78145510Sdarrenr		break;
79145510Sdarrenr	}
80145510Sdarrenr
81145510Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
82145510Sdarrenr		if ((iph.iph_type & ~IPHASH_ANON) == IPHASH_LOOKUP)
83145510Sdarrenr			PRINTF(" type = hash");
84145510Sdarrenr		PRINTF(" number = %s size = %lu",
85145510Sdarrenr			iph.iph_name, (u_long)iph.iph_size);
86145510Sdarrenr		if (iph.iph_seed != 0)
87145510Sdarrenr			PRINTF(" seed = %lu", iph.iph_seed);
88145510Sdarrenr		putchar('\n');
89145510Sdarrenr	} else {
90145510Sdarrenr		PRINTF(" Type: ");
91145510Sdarrenr		switch (iph.iph_type & ~IPHASH_ANON)
92145510Sdarrenr		{
93145510Sdarrenr		case IPHASH_LOOKUP :
94145510Sdarrenr			PRINTF("lookup");
95145510Sdarrenr			break;
96145510Sdarrenr		case IPHASH_GROUPMAP :
97145510Sdarrenr			PRINTF("groupmap Group. %s", iph.iph_name);
98145510Sdarrenr			break;
99145510Sdarrenr		default :
100145510Sdarrenr			break;
101145510Sdarrenr		}
102145510Sdarrenr
103145510Sdarrenr		putchar('\n');
104145510Sdarrenr		PRINTF("\t\tSize: %lu\tSeed: %lu",
105145510Sdarrenr			(u_long)iph.iph_size, iph.iph_seed);
106145510Sdarrenr		PRINTF("\tRef. Count: %d\tMasks: %#x\n", iph.iph_ref,
107145510Sdarrenr			iph.iph_masks);
108145510Sdarrenr	}
109145510Sdarrenr
110145510Sdarrenr	if ((opts & OPT_DEBUG) != 0) {
111145510Sdarrenr		struct in_addr m;
112145510Sdarrenr
113145510Sdarrenr		for (i = 0; i < 32; i++) {
114145510Sdarrenr			if ((1 << i) & iph.iph_masks) {
115145510Sdarrenr				ntomask(4, i, &m.s_addr);
116145510Sdarrenr				PRINTF("\t\tMask: %s\n", inet_ntoa(m));
117145510Sdarrenr			}
118145510Sdarrenr		}
119145510Sdarrenr	}
120145510Sdarrenr
121145510Sdarrenr	if ((opts & OPT_DEBUG) == 0)
122145510Sdarrenr		PRINTF("\t{");
123145510Sdarrenr
124145510Sdarrenr	sz = iph.iph_size * sizeof(*table);
125145510Sdarrenr	table = malloc(sz);
126145510Sdarrenr	if ((*copyfunc)((char *)iph.iph_table, (char *)table, sz))
127145510Sdarrenr		return NULL;
128145510Sdarrenr
129145510Sdarrenr	for (i = 0, printed = 0; i < iph.iph_size; i++) {
130145510Sdarrenr		for (ipep = table[i]; ipep != NULL; ) {
131145510Sdarrenr			ipep = printhashnode(&iph, ipep, copyfunc, opts);
132145510Sdarrenr			printed++;
133145510Sdarrenr		}
134145510Sdarrenr	}
135145510Sdarrenr	if (printed == 0)
136145510Sdarrenr		putchar(';');
137145510Sdarrenr
138145510Sdarrenr	free(table);
139145510Sdarrenr
140145510Sdarrenr	if ((opts & OPT_DEBUG) == 0)
141145510Sdarrenr		PRINTF(" };\n");
142145510Sdarrenr
143145510Sdarrenr	return iph.iph_next;
144145510Sdarrenr}
145