Commit 0be11c0e authored by pdw's avatar pdw

Added popup status messages.

parent e1c4cb7a
......@@ -43,7 +43,6 @@ CFLAGS += -DUSE_GETHOSTBYADDR_R
# Uncomment if you are using libresolv.
#
#LDLIBS += -lresolv # or /usr/lib/libresolv.a on Linux?
#
# Uncomment if you are using ares.
#
......
......@@ -54,6 +54,7 @@ static void finish(int sig) {
/* Only need ethernet and IP headers (48) + first 2 bytes of tcp/udp header */
#define CAPTURE_LENGTH 68
......@@ -112,8 +113,8 @@ void tick(int print) {
history_rotate();
last_timestamp = t;
}
else if(print) {
ui_print();
else {
ui_tick(print);
}
pthread_mutex_unlock(&tick_mutex);
......
......@@ -44,6 +44,9 @@ int tail;
#if defined(USE_GETHOSTBYADDR_R)
/**
* Implementation of do_resolve for platforms with working gethostbyaddr_r
*
* Some implementations of libc choose to implement gethostbyaddr_r as
* a non thread-safe wrapper to gethostbyaddr. An interesting choice...
*/
char* do_resolve(struct in_addr * addr) {
struct hostent hostbuf, *hp;
......@@ -102,7 +105,8 @@ char *do_resolve(struct in_addr *addr) {
#include <resolv.h>
/**
* libresolv implementation
* libresolv implementation
* resolver functions may not be thread safe
*/
char* do_resolve(struct in_addr * addr) {
char msg[PACKETSZ];
......
......@@ -24,6 +24,8 @@
#define HISTORY_DIVISIONS 3
#define BARGRAPH_INTERVAL 1 /* which division used for bars. */
#define HELP_TIME 2
#define HELP_MESSAGE \
"Host display:\n"\
" r - toggle DNS host resolution \n"\
......@@ -71,7 +73,10 @@ sorted_list_type screen_list;
host_pair_line totals;
int peaksent, peakrecv, peaktotal;
#define HELP_MSG_SIZE 80
int showhelphint = 0;
int helptimer = 0;
char helpmsg[HELP_MSG_SIZE];
int screen_line_compare(void* a, void* b) {
int i;
......@@ -381,14 +386,7 @@ void sprint_host(char * line, struct in_addr* addr, unsigned int port, unsigned
sprintf(line + left, "%-*s", L-left, service);
}
void write_in_line(int y, int x, char * s) {
/* Peak traffic */
mvaddch(y, x, ACS_RTEE);
addstr(" ");
addstr(s);
addstr(" ");
addch(ACS_LTEE);
}
void ui_print() {
sorted_list_node* nn = NULL;
......@@ -402,7 +400,6 @@ void ui_print() {
line = calloc(COLS + 1, 1);
}
/*
* erase() is faster than clear(). Dunno why we switched to
* clear() -pdw 24/10/02
......@@ -416,7 +413,6 @@ void ui_print() {
}
else {
/* Screen layout: we have 2 * HISTORY_DIVISIONS 6-character wide history
* items, and so can use COLS - 12 * HISTORY_DIVISIONS to print the two
* host names. */
......@@ -490,10 +486,9 @@ void ui_print() {
draw_totals(&totals);
if(showhelphint > 0) {
mvaddstr(0, 0, "Press h for help ");
if(showhelphint) {
mvaddstr(0, 0, helpmsg);
clrtoeol();
showhelphint--;
}
refresh();
......@@ -505,6 +500,16 @@ void ui_print() {
}
}
void ui_tick(int print) {
if(print) {
ui_print();
}
else if(showhelphint && (time(NULL) - helptimer > HELP_TIME)) {
showhelphint = 0;
ui_print();
}
}
void ui_init() {
(void) initscr(); /* initialize the curses library */
keypad(stdscr, TRUE); /* enable keyboard mapping */
......@@ -524,6 +529,28 @@ void ui_init() {
}
void showhelp(const char * s) {
strncpy(helpmsg, s, HELP_MSG_SIZE);
showhelphint = 1;
helptimer = time(NULL);
tick(1);
}
void showportstatus() {
if(options.showports == OPTION_PORTS_ON) {
showhelp("Port display ON");
}
else if(options.showports == OPTION_PORTS_OFF) {
showhelp("Port display OFF");
}
else if(options.showports == OPTION_PORTS_DEST) {
showhelp("Port display DEST");
}
else if(options.showports == OPTION_PORTS_SRC) {
showhelp("Port display SOURCE");
}
}
void ui_loop() {
extern sig_atomic_t foad;
while(foad == 0) {
......@@ -535,12 +562,26 @@ void ui_loop() {
break;
case 'r':
options.dnsresolution = !options.dnsresolution;
if(options.dnsresolution) {
options.dnsresolution = 0;
showhelp("DNS resolution off");
}
else {
options.dnsresolution = 1;
showhelp("DNS resolution on");
}
tick(1);
break;
case 'R':
options.portresolution = !options.portresolution;
if(options.portresolution) {
options.portresolution = 0;
showhelp("Port resolution off");
}
else {
options.portresolution = 1;
showhelp("Port resolution on");
}
tick(1);
break;
......@@ -550,16 +591,36 @@ void ui_loop() {
break;
case 'b':
options.showbars = !options.showbars;
if(options.showbars) {
options.showbars = 0;
showhelp("Bars off");
}
else {
options.showbars = 1;
showhelp("Bars on");
}
tick(1);
break;
case 's':
options.aggregate_src = !options.aggregate_src;
if(options.aggregate_src) {
options.aggregate_src = 0;
showhelp("Show source host");
}
else {
options.aggregate_src = 1;
showhelp("Hide source host");
}
break;
case 'd':
options.aggregate_dest = !options.aggregate_dest;
if(options.aggregate_dest) {
options.aggregate_dest = 0;
showhelp("Show dest host");
}
else {
options.aggregate_dest = 1;
showhelp("Hide dest host");
}
break;
case 'S':
/* Show source ports */
......@@ -575,6 +636,7 @@ void ui_loop() {
else {
options.showports = OPTION_PORTS_OFF;
}
showportstatus();
break;
case 'D':
/* Show dest ports */
......@@ -590,12 +652,14 @@ void ui_loop() {
else {
options.showports = OPTION_PORTS_OFF;
}
showportstatus();
break;
case 'p':
options.showports =
(options.showports == OPTION_PORTS_OFF)
? OPTION_PORTS_ON
: OPTION_PORTS_OFF;
showportstatus();
// Don't tick here, otherwise we get a bogus display
break;
case 'P':
......@@ -604,8 +668,7 @@ void ui_loop() {
case ERR:
break;
default:
showhelphint = 2;
tick(1);
showhelp("Press h for help");
break;
}
tick(0);
......
......@@ -10,5 +10,6 @@
void ui_print();
void ui_loop();
void ui_finish();
void ui_tick(int);
#endif /* __UI_H_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment