1170263Sdarrenr/* 2255332Scy * Copyright (C) 2012 by Darren Reed. 3170263Sdarrenr * 4170263Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 5170263Sdarrenr */ 6170263Sdarrenr 7170263Sdarrenr#include <sys/ioctl.h> 8170263Sdarrenr#include "ipf.h" 9170263Sdarrenr#include "netinet/ipl.h" 10170263Sdarrenr 11170263Sdarrenr 12255332Scyiphtable_t * 13255332Scyprinthash_live(hp, fd, name, opts, fields) 14255332Scy iphtable_t *hp; 15255332Scy int fd; 16255332Scy char *name; 17255332Scy int opts; 18255332Scy wordtab_t *fields; 19170263Sdarrenr{ 20255332Scy iphtent_t entry, zero; 21170263Sdarrenr ipflookupiter_t iter; 22255332Scy int last, printed; 23170263Sdarrenr ipfobj_t obj; 24170263Sdarrenr 25170263Sdarrenr if ((name != NULL) && strncmp(name, hp->iph_name, FR_GROUPLEN)) 26170263Sdarrenr return hp->iph_next; 27170263Sdarrenr 28255332Scy if (fields == NULL) 29255332Scy printhashdata(hp, opts); 30170263Sdarrenr 31170263Sdarrenr if ((hp->iph_flags & IPHASH_DELETE) != 0) 32170263Sdarrenr PRINTF("# "); 33170263Sdarrenr 34170263Sdarrenr if ((opts & OPT_DEBUG) == 0) 35170263Sdarrenr PRINTF("\t{"); 36170263Sdarrenr 37170263Sdarrenr obj.ipfo_rev = IPFILTER_VERSION; 38170263Sdarrenr obj.ipfo_type = IPFOBJ_LOOKUPITER; 39170263Sdarrenr obj.ipfo_ptr = &iter; 40170263Sdarrenr obj.ipfo_size = sizeof(iter); 41170263Sdarrenr 42170263Sdarrenr iter.ili_data = &entry; 43170263Sdarrenr iter.ili_type = IPLT_HASH; 44170263Sdarrenr iter.ili_otype = IPFLOOKUPITER_NODE; 45170263Sdarrenr iter.ili_ival = IPFGENITER_LOOKUP; 46170263Sdarrenr iter.ili_unit = hp->iph_unit; 47170263Sdarrenr strncpy(iter.ili_name, hp->iph_name, FR_GROUPLEN); 48170263Sdarrenr 49170263Sdarrenr last = 0; 50170263Sdarrenr printed = 0; 51255332Scy bzero((char *)&zero, sizeof(zero)); 52170263Sdarrenr 53170263Sdarrenr while (!last && (ioctl(fd, SIOCLOOKUPITER, &obj) == 0)) { 54170263Sdarrenr if (entry.ipe_next == NULL) 55170263Sdarrenr last = 1; 56255332Scy if (bcmp(&zero, &entry, sizeof(zero)) == 0) 57170263Sdarrenr break; 58255332Scy (void) printhashnode(hp, &entry, bcopywrap, opts, fields); 59170263Sdarrenr printed++; 60170263Sdarrenr } 61255332Scy if (last == 0) 62255332Scy ipferror(fd, "walking hash nodes:"); 63170263Sdarrenr 64170263Sdarrenr if (printed == 0) 65170263Sdarrenr putchar(';'); 66170263Sdarrenr 67170263Sdarrenr if ((opts & OPT_DEBUG) == 0) 68170263Sdarrenr PRINTF(" };\n"); 69170263Sdarrenr return hp->iph_next; 70170263Sdarrenr} 71