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