summaryrefslogtreecommitdiffstats
path: root/src/freebsd
diff options
context:
space:
mode:
Diffstat (limited to 'src/freebsd')
-rw-r--r--src/freebsd/btop_collect.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/freebsd/btop_collect.cpp b/src/freebsd/btop_collect.cpp
index c0d5163..f6d51b2 100644
--- a/src/freebsd/btop_collect.cpp
+++ b/src/freebsd/btop_collect.cpp
@@ -19,9 +19,10 @@ tab-size = 4
#include <cstdio>
#include <cstdlib>
#include <cstring>
-#include <ifaddrs.h>
#include <libproc.h>
+// man 3 getifaddrs: "BUGS: If both <net/if.h> and <ifaddrs.h> are being included, <net/if.h> must be included before <ifaddrs.h>"
#include <net/if.h>
+#include <ifaddrs.h>
#include <net/if_dl.h>
#include <net/route.h>
#include <netdb.h>
@@ -829,22 +830,30 @@ namespace Net {
if (ifa->ifa_addr == NULL) continue;
family = ifa->ifa_addr->sa_family;
const auto &iface = ifa->ifa_name;
+ //? Update available interfaces vector and get status of interface
+ if (not v_contains(interfaces, iface)) {
+ interfaces.push_back(iface);
+ net[iface].connected = (ifa->ifa_flags & IFF_RUNNING);
+
+ // An interface can have more than one IP of the same family associated with it,
+ // but we pick only the first one to show in the NET box.
+ // Note: Interfaces without any IPv4 and IPv6 set are still valid and monitorable!
+ net[iface].ipv4.clear();
+ net[iface].ipv6.clear();
+ }
//? Get IPv4 address
if (family == AF_INET) {
- if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
+ if (net[iface].ipv4.empty() and
+ getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
net[iface].ipv4 = ip;
}
//? Get IPv6 address
// else if (family == AF_INET6) {
- // if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
+ // 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;
// }
- //? Update available interfaces vector and get status of interface
- if (not v_contains(interfaces, iface)) {
- interfaces.push_back(iface);
- net[iface].connected = (ifa->ifa_flags & IFF_RUNNING);
- }
}
unordered_flat_map<string, std::tuple<uint64_t, uint64_t>> ifstats;