| 35 | R"((^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.1[6-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.2[0-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.3[0-1]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$))"); |
| 36 | |
| 37 | std::vector<NetworkInterface> NetworkHelper::GetLocalNetInterfaces() { |
| 38 | std::vector<NetworkInterface> result{}; |
| 39 | #ifdef WINDOWS |
| 40 | ULONG bufferSize = 0; |
| 41 | GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS, nullptr, nullptr, &bufferSize); |
| 42 | std::vector<BYTE> buffer(bufferSize); |
| 43 | auto adapterAddresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data()); |
| 44 | if(GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS, nullptr, adapterAddresses, &bufferSize)) |
| 45 | return {}; |
| 46 | |
| 47 | for(PIP_ADAPTER_ADDRESSES adapter = adapterAddresses; adapter; adapter = adapter->Next) { |
| 48 | if(adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK || adapter->OperStatus != IfOperStatusUp) |
| 49 | continue; |
| 50 | |
| 51 | char macBuffer[18]{}; |
| 52 | snprintf(macBuffer, sizeof(macBuffer), "%02X:%02X:%02X:%02X:%02X:%02X", adapter->PhysicalAddress[0], adapter->PhysicalAddress[1], |
| 53 | adapter->PhysicalAddress[2], adapter->PhysicalAddress[3], adapter->PhysicalAddress[4], adapter->PhysicalAddress[5]); |
| 54 | auto ifName = std::wstring(adapter->FriendlyName); |
| 55 | auto macAddr = std::string(macBuffer); |
| 56 | |
| 57 | auto netIf = NetworkInterface(); |
| 58 | netIf.ifName = StringUtils::FromWideString(ifName); |
| 59 | netIf.macAddress = macAddr; |
| 60 | for(PIP_ADAPTER_UNICAST_ADDRESS unicast = adapter->FirstUnicastAddress; unicast; unicast = unicast->Next) { |
| 61 | auto family = unicast->Address.lpSockaddr->sa_family; |
| 62 | if(family != AF_INET) |
| 63 | continue; |
| 64 | auto ipv4 = reinterpret_cast<SOCKADDR_IN *>(unicast->Address.lpSockaddr); |
| 65 | char strBuffer[INET_ADDRSTRLEN]{}; |
| 66 | inet_ntop(AF_INET, &(ipv4->sin_addr), strBuffer, INET_ADDRSTRLEN); |
| 67 | auto ifAddr = std::string(strBuffer); |
| 68 | netIf.ipAddress = ifAddr; |
| 69 | } |
| 70 | for(PIP_ADAPTER_GATEWAY_ADDRESS gateway = adapter->FirstGatewayAddress; gateway; gateway = gateway->Next) { |
| 71 | auto family = gateway->Address.lpSockaddr->sa_family; |
| 72 | if(family != AF_INET) |
| 73 | continue; |
| 74 | auto ipv4 = reinterpret_cast<SOCKADDR_IN *>(gateway->Address.lpSockaddr); |
| 75 | char strBuffer[INET_ADDRSTRLEN]{}; |
| 76 | inet_ntop(AF_INET, &(ipv4->sin_addr), strBuffer, INET_ADDRSTRLEN); |
| 77 | auto ifAddr = std::string(strBuffer); |
| 78 | netIf.gateway = ifAddr; |
| 79 | } |
| 80 | if(!netIf.ipAddress.empty()) |
| 81 | result.emplace_back(netIf); |
| 82 | } |
| 83 | #elif defined(LINUX) || defined(APPLE) |
| 84 | struct ifaddrs *ifaddr{}; |
| 85 | if(getifaddrs(&ifaddr)) |
| 86 | return {}; |
| 87 | |
| 88 | std::map<std::string, NetworkInterface> ifMap{}; |
| 89 | for(auto ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { |
| 90 | if(ifa->ifa_addr == nullptr || ifa->ifa_flags & IFF_LOOPBACK || !(ifa->ifa_flags & IFF_UP)) |
| 91 | continue; |
| 92 | int family = ifa->ifa_addr->sa_family; |
| 93 | if(family == AF_INET || family == AF_PACKET) { |
| 94 | char addr[NI_MAXHOST]{}; |
nothing calls this directly
no test coverage detected