tnetspeed: use getifaddrs on OpenBSD... - spoon - dwm status utility (2f30 fork) | |
git clone git://src.adamsgaard.dk/spoon | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 774975c0a33418ee74e7f215aa82c671334f514e | |
parent 8829486d5587ca59a8609dcd865acb5e84a8dbcf | |
Author: Lucas <[email protected]> | |
Date: Tue, 16 Jul 2019 11:25:11 +0000 | |
netspeed: use getifaddrs on OpenBSD... | |
instead of hand-rolled, low-level route messages. | |
Diffstat: | |
M netspeed.c | 47 ++++++++++++-----------------… | |
1 file changed, 18 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/netspeed.c b/netspeed.c | |
t@@ -41,48 +41,37 @@ updatenetspeed(char *buf, size_t len, uint64_t rxbytes, ui… | |
#ifdef __OpenBSD__ | |
#include <sys/socket.h> | |
-#include <net/if.h> | |
-#include <net/if_dl.h> | |
-#include <net/route.h> | |
-#include <sys/sysctl.h> | |
+#include <sys/types.h> | |
+#include <net/if.h> /* struct if_data */ | |
+#include <ifaddrs.h> | |
int | |
netspeedread(void *arg, char *buf, size_t len) | |
{ | |
- int mib[6] = { CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0 }; | |
- char *ifname = arg; | |
- struct rt_msghdr *rtm; | |
- struct if_msghdr *ifm; | |
- struct sockaddr_dl *sdl; | |
- void *lim, *next, *rtmraw; | |
+ char *ifa_name = arg; | |
+ struct if_data *ifa_data; | |
+ struct ifaddrs *ifa, *ifap; | |
uint64_t rxbytes, txbytes; | |
- size_t sz; | |
- if (sysctl(mib, 6, NULL, &sz, NULL, 0) < 0) | |
- return -1; | |
- if (!(rtmraw = malloc(sz))) | |
- return -1; | |
- if (sysctl(mib, 6, rtmraw, &sz, NULL, 0) < 0) { | |
- free(rtmraw); | |
+ if (getifaddrs(&ifap) == -1) { | |
+ warn("getifaddrs"); | |
return -1; | |
} | |
- lim = rtmraw + sz; | |
+ | |
rxbytes = txbytes = 0; | |
- for (next = rtmraw; next < lim; next += rtm->rtm_msglen) { | |
- rtm = (struct rt_msghdr *)next; | |
- if (rtm->rtm_version != RTM_VERSION || rtm->rtm_type | |
- != RTM_IFINFO) | |
+ | |
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { | |
+ if (strcmp(ifa_name, ifa->ifa_name) != 0) | |
continue; | |
- ifm = (struct if_msghdr *)next; | |
- sdl = (struct sockaddr_dl *)(next + ifm->ifm_hdrlen); | |
- if (sdl->sdl_family != AF_LINK | |
- || strncmp(ifname, sdl->sdl_data, sdl->sdl_nlen) != 0) | |
+ if (ifa->ifa_data == NULL) | |
continue; | |
- rxbytes = ifm->ifm_data.ifi_ibytes; | |
- txbytes = ifm->ifm_data.ifi_obytes; | |
+ ifa_data = ifa->ifa_data; | |
+ rxbytes += ifa_data->ifi_ibytes; | |
+ txbytes += ifa_data->ifi_obytes; | |
} | |
+ | |
updatenetspeed(buf, len, rxbytes, txbytes); | |
- free(rtmraw); | |
+ freeifaddrs(ifap); | |
return 0; | |
} |