aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/auxstats
diff options
context:
space:
mode:
authorBakul Shah <bakul@bitblocks.com>2018-01-19 20:03:37 -0800
committerDavid du Colombier <0intro@gmail.com>2018-01-23 09:00:53 +0100
commitda8a485fc143aa323845fafcf0f0f836c76a116b (patch)
tree45eca7d8fd6b8f8ab2702a694c91524f9d43860a /src/cmd/auxstats
parent019be4481fee53a999ccb73c78e40df5f408b24e (diff)
downloadplan9port-da8a485fc143aa323845fafcf0f0f836c76a116b.tar.gz
plan9port-da8a485fc143aa323845fafcf0f0f836c76a116b.tar.bz2
plan9port-da8a485fc143aa323845fafcf0f0f836c76a116b.zip
auxstats: get network stats in a portable manner on FreeBSD
as the old grody way doesn't work any more on FreeBSD-10 and later.
Diffstat (limited to 'src/cmd/auxstats')
-rw-r--r--src/cmd/auxstats/FreeBSD.c47
1 files changed, 14 insertions, 33 deletions
diff --git a/src/cmd/auxstats/FreeBSD.c b/src/cmd/auxstats/FreeBSD.c
index a6b7a8d6..2497fe35 100644
--- a/src/cmd/auxstats/FreeBSD.c
+++ b/src/cmd/auxstats/FreeBSD.c
@@ -18,10 +18,9 @@
#include <limits.h>
#include <libc.h>
#include <bio.h>
+#include <ifaddrs.h>
#include "dat.h"
-/* XXX: #if __FreeBSD_version */
-
void xapm(int);
void xloadavg(int);
void xcpu(int);
@@ -45,7 +44,6 @@ void (*statfn[])(int) =
static kvm_t *kvm;
static struct nlist nl[] = {
- { "_ifnet" },
{ "_cp_time" },
{ "" }
};
@@ -86,45 +84,28 @@ kread(ulong addr, char *buf, int size)
void
xnet(int first)
{
+ struct ifaddrs *ifap, *ifa;
ulong out, in, outb, inb, err;
- static ulong ifnetaddr;
- ulong addr;
- struct ifnet ifnet;
- struct ifnethead ifnethead;
- char name[16];
if(first)
return;
- if(ifnetaddr == 0){
- ifnetaddr = nl[0].n_value;
- if(ifnetaddr == 0)
- return;
- }
-
- if(kread(ifnetaddr, (char*)&ifnethead, sizeof ifnethead) < 0)
+ if (getifaddrs(&ifap) != 0)
return;
out = in = outb = inb = err = 0;
- addr = (ulong)TAILQ_FIRST(&ifnethead);
- while(addr){
-#if __FreeBSD_version < 500000
- if(kread(addr, (char*)&ifnet, sizeof ifnet) < 0
- || kread((ulong)ifnet.if_name, name, 16) < 0)
- return;
-#else
- if(kread(addr, (char*)&ifnet, sizeof ifnet) < 0
- || kread((ulong)ifnet.if_dname, name, 16) < 0)
- return;
-#endif
- name[15] = 0;
- addr = (ulong)TAILQ_NEXT(&ifnet, if_link);
- out += ifnet.if_opackets;
- in += ifnet.if_ipackets;
- outb += ifnet.if_obytes;
- inb += ifnet.if_ibytes;
- err += ifnet.if_oerrors+ifnet.if_ierrors;
+#define IFA_STAT(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr->sa_family != AF_LINK)
+ continue;
+ out += IFA_STAT(opackets);
+ in += IFA_STAT(ipackets);
+ outb += IFA_STAT(obytes);
+ inb += IFA_STAT(ibytes);
+ err += IFA_STAT(oerrors) + IFA_STAT(ierrors);
}
+ freeifaddrs(ifap);
+
Bprint(&bout, "etherin %lud 1000\n", in);
Bprint(&bout, "etherout %lud 1000\n", out);
Bprint(&bout, "etherinb %lud 1000000\n", inb);