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