mirror of
https://github.com/aristocratos/btop.git
synced 2024-05-19 20:03:00 +12:00
Merge pull request #459 from correabuscar/fbsd_use_first_IP_of_interface_instead_of_last
FreeBSD: use the first IP of the interface
This commit is contained in:
commit
f7dbf50b75
|
@ -19,9 +19,10 @@ tab-size = 4
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <ifaddrs.h>
|
|
||||||
#include <libproc.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 <net/if.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
#include <net/if_dl.h>
|
#include <net/if_dl.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
@ -829,22 +830,30 @@ namespace Net {
|
||||||
if (ifa->ifa_addr == NULL) continue;
|
if (ifa->ifa_addr == NULL) continue;
|
||||||
family = ifa->ifa_addr->sa_family;
|
family = ifa->ifa_addr->sa_family;
|
||||||
const auto &iface = ifa->ifa_name;
|
const auto &iface = ifa->ifa_name;
|
||||||
//? Get IPv4 address
|
|
||||||
if (family == AF_INET) {
|
|
||||||
if (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)
|
|
||||||
// net[iface].ipv6 = ip;
|
|
||||||
// }
|
|
||||||
|
|
||||||
//? Update available interfaces vector and get status of interface
|
//? Update available interfaces vector and get status of interface
|
||||||
if (not v_contains(interfaces, iface)) {
|
if (not v_contains(interfaces, iface)) {
|
||||||
interfaces.push_back(iface);
|
interfaces.push_back(iface);
|
||||||
net[iface].connected = (ifa->ifa_flags & IFF_RUNNING);
|
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 (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 (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;
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unordered_flat_map<string, std::tuple<uint64_t, uint64_t>> ifstats;
|
unordered_flat_map<string, std::tuple<uint64_t, uint64_t>> ifstats;
|
||||||
|
|
Loading…
Reference in a new issue