- fixed totally bogus rates

- tweaked bar graph scale
- added basic kb handler
- split out sent/recv lines
This commit is contained in:
pdw
2002-03-25 22:35:38 +00:00
parent 067ad4dc6a
commit 513f146b57
4 changed files with 245 additions and 37 deletions

196
Makefile
View File

@@ -43,3 +43,199 @@ nodepend:
rm -f depend
# DO NOT DELETE
addr_hash.o: addr_hash.h hash.h iftop.h /usr/include/alloca.h
addr_hash.o: /usr/include/arpa/inet.h /usr/include/asm/socket.h
addr_hash.o: /usr/include/asm/sockios.h /usr/include/bits/byteswap.h
addr_hash.o: /usr/include/bits/endian.h /usr/include/bits/in.h
addr_hash.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h
addr_hash.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
addr_hash.o: /usr/include/bits/sockaddr.h /usr/include/bits/socket.h
addr_hash.o: /usr/include/bits/stdio_lim.h /usr/include/bits/time.h
addr_hash.o: /usr/include/bits/types.h /usr/include/bits/uio.h
addr_hash.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h
addr_hash.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h
addr_hash.o: /usr/include/endian.h /usr/include/features.h
addr_hash.o: /usr/include/_G_config.h /usr/include/gconv.h
addr_hash.o: /usr/include/gnu/stubs.h /usr/include/libio.h
addr_hash.o: /usr/include/netinet/in.h /usr/include/stdint.h
addr_hash.o: /usr/include/stdio.h /usr/include/stdlib.h
addr_hash.o: /usr/include/sys/cdefs.h /usr/include/sys/select.h
addr_hash.o: /usr/include/sys/socket.h /usr/include/sys/sysmacros.h
addr_hash.o: /usr/include/sys/types.h /usr/include/sys/uio.h
addr_hash.o: /usr/include/time.h /usr/include/wchar.h /usr/include/xlocale.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/limits.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/syslimits.h
hash.o: hash.h iftop.h /usr/include/alloca.h /usr/include/bits/endian.h
hash.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h
hash.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
hash.o: /usr/include/bits/stdio_lim.h /usr/include/bits/time.h
hash.o: /usr/include/bits/types.h /usr/include/bits/waitflags.h
hash.o: /usr/include/bits/waitstatus.h /usr/include/bits/wchar.h
hash.o: /usr/include/endian.h /usr/include/features.h /usr/include/_G_config.h
hash.o: /usr/include/gconv.h /usr/include/gnu/stubs.h /usr/include/libio.h
hash.o: /usr/include/stdio.h /usr/include/stdlib.h /usr/include/sys/cdefs.h
hash.o: /usr/include/sys/select.h /usr/include/sys/sysmacros.h
hash.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/wchar.h
hash.o: /usr/include/xlocale.h
hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
iftop.o: addr_hash.h hash.h iftop.h resolver.h ui.h /usr/include/alloca.h
iftop.o: /usr/include/arpa/inet.h /usr/include/asm/sigcontext.h
iftop.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h
iftop.o: /usr/include/bits/byteswap.h /usr/include/bits/confname.h
iftop.o: /usr/include/bits/endian.h /usr/include/bits/environments.h
iftop.o: /usr/include/bits/in.h /usr/include/bits/initspin.h
iftop.o: /usr/include/bits/posix_opt.h /usr/include/bits/pthreadtypes.h
iftop.o: /usr/include/bits/sched.h /usr/include/bits/select.h
iftop.o: /usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h
iftop.o: /usr/include/bits/siginfo.h /usr/include/bits/signum.h
iftop.o: /usr/include/bits/sigset.h /usr/include/bits/sigstack.h
iftop.o: /usr/include/bits/sigthread.h /usr/include/bits/sockaddr.h
iftop.o: /usr/include/bits/socket.h /usr/include/bits/stdio_lim.h
iftop.o: /usr/include/bits/time.h /usr/include/bits/types.h
iftop.o: /usr/include/bits/uio.h /usr/include/bits/waitflags.h
iftop.o: /usr/include/bits/waitstatus.h /usr/include/bits/wchar.h
iftop.o: /usr/include/bits/wordsize.h /usr/include/curses.h
iftop.o: /usr/include/endian.h /usr/include/features.h
iftop.o: /usr/include/_G_config.h /usr/include/gconv.h /usr/include/getopt.h
iftop.o: /usr/include/gnu/stubs.h /usr/include/libio.h
iftop.o: /usr/include/linux/if_ether.h /usr/include/ncurses/curses.h
iftop.o: /usr/include/ncurses/unctrl.h /usr/include/net/ethernet.h
iftop.o: /usr/include/netinet/in.h /usr/include/netinet/ip.h
iftop.o: /usr/include/pthread.h /usr/include/sched.h /usr/include/signal.h
iftop.o: /usr/include/stdint.h /usr/include/stdio.h /usr/include/stdlib.h
iftop.o: /usr/include/string.h /usr/include/sys/cdefs.h
iftop.o: /usr/include/sys/select.h /usr/include/sys/socket.h
iftop.o: /usr/include/sys/sysmacros.h /usr/include/sys/time.h
iftop.o: /usr/include/sys/types.h /usr/include/sys/ucontext.h
iftop.o: /usr/include/sys/uio.h /usr/include/time.h /usr/include/ucontext.h
iftop.o: /usr/include/unistd.h /usr/include/wchar.h /usr/include/xlocale.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/limits.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/syslimits.h
iftop.o: /usr/local/include/net/bpf.h /usr/local/include/pcap.h
ns_hash.o: hash.h iftop.h ns_hash.h /usr/include/alloca.h
ns_hash.o: /usr/include/arpa/inet.h /usr/include/asm/socket.h
ns_hash.o: /usr/include/asm/sockios.h /usr/include/bits/byteswap.h
ns_hash.o: /usr/include/bits/endian.h /usr/include/bits/in.h
ns_hash.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h
ns_hash.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
ns_hash.o: /usr/include/bits/sockaddr.h /usr/include/bits/socket.h
ns_hash.o: /usr/include/bits/stdio_lim.h /usr/include/bits/time.h
ns_hash.o: /usr/include/bits/types.h /usr/include/bits/uio.h
ns_hash.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h
ns_hash.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h
ns_hash.o: /usr/include/endian.h /usr/include/features.h
ns_hash.o: /usr/include/_G_config.h /usr/include/gconv.h
ns_hash.o: /usr/include/gnu/stubs.h /usr/include/libio.h
ns_hash.o: /usr/include/netinet/in.h /usr/include/stdint.h
ns_hash.o: /usr/include/stdio.h /usr/include/stdlib.h /usr/include/sys/cdefs.h
ns_hash.o: /usr/include/sys/select.h /usr/include/sys/socket.h
ns_hash.o: /usr/include/sys/sysmacros.h /usr/include/sys/types.h
ns_hash.o: /usr/include/sys/uio.h /usr/include/time.h /usr/include/wchar.h
ns_hash.o: /usr/include/xlocale.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/limits.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/syslimits.h
resolver.o: hash.h iftop.h ns_hash.h /usr/include/alloca.h
resolver.o: /usr/include/arpa/inet.h /usr/include/asm/errno.h
resolver.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h
resolver.o: /usr/include/bits/byteswap.h /usr/include/bits/endian.h
resolver.o: /usr/include/bits/errno.h /usr/include/bits/in.h
resolver.o: /usr/include/bits/initspin.h /usr/include/bits/netdb.h
resolver.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h
resolver.o: /usr/include/bits/select.h /usr/include/bits/siginfo.h
resolver.o: /usr/include/bits/sigset.h /usr/include/bits/sigthread.h
resolver.o: /usr/include/bits/sockaddr.h /usr/include/bits/socket.h
resolver.o: /usr/include/bits/stdio_lim.h /usr/include/bits/time.h
resolver.o: /usr/include/bits/types.h /usr/include/bits/uio.h
resolver.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h
resolver.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h
resolver.o: /usr/include/endian.h /usr/include/errno.h /usr/include/features.h
resolver.o: /usr/include/_G_config.h /usr/include/gconv.h
resolver.o: /usr/include/gnu/stubs.h /usr/include/libio.h
resolver.o: /usr/include/linux/errno.h /usr/include/netdb.h
resolver.o: /usr/include/netinet/in.h /usr/include/pthread.h
resolver.o: /usr/include/rpc/netdb.h /usr/include/sched.h
resolver.o: /usr/include/signal.h /usr/include/stdint.h /usr/include/stdio.h
resolver.o: /usr/include/stdlib.h /usr/include/string.h
resolver.o: /usr/include/sys/cdefs.h /usr/include/sys/select.h
resolver.o: /usr/include/sys/socket.h /usr/include/sys/sysmacros.h
resolver.o: /usr/include/sys/types.h /usr/include/sys/uio.h
resolver.o: /usr/include/time.h /usr/include/wchar.h /usr/include/xlocale.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/limits.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/syslimits.h
sorted_list.o: iftop.h sorted_list.h /usr/include/alloca.h
sorted_list.o: /usr/include/bits/endian.h /usr/include/bits/pthreadtypes.h
sorted_list.o: /usr/include/bits/sched.h /usr/include/bits/select.h
sorted_list.o: /usr/include/bits/sigset.h /usr/include/bits/stdio_lim.h
sorted_list.o: /usr/include/bits/time.h /usr/include/bits/types.h
sorted_list.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h
sorted_list.o: /usr/include/bits/wchar.h /usr/include/endian.h
sorted_list.o: /usr/include/features.h /usr/include/_G_config.h
sorted_list.o: /usr/include/gconv.h /usr/include/gnu/stubs.h
sorted_list.o: /usr/include/libio.h /usr/include/stdio.h /usr/include/stdlib.h
sorted_list.o: /usr/include/sys/cdefs.h /usr/include/sys/select.h
sorted_list.o: /usr/include/sys/sysmacros.h /usr/include/sys/types.h
sorted_list.o: /usr/include/time.h /usr/include/wchar.h /usr/include/xlocale.h
sorted_list.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
sorted_list.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
ui.o: addr_hash.h hash.h iftop.h resolver.h sorted_list.h
ui.o: /usr/include/alloca.h /usr/include/arpa/inet.h
ui.o: /usr/include/asm/sigcontext.h /usr/include/asm/socket.h
ui.o: /usr/include/asm/sockios.h /usr/include/bits/byteswap.h
ui.o: /usr/include/bits/endian.h /usr/include/bits/huge_val.h
ui.o: /usr/include/bits/in.h /usr/include/bits/initspin.h
ui.o: /usr/include/bits/mathcalls.h /usr/include/bits/mathdef.h
ui.o: /usr/include/bits/nan.h /usr/include/bits/pthreadtypes.h
ui.o: /usr/include/bits/sched.h /usr/include/bits/select.h
ui.o: /usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h
ui.o: /usr/include/bits/siginfo.h /usr/include/bits/signum.h
ui.o: /usr/include/bits/sigset.h /usr/include/bits/sigstack.h
ui.o: /usr/include/bits/sigthread.h /usr/include/bits/sockaddr.h
ui.o: /usr/include/bits/socket.h /usr/include/bits/stdio_lim.h
ui.o: /usr/include/bits/time.h /usr/include/bits/types.h
ui.o: /usr/include/bits/uio.h /usr/include/bits/waitflags.h
ui.o: /usr/include/bits/waitstatus.h /usr/include/bits/wchar.h
ui.o: /usr/include/bits/wordsize.h /usr/include/curses.h /usr/include/endian.h
ui.o: /usr/include/features.h /usr/include/_G_config.h /usr/include/gconv.h
ui.o: /usr/include/gnu/stubs.h /usr/include/libio.h /usr/include/math.h
ui.o: /usr/include/ncurses/curses.h /usr/include/ncurses/unctrl.h
ui.o: /usr/include/netinet/in.h /usr/include/pthread.h /usr/include/sched.h
ui.o: /usr/include/signal.h /usr/include/stdint.h /usr/include/stdio.h
ui.o: /usr/include/stdlib.h /usr/include/string.h /usr/include/sys/cdefs.h
ui.o: /usr/include/sys/select.h /usr/include/sys/socket.h
ui.o: /usr/include/sys/sysmacros.h /usr/include/sys/types.h
ui.o: /usr/include/sys/ucontext.h /usr/include/sys/uio.h /usr/include/time.h
ui.o: /usr/include/ucontext.h /usr/include/wchar.h /usr/include/xlocale.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/limits.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/syslimits.h
util.o: iftop.h /usr/include/alloca.h /usr/include/asm/errno.h
util.o: /usr/include/bits/confname.h /usr/include/bits/endian.h
util.o: /usr/include/bits/environments.h /usr/include/bits/errno.h
util.o: /usr/include/bits/posix_opt.h /usr/include/bits/pthreadtypes.h
util.o: /usr/include/bits/sched.h /usr/include/bits/select.h
util.o: /usr/include/bits/sigset.h /usr/include/bits/stdio_lim.h
util.o: /usr/include/bits/time.h /usr/include/bits/types.h
util.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h
util.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h
util.o: /usr/include/endian.h /usr/include/errno.h /usr/include/features.h
util.o: /usr/include/_G_config.h /usr/include/gconv.h /usr/include/getopt.h
util.o: /usr/include/gnu/stubs.h /usr/include/libio.h
util.o: /usr/include/linux/errno.h /usr/include/stdio.h /usr/include/stdlib.h
util.o: /usr/include/string.h /usr/include/sys/cdefs.h
util.o: /usr/include/sys/select.h /usr/include/sys/sysmacros.h
util.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/unistd.h
util.o: /usr/include/wchar.h /usr/include/xlocale.h
util.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdarg.h
util.o: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.h

View File

@@ -127,7 +127,6 @@ static void handle_packet(char* args, const struct pcap_pkthdr* pkthdr,const cha
}
}
fflush(stdout);
}
/*

View File

@@ -6,9 +6,9 @@
#ifndef __IFTOP_H_ /* include guard */
#define __IFTOP_H_
/* 5 * 60 / 3 */
#define HISTORY_LENGTH 100
#define RESOLUTION 3
/* 60 / 3 */
#define HISTORY_LENGTH 20
#define RESOLUTION 1
typedef struct {
long recv[HISTORY_LENGTH];

79
ui.c
View File

@@ -19,7 +19,8 @@
#define HISTORY_DIVISIONS 3
int history_divs[HISTORY_DIVISIONS] = {3, 20, 40};
/* 3, 15 and 60 seconds */
int history_divs[HISTORY_DIVISIONS] = {1, 5, 20};
typedef struct host_pair_line_tag {
@@ -41,12 +42,12 @@ int screen_line_compare(void* a, void* b) {
return(aa->recv[0] + aa->sent[0] < bb->recv[0] + bb->sent[0]);
}
void readable_size(float n, char* buf, int bsize) {
if(n >= 102400) {
snprintf(buf, bsize, " %4.1fM", n / (1024 * 1024));
void readable_size(float n, char* buf, int bsize, int ksize) {
if(n >= 100000) {
snprintf(buf, bsize, " %4.1fM", n / (ksize * ksize));
}
else if(n >= 1024) {
snprintf(buf, bsize, " %4.1fK", n / 1024);
else if(n >= 1000) {
snprintf(buf, bsize, " %4.1fK", n / ksize);
}
else {
snprintf(buf, bsize, " %4.0fb", n );
@@ -55,14 +56,14 @@ void readable_size(float n, char* buf, int bsize) {
/* Maximum and minimum rate which we plot on the bar chart. */
static int min_rate = 1; /* 1 byte/s */
static int max_rate = (10000000 / 8); /* 10 Mbit/s */
static int max_rate = (10000000); /* 10 Mbit/s */
static int get_bar_length(const int rate) {
float l;
if (rate <= 0)
return 0;
l = (log(rate) - log(min_rate)) / (log(max_rate) - log(min_rate));
return l * COLS;
return (l * COLS);
}
static void draw_bar_scale(void) {
@@ -72,7 +73,7 @@ static void draw_bar_scale(void) {
for (i = min_rate; i <= max_rate; i *= 10) {
char s[40], *p;
int x;
readable_size(i, s, sizeof s);
readable_size(i, s, sizeof s, 1000);
p = s + strspn(s, " ");
x = get_bar_length(i);
mvaddch(1, x, ACS_BTEE);
@@ -100,7 +101,8 @@ void ui_print() {
screen_list.compare = &screen_line_compare;
sorted_list_initialise(&screen_list);
erase();
clear();
//erase();
draw_bar_scale();
while(hash_next_item(history, &n) == HASH_STATUS_OK) {
@@ -133,41 +135,52 @@ void ui_print() {
int x = 0, j, L, t;
host_pair_line* screen_line = (host_pair_line*)nn->data;
if(history_len < history_divs[j]) {
t = history_len * RESOLUTION;
} else {
t = history_divs[j] * RESOLUTION;
L = (COLS - 8 * HISTORY_DIVISIONS - 4) / 2;
if(L > sizeof hostname) {
L = sizeof hostname;
}
L = COLS - 12 * HISTORY_DIVISIONS;
resolve(&screen_line->ap->src, hostname, HOSTNAME_LENGTH);
sprintf(line, "%s", hostname);
resolve(&screen_line->ap->src, hostname, L);
sprintf(line, "%-*s", L, hostname);
mvaddstr(y, x, line);
x += L / 2 - 2;
x += L;
resolve(&screen_line->ap->dst, hostname, HOSTNAME_LENGTH);
sprintf(line, " => %*s", L / 2 - 2, hostname);
mvaddstr(y, x, " => ");
mvaddstr(y+1, x, " <= ");
x += 4;
resolve(&screen_line->ap->dst, hostname, L);
sprintf(line, "%-*s", L, hostname);
mvaddstr(y, x, line);
x = L;
x += L;
for(j = 0; j < HISTORY_DIVISIONS; j++) {
readable_size(screen_line->sent[j] / t, line, 10);
if(history_len < history_divs[j]) {
t = history_len * RESOLUTION;
} else {
t = history_divs[j] * RESOLUTION;
}
readable_size(8 * screen_line->sent[j] / t, line, 10, 1024);
mvaddstr(y, x, line);
x += strlen(line);
readable_size(screen_line->recv[j] / t, line, 10);
mvaddstr(y, x, line);
x += strlen(line);
readable_size(8 * screen_line->recv[j] / t, line, 10, 1024);
mvaddstr(y+1, x, line);
x += 8;
}
/* Do some sort of primitive bar graph thing. */
mvchgat(y, 0, -1, A_NORMAL, 0, NULL);
L = get_bar_length(screen_line->recv[0] / t);
L = get_bar_length(8 * screen_line->sent[0] / history_divs[0]);
if (L > 0)
mvchgat(y, 0, L, A_REVERSE, 0, NULL);
mvchgat(y+1, 0, -1, A_NORMAL, 0, NULL);
L = get_bar_length(8 * screen_line->recv[0] / history_divs[0]);
if (L > 0)
mvchgat(y+1, 0, L, A_REVERSE, 0, NULL);
y++;
y+=2;
free(screen_line);
}
refresh();
@@ -185,17 +198,17 @@ void ui_loop() {
(void) nonl(); /* tell curses not to do NL->CR/NL on output */
(void) cbreak(); /* take input chars one at a time, no wait for \n */
(void) noecho(); /* don't echo input */
halfdelay(2);
erase();
pthread_mutex_init(&tick_wait_mutex, NULL);
pthread_cond_init(&tick_wait_cond, NULL);
while(foad == 0) {
struct timespec t;
t.tv_sec = time(NULL) + 1;
if(getch() == 'q') {
foad = 1;
pthread_cond_timedwait(&tick_wait_cond, &tick_wait_mutex, &t);
//fprintf(stderr,"timeout tick\n");
}
tick();
}
}