]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ipfilter/lib/printpool_live.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ipfilter / lib / printpool_live.c
1 /*
2  * Copyright (C) 2002 by Darren Reed.
3  *
4  * See the IPFILTER.LICENCE file for details on licencing.
5  */
6
7 #include <sys/ioctl.h>
8 #include "ipf.h"
9 #include "netinet/ipl.h"
10
11 #define PRINTF  (void)printf
12 #define FPRINTF (void)fprintf
13
14
15 ip_pool_t *printpool_live(pool, fd, name, opts)
16 ip_pool_t *pool;
17 int fd;
18 char *name;
19 int opts;
20 {
21         ip_pool_node_t entry, *top, *node;
22         ipflookupiter_t iter;
23         int printed, last;
24         ipfobj_t obj;
25
26         if ((name != NULL) && strncmp(name, pool->ipo_name, FR_GROUPLEN))
27                 return pool->ipo_next;
28
29         printpooldata(pool, opts);
30
31         if ((pool->ipo_flags & IPOOL_DELETE) != 0)
32                 PRINTF("# ");
33         if ((opts & OPT_DEBUG) == 0)
34                 PRINTF("\t{");
35
36         obj.ipfo_rev = IPFILTER_VERSION;
37         obj.ipfo_type = IPFOBJ_LOOKUPITER;
38         obj.ipfo_ptr = &iter;
39         obj.ipfo_size = sizeof(iter);
40
41         iter.ili_data = &entry;
42         iter.ili_type = IPLT_POOL;
43         iter.ili_otype = IPFLOOKUPITER_NODE;
44         iter.ili_ival = IPFGENITER_LOOKUP;
45         iter.ili_unit = pool->ipo_unit;
46         strncpy(iter.ili_name, pool->ipo_name, FR_GROUPLEN);
47
48         last = 0;
49         top = NULL;
50         printed = 0;
51
52         while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) {
53                 if (entry.ipn_next == NULL)
54                         last = 1;
55                 node = malloc(sizeof(*top));
56                 if (node == NULL)
57                         break;
58                 bcopy(&entry, node, sizeof(entry));
59                 node->ipn_next = top;
60                 top = node;
61         }
62
63         while (top != NULL) {
64                 node = top;
65                 (void) printpoolnode(node, opts);
66                 if ((opts & OPT_DEBUG) == 0)
67                         putchar(';');
68                 top = node->ipn_next;
69                 free(node);
70                 printed++;
71         }
72
73         if (printed == 0)
74                 putchar(';');
75
76         if ((opts & OPT_DEBUG) == 0)
77                 PRINTF(" };\n");
78
79         if (ioctl(fd, SIOCIPFDELTOK, &iter.ili_key) != 0)
80                 perror("SIOCIPFDELTOK");
81
82         return pool->ipo_next;
83 }