tauxstats: fix OpenBSD by using getifaddrs(3) instead of kvm(3) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 009b0cb5eb340b8bc3268bfaeb86abfeffdc1b1c
 (DIR) parent 6a93bd5c92bd2954314f492f10bbcac2c3416da0
 (HTM) Author: Gleydson Soares <gsoares@gmail.com>
       Date:   Mon,  7 Dec 2015 08:32:05 -0300
       
       auxstats: fix OpenBSD by using getifaddrs(3) instead of kvm(3)
       
       Change-Id: I6a096ba24809a402911c30406d384d16c03fc96c
       Reviewed-on: https://plan9port-review.googlesource.com/1410
       Reviewed-by: Russ Cox <rsc@swtch.com>
       
       Diffstat:
         M src/cmd/auxstats/OpenBSD.c          |      97 ++++++++-----------------------
         M src/cmd/auxstats/mkfile             |       2 +-
       
       2 files changed, 24 insertions(+), 75 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/auxstats/OpenBSD.c b/src/cmd/auxstats/OpenBSD.c
       t@@ -1,14 +1,12 @@
        #include <u.h>
       -#include <kvm.h>
       -#include <nlist.h>
        #include <sys/types.h>
        #include <sys/param.h>
        #include <sys/sched.h>
        #include <sys/socket.h>
       +#include <ifaddrs.h>
        #include <sys/sysctl.h>
        #include <sys/time.h>
        #include <net/if.h>
       -#include <net/if_var.h>
        #include <machine/apmvar.h>
        #include <sys/ioctl.h>
        #include <uvm/uvm_param.h>
       t@@ -24,11 +22,9 @@ void xcpu(int);
        void xswap(int);
        void xsysctl(int);
        void xnet(int);
       -void xkvm(int);
        
        void (*statfn[])(int) =
        {
       -        xkvm,
                xapm,
                xloadavg,
                xcpu,
       t@@ -37,14 +33,6 @@ void (*statfn[])(int) =
                0
        };
        
       -static kvm_t *kvm;
       -
       -static struct nlist nl[] = {
       -        { "_ifnet" },
       -        { "_cp_time" },
       -        { "" }
       -};
       -
        void
        xloadavg(int first)
        {
       t@@ -76,78 +64,37 @@ xapm(int first)
                        Bprint(&bout, "battery =%d 100\n", ai.battery_life);
        }
        
       -
       -void
       -kvminit(void)
       -{
       -        char buf[_POSIX2_LINE_MAX];
       -
       -        if(kvm)
       -                return;
       -        kvm = kvm_openfiles(nil, nil, nil, O_RDONLY, buf);
       -        if(kvm == nil) {
       -                fprint(2, "kvm open error\n%s", buf);
       -                return;
       -        }
       -        if(kvm_nlist(kvm, nl) < 0 || nl[0].n_type == 0){
       -                kvm = nil;
       -                return;
       -        }
       -}
       -
       -void
       -xkvm(int first)
       -{
       -        if(first)
       -                kvminit();
       -}
       -
       -int
       -kread(ulong addr, char *buf, int size)
       -{
       -        if(kvm_read(kvm, addr, buf, size) != size){
       -                memset(buf, 0, size);
       -                return -1;
       -        }
       -        return size;
       -}
       -
        void
        xnet(int first)
        {
                ulong out, in, outb, inb, err;
       -        static ulong ifnetaddr;
       -        ulong addr;
       -        struct ifnet ifnet;
       -        struct ifnet_head ifnethead;
       -        char name[16];
       +        struct ifaddrs *ifa, *ifap;
       +        struct if_data *ifd = NULL;
        
       -        if(first)
       +        if (first)
                        return;
        
       -        if(ifnetaddr == 0){
       -                ifnetaddr = nl[0].n_value;
       -                if(ifnetaddr == 0)
       -                        return;
       -        }
       +        out = in = outb = inb = err = 0;
        
       -        if(kread(ifnetaddr, (char*)&ifnethead, sizeof ifnethead) < 0)
       +        if (getifaddrs(&ifap) == -1)
                        return;
        
       -        out = in = outb = inb = err = 0;
       -        addr = (ulong)TAILQ_FIRST(&ifnethead);
       -        while(addr){
       -                if(kread(addr, (char*)&ifnet, sizeof ifnet) < 0
       -                || kread((ulong)ifnet.if_xname, name, 16) < 0)
       -                        return;
       -                name[15] = 0;
       -                addr = (ulong)TAILQ_NEXT(&ifnet, if_list);
       -                out += ifnet.if_opackets;
       -                in += ifnet.if_ipackets;
       -                outb += ifnet.if_obytes;
       -                inb += ifnet.if_ibytes;
       -                err += ifnet.if_oerrors+ifnet.if_ierrors;
       +        for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
       +                if (ifa->ifa_addr == NULL ||
       +                    ifa->ifa_addr->sa_family != AF_LINK)
       +                        continue;
       +
       +                ifd = ifa->ifa_data;
       +
       +                if (ifd != NULL) {
       +                        out += ifd->ifi_opackets;
       +                        in += ifd->ifi_ipackets;
       +                        outb += ifd->ifi_obytes;
       +                        inb += ifd->ifi_ibytes;
       +                        err += ifd->ifi_ierrors;
       +                }
                }
       +
                Bprint(&bout, "etherin %lud 1000\n", in);
                Bprint(&bout, "etherout %lud 1000\n", out);
                Bprint(&bout, "etherinb %lud 1000000\n", inb);
       t@@ -155,6 +102,8 @@ xnet(int first)
                Bprint(&bout, "ethererr %lud 1000\n", err);
                Bprint(&bout, "ether %lud 1000\n", in+out);
                Bprint(&bout, "etherb %lud 1000000\n", inb+outb);
       +
       +        freeifaddrs(ifap);
        }
        
        void
 (DIR) diff --git a/src/cmd/auxstats/mkfile b/src/cmd/auxstats/mkfile
       t@@ -12,6 +12,6 @@ HFILES=\
        
        <$PLAN9/src/mkone
        
       -KVM=`{if uname |egrep 'BSD' >/dev/null; then echo -lkvm; fi}
       +KVM=`{if uname |egrep 'BSD' | egrep -v 'OpenBSD' >/dev/null; then echo -lkvm; fi}
        LDFLAGS=$LDFLAGS $KVM