xref: /netbsd-src/external/bsd/ipf/dist/lib/printdstlist.c (revision c9d5dc6c77aa32fd07899a7a63638e95ffa433dd)
1 /*	$NetBSD: printdstlist.c,v 1.1.1.2 2012/07/22 13:44:40 darrenr Exp $	*/
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  */
8 
9 #include "ipf.h"
10 
11 
12 ippool_dst_t *
printdstlist(pp,copyfunc,name,opts,nodes,fields)13 printdstlist(pp, copyfunc, name, opts, nodes, fields)
14 	ippool_dst_t *pp;
15 	copyfunc_t copyfunc;
16 	char *name;
17 	int opts;
18 	ipf_dstnode_t *nodes;
19 	wordtab_t *fields;
20 {
21 	ipf_dstnode_t *node;
22 	ippool_dst_t dst;
23 
24 	if ((*copyfunc)(pp, &dst, sizeof(dst)))
25 		return NULL;
26 
27 	if ((name != NULL) && strncmp(name, dst.ipld_name, FR_GROUPLEN))
28 		return dst.ipld_next;
29 
30 	if (fields == NULL)
31 		printdstlistdata(&dst, opts);
32 
33 	if ((dst.ipld_flags & IPDST_DELETE) != 0)
34 		PRINTF("# ");
35 	if ((opts & OPT_DEBUG) == 0)
36 		PRINTF("\t{");
37 
38 	if (nodes == NULL) {
39 		putchar(';');
40 	} else {
41 		for (node = nodes; node != NULL; ) {
42 			ipf_dstnode_t *n;
43 
44 			n = calloc(1, node->ipfd_size);
45 			if (n == NULL)
46 				break;
47 			if ((*copyfunc)(node, n, node->ipfd_size)) {
48 				free(n);
49 				return NULL;
50 			}
51 
52 			node = printdstlistnode(n, bcopywrap, opts, fields);
53 
54 			free(n);
55 		}
56 	}
57 
58 	if ((opts & OPT_DEBUG) == 0)
59 		PRINTF(" };\n");
60 
61 	return dst.ipld_next;
62 }
63