2
0

node_state_interfaces_apple.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "diagnostic/node_state_interfaces_apple.hpp"
  2. #include <CoreFoundation/CoreFoundation.h>
  3. #include <SystemConfiguration/SystemConfiguration.h>
  4. #include <ifaddrs.h>
  5. #include <net/if.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <cstring>
  9. #include <vector>
  10. void addNodeStateInterfacesJson(nlohmann::json& j) {
  11. try {
  12. std::vector<nlohmann::json> interfaces_json;
  13. CFArrayRef interfaces = SCNetworkInterfaceCopyAll();
  14. CFIndex size = CFArrayGetCount(interfaces);
  15. for(CFIndex i = 0; i < size; ++i) {
  16. SCNetworkInterfaceRef iface = (SCNetworkInterfaceRef)CFArrayGetValueAtIndex(interfaces, i);
  17. char stringBuffer[512] = {};
  18. CFStringRef tmp = SCNetworkInterfaceGetBSDName(iface);
  19. CFStringGetCString(tmp,stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  20. std::string ifName(stringBuffer);
  21. int mtuCur, mtuMin, mtuMax;
  22. SCNetworkInterfaceCopyMTU(iface, &mtuCur, &mtuMin, &mtuMax);
  23. nlohmann::json iface_json;
  24. iface_json["name"] = ifName;
  25. iface_json["mtu"] = mtuCur;
  26. tmp = SCNetworkInterfaceGetHardwareAddressString(iface);
  27. CFStringGetCString(tmp, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  28. iface_json["mac"] = stringBuffer;
  29. tmp = SCNetworkInterfaceGetInterfaceType(iface);
  30. CFStringGetCString(tmp, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
  31. iface_json["type"] = stringBuffer;
  32. std::vector<std::string> addresses;
  33. struct ifaddrs *ifap, *ifa;
  34. void *addr;
  35. getifaddrs(&ifap);
  36. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  37. if (strcmp(ifName.c_str(), ifa->ifa_name) == 0) {
  38. if (ifa->ifa_addr->sa_family == AF_INET) {
  39. struct sockaddr_in *ipv4 = (struct sockaddr_in*)ifa->ifa_addr;
  40. addr = &ipv4->sin_addr;
  41. } else if (ifa->ifa_addr->sa_family == AF_INET6) {
  42. struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)ifa->ifa_addr;
  43. addr = &ipv6->sin6_addr;
  44. } else {
  45. continue;
  46. }
  47. inet_ntop(ifa->ifa_addr->sa_family, addr, stringBuffer, sizeof(stringBuffer));
  48. addresses.push_back(stringBuffer);
  49. }
  50. }
  51. iface_json["addresses"] = addresses;
  52. interfaces_json.push_back(iface_json);
  53. }
  54. j["network_interfaces"] = interfaces_json;
  55. } catch (const std::exception& e) {
  56. j["network_interfaces"] = std::string("Exception: ") + e.what();
  57. } catch (...) {
  58. j["network_interfaces"] = "Unknown error retrieving interfaces";
  59. }
  60. }