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 *)∈ 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