summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2004-02-11 21:33:06 +0000
committerDimitri Sokolyuk <demon@dim13.org>2004-02-11 21:33:06 +0000
commit0f1d6a7b687909c94a81957171e876814a716462 (patch)
tree4b3118e094684c931deb2c818978428497c91dd5
parentf3e058c1f07df9174241c9ddf47b553b5f806978 (diff)
optimize if_stat()
-rw-r--r--ifstat.c44
-rw-r--r--main.c27
-rw-r--r--main.h9
-rw-r--r--output.c6
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 <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);
}
diff --git a/main.c b/main.c
index a72caff..91377f1 100644
--- a/main.c
+++ b/main.c
@@ -19,28 +19,45 @@
#include <curses.h>
#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 <curses.h>
// #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();