1 /*
2 * Copyright (c) 2004 Rinet Corp., Novosibirsk, Russia
3 *
4 * Redistribution and use in source forms, with and without modification,
5 * are permitted provided that this entire comment appears intact.
6 *
7 * THIS SOURCE CODE IS PROVIDED ``AS IS'' WITHOUT ANY WARRANTIES OF ANY KIND.
8 */
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif
13
14 #include <stdio.h>
15 #include <string.h>
16 #include <pcap.h>
17
18 #include "show_if.h"
19 #include "trafshow.h"
20 #include "screen.h"
21 #include "selector.h"
22 #include "addrtoname.h"
23
24 #ifdef notdef
25 static void addr2str(const pcap_addr_t *ap, char *addr_buf, int addr_len);
26 #endif
27
28 static void
scale_size(name,addr,descr)29 scale_size(name, addr, descr)
30 int *name, *addr, *descr;
31 {
32 *name = line_factor * (double)SHOW_IF_NAME;
33 *addr = line_factor * (double)SHOW_IF_ADDR;
34 *descr = line_factor * (double)SHOW_IF_DESCR;
35 }
36
37 static int
show_if_header(dst,size,unused)38 show_if_header(dst, size, unused)
39 char *dst;
40 int size;
41 const void *unused;
42 {
43 int name_sz, addr_sz, desc_sz;
44
45 /* sanity check */
46 if (!dst || size < 1 || unused)
47 return 0;
48
49 scale_size(&name_sz, &addr_sz, &desc_sz);
50
51 snprintf(dst, size,
52 "%-*.*s %-*.*s %-*.*s",
53 name_sz, name_sz, "Interface",
54 addr_sz, addr_sz, "Address",
55 desc_sz, desc_sz, "Description");
56 return 0;
57 }
58
59 #ifdef notdef
60 /* extract list of interface addr/mask pairs */
61 static void
addr2str(ap,addr_buf,addr_len)62 addr2str(ap, addr_buf, addr_len)
63 const pcap_addr_t *ap;
64 char *addr_buf;
65 int addr_len;
66 {
67 int i, rest;
68 char *cp;
69
70 *addr_buf = '\0';
71 cp = addr_buf;
72 rest = addr_len - 1;
73 for (; ap && rest > 0; ap = ap->next) {
74 if (ap->addr) {
75 if (*addr_buf) {
76 *cp++ = ' ';
77 *cp = '\0';
78 rest--;
79 }
80 if (satoa(ap->addr, cp, rest)) {
81 i = strlen(cp);
82 cp += i;
83 rest -= i;
84 }
85 }
86 if (ap->netmask) {
87 if (*addr_buf) {
88 *cp++ = ' ';
89 *cp = '\0';
90 rest--;
91 }
92 if (satoa(ap->netmask, cp, rest)) {
93 i = strlen(cp);
94 cp += i;
95 rest -= i;
96 }
97 }
98 }
99 }
100 #endif
101
102 static int
show_if_line(dst,size,ph,idx)103 show_if_line(dst, size, ph, idx)
104 char *dst;
105 int size;
106 const PCAP_HANDLER *ph;
107 int idx;
108 {
109 int i, name_sz, addr_sz, desc_sz;
110
111 /* sanity check */
112 if (!dst || size < 1)
113 return 0;
114
115 *dst = '\0';
116 for (i = 0; ph; ph = ph->next) {
117 if (i++ == idx) break;
118 }
119 if (!ph) return 0;
120
121 scale_size(&name_sz, &addr_sz, &desc_sz);
122 snprintf(dst, size,
123 "%-*.*s %-*.*s %-*.*s",
124 name_sz, name_sz, ph->name,
125 addr_sz, addr_sz, ph->addrstr,
126 desc_sz, desc_sz, ph->descr ? ph->descr : "");
127 return 0;
128 }
129
130 static int
show_if_footer(dst,size,unused)131 show_if_footer(dst, size, unused)
132 char *dst;
133 int size;
134 const void *unused;
135 {
136 /* sanity check */
137 if (!dst || size < 1 || unused)
138 return 0;
139
140 (void)strncpy(dst, hostname, size);
141 dst[size-1] = '\0';
142 return 0;
143 }
144
145 SELECTOR *
show_if_selector()146 show_if_selector()
147 {
148 static SELECTOR *sp = 0;
149 if (!sp && (sp = selector_init()) != 0) {
150 sp->get_header = show_if_header;
151 sp->get_line = show_if_line;
152 sp->get_footer = show_if_footer;
153 }
154 return sp;
155 }
156
157 int
show_if_search(ph,str)158 show_if_search(ph, str)
159 PCAP_HANDLER *ph;
160 const char *str;
161 {
162 int idx;
163
164 /* sanity check */
165 if (!str || *str == '\0')
166 return -1;
167
168 for (idx = 0; ph; ph = ph->next, idx++) {
169 if (strstr(ph->name, str))
170 return idx;
171 if (strstr(ph->addrstr, str))
172 return idx;
173 }
174 return -1;
175 }
176
177 SELECTOR *
show_if_list(ph)178 show_if_list(ph)
179 PCAP_HANDLER *ph;
180 {
181 SELECTOR *sp;
182
183 /* sanity check */
184 if (!ph || (sp = show_if_selector()) == 0)
185 return 0;
186
187 sp->header = 0; /* unused */
188 sp->footer = 0; /* unused */
189
190 sp->list = ph;
191 sp->items = 0;
192 for (; ph; ph = ph->next)
193 sp->items++;
194
195 return sp;
196 }
197
198