root/usr/src/cmd/ipf/lib/printhash.c
/*
 * Copyright (C) 2002 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 *
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#include "ipf.h"

#define PRINTF  (void)printf
#define FPRINTF (void)fprintf


iphtable_t *printhash(hp, copyfunc, name, opts)
iphtable_t *hp;
copyfunc_t copyfunc;
char *name;
int opts;
{
        iphtent_t *ipep, **table;
        iphtable_t iph;
        int i, printed;
        size_t sz;

        if ((*copyfunc)((char *)hp, (char *)&iph, sizeof(iph)))
                return NULL;

        if ((name != NULL) && strncmp(name, iph.iph_name, FR_GROUPLEN))
                return iph.iph_next;

        if ((opts & OPT_DEBUG) == 0) {
                if ((iph.iph_type & IPHASH_ANON) == IPHASH_ANON)
                        PRINTF("# 'anonymous' table\n");
                switch (iph.iph_type & ~IPHASH_ANON)
                {
                case IPHASH_LOOKUP :
                        PRINTF("table");
                        break;
                case IPHASH_GROUPMAP :
                        PRINTF("group-map");
                        if (iph.iph_flags & FR_INQUE)
                                PRINTF(" in");
                        else if (iph.iph_flags & FR_OUTQUE)
                                PRINTF(" out");
                        else
                                PRINTF(" ???");
                        break;
                default :
                        PRINTF("%#x", iph.iph_type);
                        break;
                }
                PRINTF(" role = ");
        } else {
                PRINTF("Hash Table Number: %s", iph.iph_name);
                if ((iph.iph_type & IPHASH_ANON) == IPHASH_ANON)
                        PRINTF("(anon)");
                putchar(' ');
                PRINTF("Role: ");
        }

        switch (iph.iph_unit)
        {
        case IPL_LOGNAT :
                PRINTF("nat");
                break;
        case IPL_LOGIPF :
                PRINTF("ipf");
                break;
        case IPL_LOGAUTH :
                PRINTF("auth");
                break;
        case IPL_LOGCOUNT :
                PRINTF("count");
                break;
        default :
                PRINTF("#%d", iph.iph_unit);
                break;
        }

        if ((opts & OPT_DEBUG) == 0) {
                if ((iph.iph_type & ~IPHASH_ANON) == IPHASH_LOOKUP)
                        PRINTF(" type = hash");
                PRINTF(" number = %s size = %lu",
                        iph.iph_name, (u_long)iph.iph_size);
                if (iph.iph_seed != 0)
                        PRINTF(" seed = %lu", iph.iph_seed);
                putchar('\n');
        } else {
                PRINTF(" Type: ");
                switch (iph.iph_type & ~IPHASH_ANON)
                {
                case IPHASH_LOOKUP :
                        PRINTF("lookup");
                        break;
                case IPHASH_GROUPMAP :
                        PRINTF("groupmap Group. %s", iph.iph_name);
                        break;
                default :
                        break;
                }

                putchar('\n');
                PRINTF("\t\tSize: %lu\tSeed: %lu",
                        (u_long)iph.iph_size, iph.iph_seed);
                PRINTF("\tRef. Count: %d\tMasks: %#x\n", iph.iph_ref,
                        iph.iph_masks[3]);
        }

        if ((opts & OPT_DEBUG) != 0) {
                struct in_addr m;

                for (i = 0; i < 32; i++) {
                        if ((1 << i) & iph.iph_masks[3]) {
                                ntomask(4, i, &m.s_addr);
                                PRINTF("\t\tMask: %s\n", inet_ntoa(m));
                        }
                }
        }

        if ((opts & OPT_DEBUG) == 0)
                PRINTF("\t{");

        sz = iph.iph_size * sizeof(*table);
        table = malloc(sz);
        if ((*copyfunc)((char *)iph.iph_table, (char *)table, sz))
                return NULL;

        for (i = 0, printed = 0; i < iph.iph_size; i++) {
                for (ipep = table[i]; ipep != NULL; ) {
                        ipep = printhashnode(&iph, ipep, copyfunc, opts);
                        printed++;
                }
        }
        if (printed == 0)
                putchar(';');

        free(table);

        if ((opts & OPT_DEBUG) == 0)
                PRINTF(" };\n");

        return iph.iph_next;
}