tnetspeed: use getifaddrs on OpenBSD... - spoon - dwm status utility (2f30 fork)
 (HTM) git clone git://src.adamsgaard.dk/spoon
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 774975c0a33418ee74e7f215aa82c671334f514e
 (DIR) parent 8829486d5587ca59a8609dcd865acb5e84a8dbcf
 (HTM) 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:
         M netspeed.c                          |      47 ++++++++++++-------------------
       
       1 file changed, 18 insertions(+), 29 deletions(-)
       ---
 (DIR) diff --git a/netspeed.c b/netspeed.c
       t@@ -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;
        }