Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.