Handle a disconnecting tincd better.
[tinc] / src / top.c
index 4db9304..2824261 100644 (file)
--- 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()) {