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