1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_CONFIG_H
2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "config.h"
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdlib.h>
6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/socket.h>
8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <netinet/in.h>
9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <arpa/inet.h>
10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <netdb.h>
11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap.h>
13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic void ifprint(pcap_if_t *d);
15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char *iptos(bpf_u_int32 in);
16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint main(int argc, char **argv)
18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pcap_if_t *alldevs;
20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pcap_if_t *d;
21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  char *s;
22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  bpf_u_int32 net, mask;
23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  char errbuf[PCAP_ERRBUF_SIZE+1];
25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pcap_findalldevs(&alldevs, errbuf) == -1)
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    exit(1);
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  for(d=alldevs;d;d=d->next)
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    ifprint(d);
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if ( (s = pcap_lookupdev(errbuf)) == NULL)
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf(stderr,"Error in pcap_lookupdev: %s\n",errbuf);
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  else
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf("Preferred device name: %s\n",s);
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (pcap_lookupnet(s, &net, &mask, errbuf) < 0)
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    fprintf(stderr,"Error in pcap_lookupnet: %s\n",errbuf);
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  else
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  {
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf("Preferred device is on network: %s/%s\n",iptos(net), iptos(mask));
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  exit(0);
54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic void ifprint(pcap_if_t *d)
57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  pcap_addr_t *a;
59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef INET6
60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  char ntop_buf[INET6_ADDRSTRLEN];
61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  printf("%s\n",d->name);
64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  if (d->description)
65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    printf("\tDescription: %s\n",d->description);
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  for(a=d->addresses;a;a=a->next) {
69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    switch(a->addr->sa_family)
70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    {
71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      case AF_INET:
72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        printf("\tAddress Family: AF_INET\n");
73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->addr)
74511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tAddress: %s\n",
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntoa(((struct sockaddr_in *)(a->addr))->sin_addr));
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->netmask)
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tNetmask: %s\n",
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntoa(((struct sockaddr_in *)(a->netmask))->sin_addr));
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->broadaddr)
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tBroadcast Address: %s\n",
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntoa(((struct sockaddr_in *)(a->broadaddr))->sin_addr));
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->dstaddr)
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tDestination Address: %s\n",
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntoa(((struct sockaddr_in *)(a->dstaddr))->sin_addr));
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        break;
86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef INET6
87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      case AF_INET6:
88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        printf("\tAddress Family: AF_INET6\n");
89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->addr)
90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tAddress: %s\n",
91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntop(AF_INET6,
92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               ((struct sockaddr_in6 *)(a->addr))->sin6_addr.s6_addr,
93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               ntop_buf, sizeof ntop_buf));
94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->netmask)
95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tNetmask: %s\n",
96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntop(AF_INET6,
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              ((struct sockaddr_in6 *)(a->netmask))->sin6_addr.s6_addr,
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               ntop_buf, sizeof ntop_buf));
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->broadaddr)
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tBroadcast Address: %s\n",
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntop(AF_INET6,
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              ((struct sockaddr_in6 *)(a->broadaddr))->sin6_addr.s6_addr,
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               ntop_buf, sizeof ntop_buf));
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        if (a->dstaddr)
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall          printf("\t\tDestination Address: %s\n",
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall            inet_ntop(AF_INET6,
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall              ((struct sockaddr_in6 *)(a->dstaddr))->sin6_addr.s6_addr,
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               ntop_buf, sizeof ntop_buf));
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        break;
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall      default:
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        printf("\tAddress Family: Unknown (%d)\n", a->addr->sa_family);
113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall        break;
114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    }
115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  }
116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  printf("\n");
117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* From tcptraceroute */
120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define IPTOSBUFFERS	12
121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char *iptos(bpf_u_int32 in)
122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	static char output[IPTOSBUFFERS][3*4+3+1];
124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	static short which;
125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	u_char *p;
126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
127511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p = (u_char *)&in;
128511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
129511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return output[which];
131511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
132