root/sbin/ipf/libipf/printpoolnode.c

/*
 * Copyright (C) 2012 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 */

#include "ipf.h"


ip_pool_node_t *
printpoolnode(ip_pool_node_t *np, int opts, wordtab_t *fields)
{
        int i;

        if (fields != NULL) {
                for (i = 0; fields[i].w_value != 0; i++) {
                        printpoolfield(np, IPLT_POOL, i);
                        if (fields[i + 1].w_value != 0)
                                printf("\t");
                }
                printf("\n");
        } else if ((opts & OPT_DEBUG) == 0) {
                putchar(' ');
                if (np->ipn_info == 1)
                        PRINTF("! ");
                printip(np->ipn_addr.adf_family,
                        (u_32_t *)&np->ipn_addr.adf_addr.in4);
                printmask(np->ipn_addr.adf_family,
                          (u_32_t *)&np->ipn_mask.adf_addr);
        } else {
#ifdef USE_INET6
                if (np->ipn_addr.adf_family == AF_INET6) {
                        char buf[INET6_ADDRSTRLEN + 1];
                        const char *str;
                        
                        buf[0] = '\0';
                        str = inet_ntop(AF_INET6, &np->ipn_addr.adf_addr.in6,
                                buf, sizeof(buf) - 1);
                        if (str == NULL)
                                str = "???";
                        PRINTF("\tAddress: %s%s", np->ipn_info ? "! " : "",
                                str);
                } else if (np->ipn_addr.adf_family == AF_INET) {
#else
                if (np->ipn_addr.adf_family == AF_INET) {
#endif
                        PRINTF("\tAddress: %s%s", np->ipn_info ? "! " : "",
                                inet_ntoa(np->ipn_addr.adf_addr.in4));
                } else {
                        PRINTF("\tAddress: family: %d\n",
                                np->ipn_addr.adf_family);
                }
                printmask(np->ipn_addr.adf_family,
                          (u_32_t *)&np->ipn_mask.adf_addr);
#ifdef USE_QUAD_T
                PRINTF("\n\t\tHits %"PRIu64"\tBytes %"PRIu64"\tName %s\tRef %d\n",
                        np->ipn_hits, np->ipn_bytes,
                        np->ipn_name, np->ipn_ref);
#else
                PRINTF("\n\t\tHits %lu\tBytes %lu\tName %s\tRef %d\n",
                        np->ipn_hits, np->ipn_bytes,
                        np->ipn_name, np->ipn_ref);
#endif
        }
        return (np->ipn_next);
}