dump_interfaces_apple.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "diagnostic/dump_interfaces.hpp"
  2. #include <CoreFoundation/CoreFoundation.h>
  3. #include <SystemConfiguration/SystemConfiguration.h>
  4. #include <ifaddrs.h>
  5. #include <net/if.h>
  6. #include <arpa/inet.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <string.h>
  10. void dumpInterfaces(std::stringstream& dump) {
  11. CFArrayRef interfaces = SCNetworkInterfaceCopyAll();
  12. CFIndex size = CFArrayGetCount(interfaces);
  13. for(CFIndex i = 0; i < size; ++i) {
  14. SCNetworkInterfaceRef iface = (SCNetworkInterfaceRef)CFArrayGetValueAtIndex(interfaces, i);
  15. dump << "Interface " << i << "\n-----------\n";
  16. CFStringRef tmp = SCNetworkInterfaceGetBSDName(iface);
  17. char stringBuffer[512] = {};
  18. CFStringGetCString(tmp,stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  19. dump << "Name: " << stringBuffer << "\n";
  20. std::string ifName(stringBuffer);
  21. int mtuCur, mtuMin, mtuMax;
  22. SCNetworkInterfaceCopyMTU(iface, &mtuCur, &mtuMin, &mtuMax);
  23. dump << "MTU: " << mtuCur << "\n";
  24. tmp = SCNetworkInterfaceGetHardwareAddressString(iface);
  25. CFStringGetCString(tmp, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  26. dump << "MAC: " << stringBuffer << "\n";
  27. tmp = SCNetworkInterfaceGetInterfaceType(iface);
  28. CFStringGetCString(tmp, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  29. dump << "Type: " << stringBuffer << "\n";
  30. dump << "Addresses:" << "\n";
  31. struct ifaddrs *ifap, *ifa;
  32. void *addr;
  33. getifaddrs(&ifap);
  34. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  35. if (strcmp(ifName.c_str(), ifa->ifa_name) == 0) {
  36. if (ifa->ifa_addr->sa_family == AF_INET) {
  37. struct sockaddr_in *ipv4 = (struct sockaddr_in*)ifa->ifa_addr;
  38. addr = &ipv4->sin_addr;
  39. } else if (ifa->ifa_addr->sa_family == AF_INET6) {
  40. struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)ifa->ifa_addr;
  41. addr = &ipv6->sin6_addr;
  42. } else {
  43. continue;
  44. }
  45. inet_ntop(ifa->ifa_addr->sa_family, addr, stringBuffer, sizeof(stringBuffer));
  46. dump << stringBuffer << "\n";
  47. }
  48. }
  49. dump << "\n";
  50. }
  51. }