root/sbin/ipf/libipf/printpoolfield.c
/*
 * Copyright (C) 2012 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 *
 * $Id: printpoolfield.c,v 1.1.2.4 2012/01/26 05:44:26 darren_r Exp $
 */

#include "ipf.h"

wordtab_t poolfields[] = {
        { "all",        -2 },
        { "address",    1 },
        { "mask",       2 },
        { "ifname",     3 },
        { "pkts",       4 },
        { "bytes",      5 },
        { "family",     6 },
        { NULL, 0 }
};


void
printpoolfield(void *p, int ptype, int fieldnum)
{
        addrfamily_t *a;
        char abuf[80];
        int i;

        switch (fieldnum)
        {
        case -2 :
                for (i = 1; poolfields[i].w_word != NULL; i++) {
                        if (poolfields[i].w_value > 0) {
                                printpoolfield(p, ptype, i);
                                if (poolfields[i + 1].w_value > 0)
                                        putchar('\t');
                        }
                }
                break;

        case 1:
                if (ptype == IPLT_POOL) {
                        ip_pool_node_t *node = (ip_pool_node_t *)p;

                        if (node->ipn_info)
                                PRINTF("!");
                        a = &node->ipn_addr;
                        PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
                                               abuf, sizeof(abuf)));
                } else if (ptype == IPLT_HASH) {
                        iphtent_t *node = (iphtent_t *)p;

                        PRINTF("%s", inet_ntop(node->ipe_family,
                                               &node->ipe_addr,
                                               abuf, sizeof(abuf)));
                } else if (ptype == IPLT_DSTLIST) {
                        ipf_dstnode_t *node = (ipf_dstnode_t *)p;

                        a = &node->ipfd_dest.fd_addr;
                        PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
                                               abuf, sizeof(abuf)));
                }
                break;

        case 2:
                if (ptype == IPLT_POOL) {
                        ip_pool_node_t *node = (ip_pool_node_t *)p;

                        a = &node->ipn_mask;
                        PRINTF("%s", inet_ntop(a->adf_family, &a->adf_addr,
                                               abuf, sizeof(abuf)));
                } else if (ptype == IPLT_HASH) {
                        iphtent_t *node = (iphtent_t *)p;

                        PRINTF("%s", inet_ntop(node->ipe_family,
                                               &node->ipe_mask,
                                               abuf, sizeof(abuf)));
                } else if (ptype == IPLT_DSTLIST) {
                        PRINTF("%s", "");
                }
                break;

        case 3:
                if (ptype == IPLT_POOL) {
                        PRINTF("%s", "");
                } else if (ptype == IPLT_HASH) {
                        PRINTF("%s", "");
                } else if (ptype == IPLT_DSTLIST) {
                        ipf_dstnode_t *node = (ipf_dstnode_t *)p;

                        if (node->ipfd_dest.fd_name == -1) {
                                PRINTF("%s", "");
                        } else {
                                PRINTF("%s", node->ipfd_names +
                                       node->ipfd_dest.fd_name);
                        }
                }
                break;

        case 4:
                if (ptype == IPLT_POOL) {
                        ip_pool_node_t *node = (ip_pool_node_t *)p;

#ifdef USE_QUAD_T
                        PRINTF("%"PRIu64"", node->ipn_hits);
#else
                        PRINTF("%lu", node->ipn_hits);
#endif
                } else if (ptype == IPLT_HASH) {
                        iphtent_t *node = (iphtent_t *)p;

#ifdef USE_QUAD_T
                        PRINTF("%"PRIu64"", node->ipe_hits);
#else
                        PRINTF("%lu", node->ipe_hits);
#endif
                } else if (ptype == IPLT_DSTLIST) {
                        printf("0");
                }
                break;

        case 5:
                if (ptype == IPLT_POOL) {
                        ip_pool_node_t *node = (ip_pool_node_t *)p;

#ifdef USE_QUAD_T
                        PRINTF("%"PRIu64"", node->ipn_bytes);
#else
                        PRINTF("%lu", node->ipn_bytes);
#endif
                } else if (ptype == IPLT_HASH) {
                        iphtent_t *node = (iphtent_t *)p;

#ifdef USE_QUAD_T
                        PRINTF("%"PRIu64"", node->ipe_bytes);
#else
                        PRINTF("%lu", node->ipe_bytes);
#endif
                } else if (ptype == IPLT_DSTLIST) {
                        printf("0");
                }
                break;

        case 6:
                if (ptype == IPLT_POOL) {
                        ip_pool_node_t *node = (ip_pool_node_t *)p;

                        PRINTF("%s", familyname(node->ipn_addr.adf_family));
                } else if (ptype == IPLT_HASH) {
                        iphtent_t *node = (iphtent_t *)p;

                        PRINTF("%s", familyname(node->ipe_family));
                } else if (ptype == IPLT_DSTLIST) {
                        ipf_dstnode_t *node = (ipf_dstnode_t *)p;

                        a = &node->ipfd_dest.fd_addr;
                        PRINTF("%s", familyname(a->adf_family));
                }
                break;

        default :
                break;
        }
}