spoon

set dwm status
git clone git://git.2f30.org/spoon.git
Log | Files | Refs | LICENSE

commit 774975c0a33418ee74e7f215aa82c671334f514e
parent 8829486d5587ca59a8609dcd865acb5e84a8dbcf
Author: Lucas <lucas@sexy.is>
Date:   Tue, 16 Jul 2019 11:25:11 +0000

netspeed: use getifaddrs on OpenBSD...

instead of hand-rolled, low-level route messages.

Diffstat:
Mnetspeed.c | 47++++++++++++++++++-----------------------------
1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/netspeed.c b/netspeed.c @@ -41,48 +41,37 @@ updatenetspeed(char *buf, size_t len, uint64_t rxbytes, uint64_t txbytes) #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; }