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>
This commit is contained in:
Gleydson Soares 2015-12-07 08:32:05 -03:00 committed by Russ Cox
parent 6a93bd5c92
commit 009b0cb5eb
2 changed files with 26 additions and 77 deletions

View file

@ -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>
@ -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)
return;
if(ifnetaddr == 0){
ifnetaddr = nl[0].n_value;
if(ifnetaddr == 0)
return;
}
if(kread(ifnetaddr, (char*)&ifnethead, sizeof ifnethead) < 0)
if (first)
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;
if (getifaddrs(&ifap) == -1)
return;
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

View file

@ -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