f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh/*
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh * Copyright (C) 2002 by Darren Reed.
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh *
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh * See the IPFILTER.LICENCE file for details on licencing.
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh *
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh * Use is subject to license terms.
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh */
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#pragma ident "%Z%%M% %I% %E% SMI"
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#include <sys/ioctl.h>
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#include "ipf.h"
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#include "netinet/ipl.h"
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#define PRINTF (void)printf
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#define FPRINTF (void)fprintf
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhip_pool_t *printpool_live(pool, fd, name, opts)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhip_pool_t *pool;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhint fd;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhchar *name;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhint opts;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh{
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh ip_pool_node_t entry, *top, *node;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh ipflookupiter_t iter;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh int i, printed, last;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh ipfobj_t obj;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((name != NULL) && strncmp(name, pool->ipo_name, FR_GROUPLEN))
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return pool->ipo_next;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh printpooldata(pool, opts);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((opts & OPT_DEBUG) == 0)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh PRINTF("\t{");
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh obj.ipfo_rev = IPFILTER_VERSION;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh obj.ipfo_type = IPFOBJ_LOOKUPITER;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh obj.ipfo_ptr = &iter;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh obj.ipfo_size = sizeof(iter);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iter.ili_data = &entry;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iter.ili_type = IPLT_POOL;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iter.ili_otype = IPFLOOKUPITER_NODE;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iter.ili_ival = IPFGENITER_LOOKUP;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iter.ili_unit = pool->ipo_unit;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh strncpy(iter.ili_name, pool->ipo_name, FR_GROUPLEN);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh last = 0;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh top = NULL;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (entry.ipn_next == NULL)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh last = 1;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh entry.ipn_next = top;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh top = malloc(sizeof(*top));
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (top == NULL)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh break;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh bcopy(&entry, top, sizeof(entry));
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh }
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh while (top != NULL) {
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh node = top;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh (void) printpoolnode(node, opts);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh top = node->ipn_next;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh free(node);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh printed++;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((opts & OPT_DEBUG) == 0)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh putchar(';');
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh }
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (printed == 0)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh putchar(';');
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((opts & OPT_DEBUG) == 0)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh PRINTF(" };\n");
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return pool->ipo_next;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh}