xref: /illumos-gate/usr/src/cmd/ipf/lib/printpool_live.c (revision f3ac678143127d4c6c1793fadabb5ded04e127b6)
1*f3ac6781SToomas Soome /*
2*f3ac6781SToomas Soome  * Copyright (C) 2002 by Darren Reed.
3*f3ac6781SToomas Soome  *
4*f3ac6781SToomas Soome  * See the IPFILTER.LICENCE file for details on licencing.
5*f3ac6781SToomas Soome  *
6*f3ac6781SToomas Soome  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
7*f3ac6781SToomas Soome  * Use is subject to license terms.
8*f3ac6781SToomas Soome  */
9*f3ac6781SToomas Soome 
10*f3ac6781SToomas Soome #include <sys/ioctl.h>
11*f3ac6781SToomas Soome #include "ipf.h"
12*f3ac6781SToomas Soome #include "netinet/ipl.h"
13*f3ac6781SToomas Soome 
14*f3ac6781SToomas Soome #define	PRINTF	(void)printf
15*f3ac6781SToomas Soome #define	FPRINTF	(void)fprintf
16*f3ac6781SToomas Soome 
17*f3ac6781SToomas Soome 
printpool_live(pool,fd,name,opts)18*f3ac6781SToomas Soome ip_pool_t *printpool_live(pool, fd, name, opts)
19*f3ac6781SToomas Soome ip_pool_t *pool;
20*f3ac6781SToomas Soome int fd;
21*f3ac6781SToomas Soome char *name;
22*f3ac6781SToomas Soome int opts;
23*f3ac6781SToomas Soome {
24*f3ac6781SToomas Soome 	ip_pool_node_t entry, *top, *node;
25*f3ac6781SToomas Soome 	ipflookupiter_t iter;
26*f3ac6781SToomas Soome 	int i, printed = 0, last;
27*f3ac6781SToomas Soome 	ipfobj_t obj;
28*f3ac6781SToomas Soome 
29*f3ac6781SToomas Soome 	if ((name != NULL) && strncmp(name, pool->ipo_name, FR_GROUPLEN))
30*f3ac6781SToomas Soome 		return pool->ipo_next;
31*f3ac6781SToomas Soome 
32*f3ac6781SToomas Soome 	printpooldata(pool, opts);
33*f3ac6781SToomas Soome 
34*f3ac6781SToomas Soome 	if ((opts & OPT_DEBUG) == 0)
35*f3ac6781SToomas Soome 		PRINTF("\t{");
36*f3ac6781SToomas Soome 
37*f3ac6781SToomas Soome 	obj.ipfo_rev = IPFILTER_VERSION;
38*f3ac6781SToomas Soome 	obj.ipfo_type = IPFOBJ_LOOKUPITER;
39*f3ac6781SToomas Soome 	obj.ipfo_ptr = &iter;
40*f3ac6781SToomas Soome 	obj.ipfo_size = sizeof(iter);
41*f3ac6781SToomas Soome 
42*f3ac6781SToomas Soome 	iter.ili_data = &entry;
43*f3ac6781SToomas Soome 	iter.ili_type = IPLT_POOL;
44*f3ac6781SToomas Soome 	iter.ili_otype = IPFLOOKUPITER_NODE;
45*f3ac6781SToomas Soome 	iter.ili_ival = IPFGENITER_LOOKUP;
46*f3ac6781SToomas Soome 	iter.ili_unit = pool->ipo_unit;
47*f3ac6781SToomas Soome 	strncpy(iter.ili_name, pool->ipo_name, FR_GROUPLEN);
48*f3ac6781SToomas Soome 
49*f3ac6781SToomas Soome 	last = 0;
50*f3ac6781SToomas Soome 	top = NULL;
51*f3ac6781SToomas Soome 
52*f3ac6781SToomas Soome 	while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
53*f3ac6781SToomas Soome 		if (entry.ipn_next == NULL)
54*f3ac6781SToomas Soome 			last = 1;
55*f3ac6781SToomas Soome 		entry.ipn_next = top;
56*f3ac6781SToomas Soome 		top = malloc(sizeof(*top));
57*f3ac6781SToomas Soome 		if (top == NULL)
58*f3ac6781SToomas Soome 			break;
59*f3ac6781SToomas Soome 		bcopy(&entry, top, sizeof(entry));
60*f3ac6781SToomas Soome 	}
61*f3ac6781SToomas Soome 
62*f3ac6781SToomas Soome 	while (top != NULL) {
63*f3ac6781SToomas Soome 		node = top;
64*f3ac6781SToomas Soome 		(void) printpoolnode(node, opts);
65*f3ac6781SToomas Soome 		top = node->ipn_next;
66*f3ac6781SToomas Soome 		free(node);
67*f3ac6781SToomas Soome 		printed++;
68*f3ac6781SToomas Soome 
69*f3ac6781SToomas Soome 		if ((opts & OPT_DEBUG) == 0)
70*f3ac6781SToomas Soome 			putchar(';');
71*f3ac6781SToomas Soome 	}
72*f3ac6781SToomas Soome 
73*f3ac6781SToomas Soome 	if (printed == 0)
74*f3ac6781SToomas Soome 		putchar(';');
75*f3ac6781SToomas Soome 
76*f3ac6781SToomas Soome 	if ((opts & OPT_DEBUG) == 0)
77*f3ac6781SToomas Soome 		PRINTF(" };\n");
78*f3ac6781SToomas Soome 	return pool->ipo_next;
79*f3ac6781SToomas Soome }
80