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.
This commit is contained in:
Guus Sliepen 2014-03-09 15:32:10 +01:00
parent 09e000ba54
commit f134bd0c9c
2 changed files with 22 additions and 10 deletions

View file

@ -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()) {