dump_interfaces_linux.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "diagnostic/dump_interfaces.hpp"
  2. #include <sys/types.h>
  3. #include <ifaddrs.h>
  4. #include <net/if.h>
  5. #include <sys/ioctl.h>
  6. #include <arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <sys/socket.h>
  11. #include <sstream>
  12. void dumpInterfaces(std::stringstream& dump) {
  13. int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  14. struct ifconf ifc;
  15. char buf[1024];
  16. ifc.ifc_len = sizeof(buf);
  17. ifc.ifc_buf = buf;
  18. ioctl(sock, SIOCGIFCONF, &ifc);
  19. struct ifreq *it = ifc.ifc_req;
  20. const struct ifreq * const end = it + (ifc.ifc_len / sizeof(struct ifreq));
  21. for(; it != end; ++it) {
  22. struct ifreq ifr;
  23. strcpy(ifr.ifr_name, it->ifr_name);
  24. if(ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
  25. if (!(ifr.ifr_flags & IFF_LOOPBACK)) { // skip loopback
  26. dump << "Interface: " << ifr.ifr_name << "\n";
  27. if (ioctl(sock, SIOCGIFMTU, &ifr) == 0) {
  28. dump << "MTU: " << ifr.ifr_mtu << "\n";
  29. }
  30. if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
  31. unsigned char mac_addr[6];
  32. memcpy(mac_addr, ifr.ifr_hwaddr.sa_data, 6);
  33. char macStr[18];
  34. sprintf(macStr, "%02x:%02x:%02x:%02x:%02x:%02x",
  35. mac_addr[0],
  36. mac_addr[1],
  37. mac_addr[2],
  38. mac_addr[3],
  39. mac_addr[4],
  40. mac_addr[5]);
  41. dump << "MAC: " << macStr << "\n";
  42. }
  43. dump << "Addresses:" << "\n";
  44. struct ifaddrs *ifap, *ifa;
  45. void *addr;
  46. getifaddrs(&ifap);
  47. for(ifa = ifap; ifa; ifa = ifa->ifa_next) {
  48. if(strcmp(ifr.ifr_name, ifa->ifa_name) == 0 && ifa->ifa_addr != NULL) {
  49. char stringBuffer[128];
  50. if (ifa->ifa_addr->sa_family == AF_INET) {
  51. struct sockaddr_in *ipv4 = (struct sockaddr_in*)ifa->ifa_addr;
  52. addr = &ipv4->sin_addr;
  53. } else if (ifa->ifa_addr->sa_family == AF_INET6) {
  54. struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)ifa->ifa_addr;
  55. addr = &ipv6->sin6_addr;
  56. } else {
  57. continue;
  58. }
  59. inet_ntop(ifa->ifa_addr->sa_family, addr, stringBuffer, sizeof(stringBuffer));
  60. dump << stringBuffer << "\n";
  61. }
  62. }
  63. dump << "\n";
  64. }
  65. }
  66. }
  67. close(sock);
  68. }