From e971130b601064090815c31c90b876e3d0d1d5b1 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Fri, 28 Sep 2012 17:36:25 +0200 Subject: [PATCH] Make tincctl robust against dropped control connections. --- src/tincctl.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/tincctl.c b/src/tincctl.c index eaf676d..0d773e4 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -687,8 +687,19 @@ static bool remove_service(void) { #endif static bool connect_tincd(bool verbose) { - if(fd >= 0) - return true; + if(fd >= 0) { + fd_set r; + FD_ZERO(&r); + FD_SET(fd, &r); + struct timeval tv = {0, 0}; + if(select(fd + 1, &r, NULL, NULL, &tv)) { + fprintf(stderr, "Previous connection to tincd lost, reconnecting.\n"); + close(fd); + fd = -1; + } else { + return true; + } + } FILE *f = fopen(pidfilename, "r"); if(!f) { @@ -751,6 +762,8 @@ static bool connect_tincd(bool verbose) { if(connect(fd, res->ai_addr, res->ai_addrlen) < 0) { if(verbose) fprintf(stderr, "Cannot connect to %s port %s: %s\n", host, port, sockstrerror(sockerrno)); + close(fd); + fd = -1; return false; } @@ -762,6 +775,8 @@ static bool connect_tincd(bool verbose) { if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %s %d", &code, data, &version) != 3 || code != 0) { if(verbose) fprintf(stderr, "Cannot read greeting from control socket: %s\n", sockstrerror(sockerrno)); + close(fd); + fd = -1; return false; } @@ -770,6 +785,8 @@ static bool connect_tincd(bool verbose) { if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &version, &pid) != 3 || code != 4 || version != TINC_CTL_VERSION_CURRENT) { if(verbose) fprintf(stderr, "Could not fully establish control socket connection\n"); + close(fd); + fd = -1; return false; } -- 2.25.1