1*d56f51eaSDavid van Moolenbroek /* $NetBSD: findalldevstest.c,v 1.3 2015/03/31 21:39:43 christos Exp $ */
2*d56f51eaSDavid van Moolenbroek
3*d56f51eaSDavid van Moolenbroek #include <sys/cdefs.h>
4*d56f51eaSDavid van Moolenbroek __RCSID("$NetBSD: findalldevstest.c,v 1.3 2015/03/31 21:39:43 christos Exp $");
5*d56f51eaSDavid van Moolenbroek
6*d56f51eaSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
7*d56f51eaSDavid van Moolenbroek #include "config.h"
8*d56f51eaSDavid van Moolenbroek #endif
9*d56f51eaSDavid van Moolenbroek
10*d56f51eaSDavid van Moolenbroek #include <stdlib.h>
11*d56f51eaSDavid van Moolenbroek #include <sys/types.h>
12*d56f51eaSDavid van Moolenbroek #include <sys/socket.h>
13*d56f51eaSDavid van Moolenbroek #include <netinet/in.h>
14*d56f51eaSDavid van Moolenbroek #include <arpa/inet.h>
15*d56f51eaSDavid van Moolenbroek #include <netdb.h>
16*d56f51eaSDavid van Moolenbroek
17*d56f51eaSDavid van Moolenbroek #include <pcap.h>
18*d56f51eaSDavid van Moolenbroek
19*d56f51eaSDavid van Moolenbroek static int ifprint(pcap_if_t *d);
20*d56f51eaSDavid van Moolenbroek static char *iptos(bpf_u_int32 in);
21*d56f51eaSDavid van Moolenbroek
main(int argc,char ** argv)22*d56f51eaSDavid van Moolenbroek int main(int argc, char **argv)
23*d56f51eaSDavid van Moolenbroek {
24*d56f51eaSDavid van Moolenbroek pcap_if_t *alldevs;
25*d56f51eaSDavid van Moolenbroek pcap_if_t *d;
26*d56f51eaSDavid van Moolenbroek char *s;
27*d56f51eaSDavid van Moolenbroek bpf_u_int32 net, mask;
28*d56f51eaSDavid van Moolenbroek int exit_status = 0;
29*d56f51eaSDavid van Moolenbroek
30*d56f51eaSDavid van Moolenbroek char errbuf[PCAP_ERRBUF_SIZE+1];
31*d56f51eaSDavid van Moolenbroek if (pcap_findalldevs(&alldevs, errbuf) == -1)
32*d56f51eaSDavid van Moolenbroek {
33*d56f51eaSDavid van Moolenbroek fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
34*d56f51eaSDavid van Moolenbroek exit(1);
35*d56f51eaSDavid van Moolenbroek }
36*d56f51eaSDavid van Moolenbroek for(d=alldevs;d;d=d->next)
37*d56f51eaSDavid van Moolenbroek {
38*d56f51eaSDavid van Moolenbroek if (!ifprint(d))
39*d56f51eaSDavid van Moolenbroek exit_status = 2;
40*d56f51eaSDavid van Moolenbroek }
41*d56f51eaSDavid van Moolenbroek
42*d56f51eaSDavid van Moolenbroek if ( (s = pcap_lookupdev(errbuf)) == NULL)
43*d56f51eaSDavid van Moolenbroek {
44*d56f51eaSDavid van Moolenbroek fprintf(stderr,"Error in pcap_lookupdev: %s\n",errbuf);
45*d56f51eaSDavid van Moolenbroek exit_status = 2;
46*d56f51eaSDavid van Moolenbroek }
47*d56f51eaSDavid van Moolenbroek else
48*d56f51eaSDavid van Moolenbroek {
49*d56f51eaSDavid van Moolenbroek printf("Preferred device name: %s\n",s);
50*d56f51eaSDavid van Moolenbroek }
51*d56f51eaSDavid van Moolenbroek
52*d56f51eaSDavid van Moolenbroek if (pcap_lookupnet(s, &net, &mask, errbuf) < 0)
53*d56f51eaSDavid van Moolenbroek {
54*d56f51eaSDavid van Moolenbroek fprintf(stderr,"Error in pcap_lookupnet: %s\n",errbuf);
55*d56f51eaSDavid van Moolenbroek exit_status = 2;
56*d56f51eaSDavid van Moolenbroek }
57*d56f51eaSDavid van Moolenbroek else
58*d56f51eaSDavid van Moolenbroek {
59*d56f51eaSDavid van Moolenbroek printf("Preferred device is on network: %s/%s\n",iptos(net), iptos(mask));
60*d56f51eaSDavid van Moolenbroek }
61*d56f51eaSDavid van Moolenbroek
62*d56f51eaSDavid van Moolenbroek exit(exit_status);
63*d56f51eaSDavid van Moolenbroek }
64*d56f51eaSDavid van Moolenbroek
ifprint(pcap_if_t * d)65*d56f51eaSDavid van Moolenbroek static int ifprint(pcap_if_t *d)
66*d56f51eaSDavid van Moolenbroek {
67*d56f51eaSDavid van Moolenbroek pcap_addr_t *a;
68*d56f51eaSDavid van Moolenbroek #ifdef INET6
69*d56f51eaSDavid van Moolenbroek char ntop_buf[INET6_ADDRSTRLEN];
70*d56f51eaSDavid van Moolenbroek #endif
71*d56f51eaSDavid van Moolenbroek int status = 1; /* success */
72*d56f51eaSDavid van Moolenbroek
73*d56f51eaSDavid van Moolenbroek printf("%s\n",d->name);
74*d56f51eaSDavid van Moolenbroek if (d->description)
75*d56f51eaSDavid van Moolenbroek printf("\tDescription: %s\n",d->description);
76*d56f51eaSDavid van Moolenbroek printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
77*d56f51eaSDavid van Moolenbroek
78*d56f51eaSDavid van Moolenbroek for(a=d->addresses;a;a=a->next) {
79*d56f51eaSDavid van Moolenbroek if (a->addr != NULL)
80*d56f51eaSDavid van Moolenbroek switch(a->addr->sa_family) {
81*d56f51eaSDavid van Moolenbroek case AF_INET:
82*d56f51eaSDavid van Moolenbroek printf("\tAddress Family: AF_INET\n");
83*d56f51eaSDavid van Moolenbroek if (a->addr)
84*d56f51eaSDavid van Moolenbroek printf("\t\tAddress: %s\n",
85*d56f51eaSDavid van Moolenbroek inet_ntoa(((struct sockaddr_in *)(a->addr))->sin_addr));
86*d56f51eaSDavid van Moolenbroek if (a->netmask)
87*d56f51eaSDavid van Moolenbroek printf("\t\tNetmask: %s\n",
88*d56f51eaSDavid van Moolenbroek inet_ntoa(((struct sockaddr_in *)(a->netmask))->sin_addr));
89*d56f51eaSDavid van Moolenbroek if (a->broadaddr)
90*d56f51eaSDavid van Moolenbroek printf("\t\tBroadcast Address: %s\n",
91*d56f51eaSDavid van Moolenbroek inet_ntoa(((struct sockaddr_in *)(a->broadaddr))->sin_addr));
92*d56f51eaSDavid van Moolenbroek if (a->dstaddr)
93*d56f51eaSDavid van Moolenbroek printf("\t\tDestination Address: %s\n",
94*d56f51eaSDavid van Moolenbroek inet_ntoa(((struct sockaddr_in *)(a->dstaddr))->sin_addr));
95*d56f51eaSDavid van Moolenbroek break;
96*d56f51eaSDavid van Moolenbroek #ifdef INET6
97*d56f51eaSDavid van Moolenbroek case AF_INET6:
98*d56f51eaSDavid van Moolenbroek printf("\tAddress Family: AF_INET6\n");
99*d56f51eaSDavid van Moolenbroek if (a->addr)
100*d56f51eaSDavid van Moolenbroek printf("\t\tAddress: %s\n",
101*d56f51eaSDavid van Moolenbroek inet_ntop(AF_INET6,
102*d56f51eaSDavid van Moolenbroek ((struct sockaddr_in6 *)(a->addr))->sin6_addr.s6_addr,
103*d56f51eaSDavid van Moolenbroek ntop_buf, sizeof ntop_buf));
104*d56f51eaSDavid van Moolenbroek if (a->netmask)
105*d56f51eaSDavid van Moolenbroek printf("\t\tNetmask: %s\n",
106*d56f51eaSDavid van Moolenbroek inet_ntop(AF_INET6,
107*d56f51eaSDavid van Moolenbroek ((struct sockaddr_in6 *)(a->netmask))->sin6_addr.s6_addr,
108*d56f51eaSDavid van Moolenbroek ntop_buf, sizeof ntop_buf));
109*d56f51eaSDavid van Moolenbroek if (a->broadaddr)
110*d56f51eaSDavid van Moolenbroek printf("\t\tBroadcast Address: %s\n",
111*d56f51eaSDavid van Moolenbroek inet_ntop(AF_INET6,
112*d56f51eaSDavid van Moolenbroek ((struct sockaddr_in6 *)(a->broadaddr))->sin6_addr.s6_addr,
113*d56f51eaSDavid van Moolenbroek ntop_buf, sizeof ntop_buf));
114*d56f51eaSDavid van Moolenbroek if (a->dstaddr)
115*d56f51eaSDavid van Moolenbroek printf("\t\tDestination Address: %s\n",
116*d56f51eaSDavid van Moolenbroek inet_ntop(AF_INET6,
117*d56f51eaSDavid van Moolenbroek ((struct sockaddr_in6 *)(a->dstaddr))->sin6_addr.s6_addr,
118*d56f51eaSDavid van Moolenbroek ntop_buf, sizeof ntop_buf));
119*d56f51eaSDavid van Moolenbroek break;
120*d56f51eaSDavid van Moolenbroek #endif
121*d56f51eaSDavid van Moolenbroek default:
122*d56f51eaSDavid van Moolenbroek printf("\tAddress Family: Unknown (%d)\n", a->addr->sa_family);
123*d56f51eaSDavid van Moolenbroek break;
124*d56f51eaSDavid van Moolenbroek }
125*d56f51eaSDavid van Moolenbroek else
126*d56f51eaSDavid van Moolenbroek {
127*d56f51eaSDavid van Moolenbroek fprintf(stderr, "\tWarning: a->addr is NULL, skipping this address.\n");
128*d56f51eaSDavid van Moolenbroek status = 0;
129*d56f51eaSDavid van Moolenbroek }
130*d56f51eaSDavid van Moolenbroek }
131*d56f51eaSDavid van Moolenbroek printf("\n");
132*d56f51eaSDavid van Moolenbroek return status;
133*d56f51eaSDavid van Moolenbroek }
134*d56f51eaSDavid van Moolenbroek
135*d56f51eaSDavid van Moolenbroek /* From tcptraceroute */
136*d56f51eaSDavid van Moolenbroek #define IPTOSBUFFERS 12
iptos(bpf_u_int32 in)137*d56f51eaSDavid van Moolenbroek static char *iptos(bpf_u_int32 in)
138*d56f51eaSDavid van Moolenbroek {
139*d56f51eaSDavid van Moolenbroek static char output[IPTOSBUFFERS][3*4+3+1];
140*d56f51eaSDavid van Moolenbroek static short which;
141*d56f51eaSDavid van Moolenbroek u_char *p;
142*d56f51eaSDavid van Moolenbroek
143*d56f51eaSDavid van Moolenbroek p = (u_char *)∈
144*d56f51eaSDavid van Moolenbroek which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
145*d56f51eaSDavid van Moolenbroek sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
146*d56f51eaSDavid van Moolenbroek return output[which];
147*d56f51eaSDavid van Moolenbroek }
148