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>
diff --git a/src/cmd/auxstats/OpenBSD.c b/src/cmd/auxstats/OpenBSD.c
index f800c05..6899fc3 100644
--- a/src/cmd/auxstats/OpenBSD.c
+++ b/src/cmd/auxstats/OpenBSD.c
@@ -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 xswap(int);
 void xsysctl(int);
 void xnet(int);
-void xkvm(int);
 
 void (*statfn[])(int) =
 {
-	xkvm,
 	xapm,
 	xloadavg,
 	xcpu,
@@ -37,14 +33,6 @@
 	0
 };
 
-static kvm_t *kvm;
-
-static struct nlist nl[] = {
-	{ "_ifnet" },
-	{ "_cp_time" },
-	{ "" }
-};
-
 void
 xloadavg(int first)
 {
@@ -76,78 +64,37 @@
 		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 @@
 	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
diff --git a/src/cmd/auxstats/mkfile b/src/cmd/auxstats/mkfile
index e1771b8..818e9d3 100644
--- a/src/cmd/auxstats/mkfile
+++ b/src/cmd/auxstats/mkfile
@@ -12,6 +12,6 @@
 
 <$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