summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob P. Liljenberg <admin@qvantnet.com>2022-11-06 15:24:30 +0100
committerGitHub <noreply@github.com>2022-11-06 15:24:30 +0100
commit9dc57534b1856df8fe88fd5e92596fb3c3c960ac (patch)
treec25853c00d7c38a4177368fee6a1662d99f7add3
parent25123644f00f4d828c4d63ff6a6fd5c5fbd101f8 (diff)
parentf4eea3f3cf6d47132707da194cbac3ef35be49ac (diff)
Merge pull request #464 from correabuscar/osx_replace__getnameinfo__with__inet_ntop
osx: replace getnameinfo with inet_ntop
-rw-r--r--src/osx/btop_collect.cpp29
1 files 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 <sys/statvfs.h>
#include <sys/sysctl.h>
#include <sys/types.h>
+#include <netinet/in.h> // for inet_ntop
#include <unistd.h>
#include <stdexcept>
@@ -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<struct sockaddr_in*>(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<struct sockaddr_in6*>(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<string, std::tuple<uint64_t, uint64_t>> ifstats;