root/sbin/ipf/libipf/printhashdata.c
/*
 * Copyright (C) 2012 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 */

#include "ipf.h"
#include <ctype.h>


void
printhashdata(iphtable_t *hp, int opts)
{

        if (opts & OPT_SAVEOUT) {
                if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
                        PRINTF("# ");
                PRINTF("pool ");
        } else if ((opts & OPT_DEBUG) == 0) {
                if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
                        PRINTF("# 'anonymous' table refs %d\n", hp->iph_ref);
                if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
                        PRINTF("# ");
                switch (hp->iph_type & ~IPHASH_ANON)
                {
                case IPHASH_LOOKUP :
                        PRINTF("table");
                        break;
                case IPHASH_GROUPMAP :
                        PRINTF("group-map");
                        if (hp->iph_flags & FR_INQUE)
                                PRINTF(" in");
                        else if (hp->iph_flags & FR_OUTQUE)
                                PRINTF(" out");
                        else
                                PRINTF(" ???");
                        break;
                default :
                        PRINTF("%#x", hp->iph_type);
                        break;
                }
                PRINTF(" role=");
        } else {
                if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
                        PRINTF("# ");
                PRINTF("Hash Table %s: %s",
                        ISDIGIT(*hp->iph_name) ? "Number" : "Name",
                        hp->iph_name);
                if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
                        PRINTF("(anon)");
                putchar(' ');
                PRINTF("Role: ");
        }

        printunit(hp->iph_unit);

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

                putchar('\n');
                PRINTF("\t\tSize: %lu\tSeed: %lu",
                        (u_long)hp->iph_size, hp->iph_seed);
                PRINTF("\tRef. Count: %d\tMasks: %#x\n", hp->iph_ref,
                        hp->iph_maskset[0]);
        }

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

                for (i = 0; i < 32; i++) {
                        if ((1 << i) & hp->iph_maskset[0]) {
                                ntomask(AF_INET, i, &m.s_addr);
                                PRINTF("\t\tMask: %s\n", inet_ntoa(m));
                        }
                }
        }
}