From f4eea3f3cf6d47132707da194cbac3ef35be49ac Mon Sep 17 00:00:00 2001 From: correabuscar Date: Sun, 6 Nov 2022 14:36:03 +0100 Subject: [PATCH] osx: replace getnameinfo with inet_ntop this is like PR #462 for FreeBSD, and like PR #458 for Linux. --- src/osx/btop_collect.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/osx/btop_collect.cpp b/src/osx/btop_collect.cpp index 65a3f1a..08e80d0 100644 --- a/src/osx/btop_collect.cpp +++ b/src/osx/btop_collect.cpp @@ -41,6 +41,7 @@ tab-size = 4 #include #include #include +#include // for inet_ntop #include #include @@ -863,7 +864,9 @@ namespace Net { return empty_net; } int family = 0; - char ip[NI_MAXHOST]; + static_assert(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); // 46 >= 16, compile-time assurance. + enum { IPBUFFER_MAXSIZE = INET6_ADDRSTRLEN }; // manually using the known biggest value, guarded by the above static_assert + char ip[IPBUFFER_MAXSIZE]; interfaces.clear(); string ipv4, ipv6; @@ -884,16 +887,26 @@ namespace Net { } //? Get IPv4 address if (family == AF_INET) { - if (net[iface].ipv4.empty() and - getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) - net[iface].ipv4 = ip; + if (net[iface].ipv4.empty()) { + if (NULL != inet_ntop(family, &(reinterpret_cast(ifa->ifa_addr)->sin_addr), ip, IPBUFFER_MAXSIZE)) { + net[iface].ipv4 = ip; + } else { + int errsv = errno; + Logger::error("Net::collect() -> Failed to convert IPv4 to string for iface " + string(iface) + ", errno: " + strerror(errsv)); + } + } } //? Get IPv6 address else if (family == AF_INET6) { - if (net[iface].ipv6.empty() and - getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) - net[iface].ipv6 = ip; - } + if (net[iface].ipv6.empty()) { + if (NULL != inet_ntop(family, &(reinterpret_cast(ifa->ifa_addr)->sin6_addr), ip, IPBUFFER_MAXSIZE)) { + net[iface].ipv6 = ip; + } else { + int errsv = errno; + Logger::error("Net::collect() -> Failed to convert IPv6 to string for iface " + string(iface) + ", errno: " + strerror(errsv)); + } + } + } // else, ignoring family==AF_LINK (see man 3 getifaddrs) } unordered_flat_map> ifstats;