xref: /freebsd/sbin/ipf/libipf/printpoolnode.c (revision 02e9120893770924227138ba49df1edb3896112a)
1 
2 /*
3  * Copyright (C) 2012 by Darren Reed.
4  *
5  * See the IPFILTER.LICENCE file for details on licencing.
6  */
7 
8 #include "ipf.h"
9 
10 
11 ip_pool_node_t *
12 printpoolnode(ip_pool_node_t *np, int opts, wordtab_t *fields)
13 {
14 	int i;
15 
16 	if (fields != NULL) {
17 		for (i = 0; fields[i].w_value != 0; i++) {
18 			printpoolfield(np, IPLT_POOL, i);
19 			if (fields[i + 1].w_value != 0)
20 				printf("\t");
21 		}
22 		printf("\n");
23 	} else if ((opts & OPT_DEBUG) == 0) {
24 		putchar(' ');
25 		if (np->ipn_info == 1)
26 			PRINTF("! ");
27 		printip(np->ipn_addr.adf_family,
28 			(u_32_t *)&np->ipn_addr.adf_addr.in4);
29 		printmask(np->ipn_addr.adf_family,
30 			  (u_32_t *)&np->ipn_mask.adf_addr);
31 	} else {
32 #ifdef USE_INET6
33 		if (np->ipn_addr.adf_family == AF_INET6) {
34 			char buf[INET6_ADDRSTRLEN + 1];
35 			const char *str;
36 
37 			buf[0] = '\0';
38 			str = inet_ntop(AF_INET6, &np->ipn_addr.adf_addr.in6,
39 				buf, sizeof(buf) - 1);
40 			if (str == NULL)
41 				str = "???";
42 			PRINTF("\tAddress: %s%s", np->ipn_info ? "! " : "",
43 				str);
44 		} else if (np->ipn_addr.adf_family == AF_INET) {
45 #else
46 		if (np->ipn_addr.adf_family == AF_INET) {
47 #endif
48 			PRINTF("\tAddress: %s%s", np->ipn_info ? "! " : "",
49 				inet_ntoa(np->ipn_addr.adf_addr.in4));
50 		} else {
51 			PRINTF("\tAddress: family: %d\n",
52 				np->ipn_addr.adf_family);
53 		}
54 		printmask(np->ipn_addr.adf_family,
55 			  (u_32_t *)&np->ipn_mask.adf_addr);
56 #ifdef USE_QUAD_T
57 		PRINTF("\n\t\tHits %"PRIu64"\tBytes %"PRIu64"\tName %s\tRef %d\n",
58 			np->ipn_hits, np->ipn_bytes,
59 			np->ipn_name, np->ipn_ref);
60 #else
61 		PRINTF("\n\t\tHits %lu\tBytes %lu\tName %s\tRef %d\n",
62 			np->ipn_hits, np->ipn_bytes,
63 			np->ipn_name, np->ipn_ref);
64 #endif
65 	}
66 	return (np->ipn_next);
67 }
68