diff --git a/Makefile b/Makefile index bc16cac..2089d48 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/iftop.c b/iftop.c index dd62885..513131c 100644 --- a/iftop.c +++ b/iftop.c @@ -127,7 +127,6 @@ static void handle_packet(char* args, const struct pcap_pkthdr* pkthdr,const cha } } - fflush(stdout); } /* diff --git a/iftop.h b/iftop.h index abec209..342a282 100644 --- a/iftop.h +++ b/iftop.h @@ -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]; diff --git a/ui.c b/ui.c index c159384..aefab5e 100644 --- a/ui.c +++ b/ui.c @@ -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(); } }