- 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.
#include "tincctl.h"
#include "top.h"
#include "tincctl.h"
#include "top.h"
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
static char **orig_argv;
static int orig_argc;
static char **orig_argv;
static int orig_argc;
- 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)
if(result == -1 && errno == EINTR)
continue;
else if(result <= 0)
freeaddrinfo(res);
#endif
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;
char data[4096];
int version;
static const char *punit = "pkts";
static float pscale = 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);
gettimeofday(&cur, NULL);
timersub(&cur, &prev, &diff);
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)
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)
- if(n != 7) {
- endwin();
- fprintf(stderr, "Error receiving traffic information\n");
- exit(1);
- }
+ if(n != 7)
+ return false;
nodestats_t *found = NULL;
nodestats_t *found = NULL;
found->out_packets = out_packets;
found->out_bytes = out_bytes;
}
found->out_packets = out_packets;
found->out_bytes = out_bytes;
}
}
static int cmpfloat(float a, float b) {
}
static int cmpfloat(float a, float b) {
bool running = true;
while(running) {
bool running = true;
while(running) {
+ if(!update(fd))
+ break;
+
redraw();
switch(getch()) {
redraw();
switch(getch()) {