summaryrefslogtreecommitdiff
path: root/ifstat.c
diff options
context:
space:
mode:
Diffstat (limited to 'ifstat.c')
-rw-r--r--ifstat.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/ifstat.c b/ifstat.c
index 2566e8d..488609d 100644
--- a/ifstat.c
+++ b/ifstat.c
@@ -22,46 +22,52 @@
#include <kvm.h>
#include <nlist.h>
#include <limits.h>
-#include <err.h>
+// #include <err.h>
#include "main.h"
kvm_t *kvmd = NULL;
void *ifhead;
+void *addr = NULL;
-int if_init(void) {
- char *vmunix = NULL, *core = NULL;
+int if_init(char *ifname) {
+ char *vmunix = NULL;
+ char *core = NULL;
char errbuf[_POSIX2_LINE_MAX];
+ struct ifnet ifnet;
+
struct nlist nl[] = { { "_ifnet" }, { NULL } };
kvmd = kvm_openfiles(vmunix, core, NULL, O_RDONLY, errbuf);
if (kvmd == NULL)
- errx(1,"%s", errbuf);
+ error(errbuf);
if ((kvm_nlist(kvmd, nl)) == -1)
- errx(1, "%s", kvm_geterr(kvmd));
+ error(kvm_geterr(kvmd));
if (kvm_read(kvmd, nl->n_value, &ifhead, sizeof(nl->n_value)) != sizeof(nl->n_value))
- errx(1, "%s", kvm_geterr(kvmd));
+ error(kvm_geterr(kvmd));
+
+ for (; ifhead != NULL; ifhead = (struct ifnet *)ifnet.if_list.tqe_next) {
+ if (kvm_read(kvmd, (unsigned long)ifhead, &ifnet, sizeof(ifnet)) != sizeof(ifnet))
+ error(kvm_geterr(kvmd));
+ if (strncmp(ifnet.if_xname, ifname, strlen(ifname)) == NULL)
+ addr = ifhead;
+ }
+
+ if (addr == NULL)
+ error("interface not found");
}
-int if_stat(char *ifname) {
+int if_stat(void) {
struct ifnet ifnet;
- void *addr;
-
- addr = ifhead;
- for (; addr != NULL; addr = (struct ifnet *)ifnet.if_list.tqe_next) {
- if (kvm_read(kvmd, (unsigned long)addr, &ifnet, sizeof(ifnet)) != sizeof(ifnet))
- errx(1, "%s", kvm_geterr(kvmd));
- if (strncmp(ifnet.if_xname, ifname, strlen(ifname)) == NULL) {
- curr.ib = ifnet.if_ibytes;
- curr.ob = ifnet.if_obytes;
- }
- }
+ if (kvm_read(kvmd, (unsigned long)addr, &ifnet, sizeof(ifnet)) != sizeof(ifnet))
+ error(kvm_geterr(kvmd));
+ curr.ib = ifnet.if_ibytes;
+ curr.ob = ifnet.if_obytes;
}
int if_fini(void) {
kvm_close(kvmd);
- exit(0);
}