#include "pcapio.h" #include #include namespace PCAPIO{ std::string ifaddresses(pcap_if_t *d); std::string pcapio_interfaces(std::map & devmap) { std::string res; pcap_if_t *alldevs; int count = 0; char errbuf[PCAP_ERRBUF_SIZE]; if(pcap_findalldevs(&alldevs, errbuf) == -1){ res = errbuf; return res; } for(auto d = alldevs; d != NULL; d = d->next){ std::string d_name = d->name; std::string d_des = ifaddresses(d); devmap[d_name] = d_des; } pcap_freealldevs(alldevs); return res; } std::string address_print(unsigned char * v) { std::string res; char buf[1024]; int lbegin = 0, rbegin = 13; while (!v[lbegin] ) { ++lbegin; if (lbegin >=rbegin) break; } while (!v[rbegin] ) { --rbegin; if (lbegin >=rbegin) break; } res += "HEX("; for (int i =lbegin; i<=rbegin;++i) { snprintf(buf,1024,"%02X", (unsigned int)v[i]); res += buf; } res += ")"; res += "DEC("; for (int i =lbegin; i<=rbegin;++i) { if (i>lbegin) res += "."; snprintf(buf,1024,"%u", (unsigned int)v[i] ); res += buf; } res += ")"; return res; } /* Print all the available information on the given interface */ std::string ifaddresses(pcap_if_t *d) { char buf[1024]; pcap_addr_t *a; std::string res = d->name; res += "\n"; if(d->description) { res += d->description; res += "\n"; } for(a=d->addresses;a;a=a->next) { snprintf(buf,1024,"\tAF_0x%02X:",(unsigned int)a->addr->sa_family); res += buf; if (a->addr) { snprintf(buf,1024,"\n\t\tAddr:%s ",address_print((unsigned char *)a->addr->sa_data).c_str()); res += buf; } if (a->netmask) { snprintf(buf,1024,"\n\t\tMask:%s ",address_print((unsigned char *)a->addr->sa_data).c_str()); res += buf; } if (a->broadaddr) { snprintf(buf,1024,"\n\t\tCast:%s ",address_print((unsigned char *)a->addr->sa_data).c_str()); res += buf; } if (a->dstaddr) { snprintf(buf,1024,"\n\t\tDest:%s ",address_print((unsigned char *)a->addr->sa_data).c_str()); res += buf; } res += "\n"; } return res; } }