commit 009b0cb5eb340b8bc3268bfaeb86abfeffdc1b1c from: Gleydson Soares via: Russ Cox date: Tue Dec 08 16:41:13 2015 UTC 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 commit - 6a93bd5c92bd2954314f492f10bbcac2c3416da0 commit + 009b0cb5eb340b8bc3268bfaeb86abfeffdc1b1c blob - f800c05c37b244b55346762e53079afba450c143 blob + 6899fc315f9494b9f5dcee57774c4de9cb84b16f --- src/cmd/auxstats/OpenBSD.c +++ src/cmd/auxstats/OpenBSD.c @@ -1,14 +1,12 @@ #include -#include -#include #include #include #include #include +#include #include #include #include -#include #include #include #include @@ -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, @@ -37,14 +33,6 @@ void (*statfn[])(int) = 0 }; -static kvm_t *kvm; - -static struct nlist nl[] = { - { "_ifnet" }, - { "_cp_time" }, - { "" } -}; - void xloadavg(int first) { @@ -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); @@ -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 blob - e1771b803d725f4eba4f79ca42426c7bc5a43c80 blob + 818e9d3967263d8a95b2fe9a00db04bc02fbb1c3 --- src/cmd/auxstats/mkfile +++ src/cmd/auxstats/mkfile @@ -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