1 /* $NetBSD: printdstlistnode.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 ipf_dstnode_t *
printdstlistnode(inp,copyfunc,opts,fields)13 printdstlistnode(inp, copyfunc, opts, fields)
14 ipf_dstnode_t *inp;
15 copyfunc_t copyfunc;
16 int opts;
17 wordtab_t *fields;
18 {
19 ipf_dstnode_t node, *np;
20 int i;
21 #ifdef USE_INET6
22 char buf[INET6_ADDRSTRLEN+1];
23 const char *str;
24 #endif
25
26 if ((*copyfunc)(inp, &node, sizeof(node)))
27 return NULL;
28
29 np = calloc(1, node.ipfd_size);
30 if (np == NULL)
31 return node.ipfd_next;
32 if ((*copyfunc)(inp, np, node.ipfd_size))
33 return NULL;
34
35 if (fields != NULL) {
36 for (i = 0; fields[i].w_value != 0; i++) {
37 printpoolfield(np, IPLT_DSTLIST, i);
38 if (fields[i + 1].w_value != 0)
39 printf("\t");
40 }
41 printf("\n");
42 } else if ((opts & OPT_DEBUG) == 0) {
43 putchar(' ');
44 if (np->ipfd_dest.fd_name >= 0)
45 PRINTF("%s:", np->ipfd_names);
46 if (np->ipfd_dest.fd_addr.adf_family == AF_INET) {
47 printip(AF_INET, (u_32_t *)&np->ipfd_dest.fd_ip);
48 } else {
49 #ifdef USE_INET6
50 str = inet_ntop(AF_INET6, &np->ipfd_dest.fd_ip6,
51 buf, sizeof(buf) - 1);
52 if (str != NULL)
53 PRINTF("%s", str);
54 #endif
55 }
56 putchar(';');
57 } else {
58 PRINTF("Interface: [%s]/%d\n", np->ipfd_names,
59 np->ipfd_dest.fd_name);
60 #ifdef USE_INET6
61 str = inet_ntop(np->ipfd_dest.fd_addr.adf_family,
62 &np->ipfd_dest.fd_ip6, buf, sizeof(buf) - 1);
63 if (str != NULL) {
64 PRINTF("\tAddress: %s\n", str);
65 }
66 #else
67 PRINTF("\tAddress: %s\n", inet_ntoa(np->ipfd_dest.fd_ip));
68 #endif
69 PRINTF(
70 #ifdef USE_QUAD_T
71 "\t\tStates %d\tRef %d\tName [%s]\tUid %d\n",
72 #else
73 "\t\tStates %d\tRef %d\tName [%s]\tUid %d\n",
74 #endif
75 np->ipfd_states, np->ipfd_ref,
76 np->ipfd_names, np->ipfd_uid);
77 }
78 free(np);
79 return node.ipfd_next;
80 }
81