diff --git a/src/tincctl.c b/src/tincctl.c index fdb72e05..81e7a7a2 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -39,6 +39,10 @@ #include "tincctl.h" #include "top.h" +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + static char **orig_argv; static int orig_argc; @@ -529,7 +533,7 @@ bool sendline(int fd, char *format, ...) { blen++; while(blen) { - int result = send(fd, p, blen, 0); + int result = send(fd, p, blen, MSG_NOSIGNAL); if(result == -1 && errno == EINTR) continue; else if(result <= 0) @@ -741,6 +745,11 @@ bool connect_tincd(bool verbose) { freeaddrinfo(res); #endif +#ifdef SO_NOSIGPIPE + static const int one = 1; + setsockopt(c, SOL_SOCKET, SO_NOSIGPIPE, (void *)&one, sizeof one); +#endif + char data[4096]; int version; diff --git a/src/top.c b/src/top.c index 4db93043..2824261c 100644 --- a/src/top.c +++ b/src/top.c @@ -66,8 +66,10 @@ static float bscale = 1; static const char *punit = "pkts"; static float pscale = 1; -static void update(int fd) { - sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC); +static bool update(int fd) { + if(!sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC)) + return false; + gettimeofday(&cur, NULL); timersub(&cur, &prev, &diff); @@ -90,13 +92,10 @@ static void update(int fd) { int n = sscanf(line, "%d %d %s %"PRIu64" %"PRIu64" %"PRIu64" %"PRIu64, &code, &req, name, &in_packets, &in_bytes, &out_packets, &out_bytes); if(n == 2) - break; + return true; - if(n != 7) { - endwin(); - fprintf(stderr, "Error receiving traffic information\n"); - exit(1); - } + if(n != 7) + return false; nodestats_t *found = NULL; @@ -133,6 +132,8 @@ static void update(int fd) { found->out_packets = out_packets; found->out_bytes = out_bytes; } + + return false; } static int cmpfloat(float a, float b) { @@ -246,7 +247,9 @@ void top(int fd) { bool running = true; while(running) { - update(fd); + if(!update(fd)) + break; + redraw(); switch(getch()) {