From f134bd0c9c2213fbbb3967f3d784759cb65e2c76 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sun, 9 Mar 2014 15:32:10 +0100 Subject: [PATCH] Handle a disconnecting tincd better. - Try to prevent SIGPIPE from being sent for errors sending to the control socket. We don't outright block the SIGPIPE signal because we still want the tinc CLI to exit when its output is actually sent to a real (broken) pipe. - Don't call exit() from top(), and properly detect when the control socket is closed by the tincd. --- src/tincctl.c | 11 ++++++++++- src/top.c | 21 ++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) 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()) { -- 2.20.1