From 0f1d6a7b687909c94a81957171e876814a716462 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 11 Feb 2004 21:33:06 +0000 Subject: optimize if_stat() --- ifstat.c | 44 +++++++++++++++++++++++++------------------- main.c | 27 ++++++++++++++++++++++----- main.h | 9 ++++++--- output.c | 6 +++--- 4 files changed, 56 insertions(+), 30 deletions(-) diff --git a/ifstat.c b/ifstat.c index 2566e8d..488609d 100644 --- a/ifstat.c +++ b/ifstat.c @@ -22,46 +22,52 @@ #include #include #include -#include +// #include #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); } diff --git a/main.c b/main.c index a72caff..91377f1 100644 --- a/main.c +++ b/main.c @@ -19,28 +19,45 @@ #include #include "main.h" +// extern char *__progname; + int main(int argc, char **argv) { struct stat last; struct stat diff; + char *arg; + + if(argv[1]) + arg = argv[1]; + else + exit(2); initscr(); - if_init(); - if_stat(argv[1]?argv[1]:"xl0"); + +// if_init(argv[1]?argv[1]:"xl0"); + if_init(arg); + if_stat(); last.ib = curr.ib; last.ob = curr.ob; while(1) { - if_stat(argv[1]?argv[1]:"xl0"); + if_stat(); diff.ib = curr.ib - last.ib; diff.ob = curr.ob - last.ob; - curses_print(diff.ib, diff.ob); + out(diff.ib, diff.ob); last.ib = curr.ib; last.ob = curr.ob; - sleep(1); + usleep(1000 * 1000); }; if_fini(); endwin(); exit(0); } + +int error(char *message) { + (void)fprintf(stderr, "%s: %s\n", __progname, message); + if_fini(); + endwin(); + exit(1); +} diff --git a/main.h b/main.h index a519942..085f8da 100644 --- a/main.h +++ b/main.h @@ -18,8 +18,10 @@ #define kB 1024 #define MB (kB*1024) -int if_init(void); -int if_stat(char *); +extern char *__progname; + +int if_init(char *); +int if_stat(void); int if_fini(void); struct stat { @@ -29,4 +31,5 @@ struct stat { struct stat curr; -int curses_print(long long, long long); +int out(long long, long long); +int error(char *); \ No newline at end of file diff --git a/output.c b/output.c index 7f37c3a..e767e2f 100644 --- a/output.c +++ b/output.c @@ -18,9 +18,9 @@ #include // #include "main.h" -int curses_print(long long ib, long long ob) { -// move(0,0); - clear(); +int out(long long ib, long long ob) { + move(0,0); +// clear(); printw("I: %ld\n", ib); printw("O: %ld\n", ob); refresh(); -- cgit v1.2.3