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