////////////////////////////////////////////////////////////////////// // PPPTraf 1.0. (C) DiSKiLLeR, 9/2/2000. (diskiller@cnbinc.com) // // // // This program is distributed under the terms of the GNU License. // // Please refer to the file README and COPYING. // ////////////////////////////////////////////////////////////////////// /* * I must say. This is the file i am most displeased with, and can * do with the most work. Ah well, next version. - diskiller */ #include #include #include #include "data.h" #include "bpf.h" #define VERSION "1.0" void ntoascii(unsigned long n, char *str); #define COLOR_BACKGRND 9 #define COLOR_TITLEBAR 10 #define COLOR_STATUSBAR 11 #define COLOR_TEXT 12 static WINDOW *main; static WINDOW *list; int interface_init() { char line[81]; main = initscr(); start_color(); cbreak(); noecho(); halfdelay(10); list = newpad(100, 78); // 100 from data.h keypad(list, TRUE); keypad(main, TRUE); init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); init_pair(COLOR_BACKGRND, COLOR_WHITE, COLOR_BLUE); init_pair(COLOR_TITLEBAR, COLOR_WHITE, COLOR_CYAN); init_pair(COLOR_STATUSBAR, COLOR_WHITE, COLOR_CYAN); init_pair(COLOR_TEXT, COLOR_WHITE, COLOR_BLUE); wbkgd(main, ' ' | COLOR_PAIR(COLOR_BACKGRND)); wbkgd(list, ' ' | COLOR_PAIR(COLOR_BACKGRND)); // Title Bar //// wattron(main, COLOR_PAIR(COLOR_STATUSBAR) | A_BOLD); sprintf(line, " PPPTraf v%s ", VERSION); mvwaddstr(main, 0, 0, line); // Status Bar //// wattron(main, COLOR_PAIR(COLOR_STATUSBAR) | A_BOLD); mvwaddstr(main, 24, 0, " Shift+Q = Quit Shift+R = Reset (C) diskiller@cnbinc.com, 25/1/2000 "); // Heading //// wattron(main, COLOR_PAIR(COLOR_TEXT)); mvwaddstr(main, 02, 0, " IP Host Bytes in Bytes out "); // Lines //// wattron(main, COLOR_PAIR(COLOR_TEXT)); mvwaddstr(main, 03, 1, "------------------------------------------------------------------------------"); mvwaddstr(main, 20, 1, "------------------------------------------------------------------------------"); // Bottom stuff //// wattron(main, COLOR_PAIR(COLOR_TEXT)); mvwaddstr(main, 21, 0, " Total"); mvwaddstr(main, 22, 0, " Dropped"); refresh(); return; } int interface_loop(struct ahost *hostlist) { int p=0; // when scrolling, this is the list position. int n=0; // index into loop int l=0; // length of list. (not 100, but the number of items on there). int c; // keyboard character unsigned long total_in = 0; unsigned long total_out = 0; unsigned long n_dropped; char bytesin[20]; char bytesout[20]; char dropped[20]; for(;;) { l=0; total_in=0; total_out=0; for(n=0 ; n<=99 ; n++) { wattron(main, COLOR_PAIR(COLOR_TEXT) | A_BOLD); total_in += hostlist[n].in; total_out += hostlist[n].out; ntoascii(hostlist[n].in, bytesin); ntoascii(hostlist[n].out, bytesout); // end of list. Special handling. if(hostlist[n].ip[0] == '\0') { mvwaddstr(list, n, 1, "Other"); mvwaddstr(list, n, 19, "-"); mvwaddstr(list, n, 37, bytesin); mvwaddstr(list, n, 59, bytesout); break; } else { mvwaddstr(list, n, 1, hostlist[n].ip); mvwaddstr(list, n, 19, hostlist[n].host); mvwaddstr(list, n, 37, bytesin); mvwaddstr(list, n, 59, bytesout); l++; } } // Totals ntoascii(total_in, bytesin); ntoascii(total_out, bytesout); mvwaddstr(main, 21, 38, bytesin); mvwaddstr(main, 21, 60, bytesout); n_dropped = bpf_dropped(); ntoascii(n_dropped, dropped); mvwaddstr(main, 22, 38, dropped); //refresh(); prefresh(list, p, 0, 4, 1, 19, 78); // Leave FBSD cursor somewhere nice // (like off the bottom of the fucking screen! urgh, ugly block) move(26,0); //c = wgetch(list); c = getch(); if(c == KEY_UP) if(p>=0) p--; if(c == KEY_DOWN) if(p<= (l-16)) p++; if(c == 'R') data_reset(); if(c == 'Q') { endwin(); return; } } } void ntoascii(unsigned long n, char *str) { int bytes; int kbytes; int mbytes; int gbytes; //printf("%d = ", n); if(n >= 1000000000) { gbytes = n / 1000000000; n = n % 1000000000; mbytes = n / 1000000; n = n % 1000000; kbytes = n / 1000; bytes = n % 1000; sprintf(str, "%3d,%.3d,%.3d,%.3d\n", gbytes, mbytes, kbytes, bytes); return; } if(n >= 1000000) { mbytes = n / 1000000; n = n % 1000000; kbytes = n / 1000; bytes = n % 1000; sprintf(str, "%7d,%.3d,%.3d\n", mbytes, kbytes, bytes); return; } if(n >= 1000) { kbytes = n / 1000; bytes = n % 1000; sprintf(str, "%11d,%.3d\n", kbytes, bytes); return; } if(n < 1000) { sprintf(str, "%15d\n", n); return; } }