/*
top.c -- Show real-time statistics from a running tincd
- Copyright (C) 2011-2012 Guus Sliepen <guus@tinc-vpn.org>
+ Copyright (C) 2011-2013 Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
static const char *punit = "pkts";
static float pscale = 1;
-#ifndef timersub
-#define timersub(a, b, c) do {(c)->tv_sec = (a)->tv_sec - (b)->tv_sec; (c)->tv_usec = (a)->tv_usec = (b)->tv_usec;} while(0)
-#endif
+static bool update(int fd) {
+ if(!sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC))
+ return false;
-static void update(int fd) {
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC);
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)
- 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;
found = ns;
break;
} else {
- found = xmalloc_and_zero(sizeof *found);
+ found = xzalloc(sizeof *found);
found->name = xstrdup(name);
list_insert_before(&node_list, node, found);
changed = true;
}
if(!found) {
- found = xmalloc_and_zero(sizeof *found);
+ found = xzalloc(sizeof *found);
found->name = xstrdup(name);
list_insert_tail(&node_list, found);
changed = true;
found->out_packets = out_packets;
found->out_bytes = out_bytes;
}
+
+ return false;
}
static int cmpfloat(float a, float b) {
for(int i = 0; i < n; i++)
sorted[i]->i = i;
- qsort(sorted, n, sizeof *sorted, sortfunc);
+ if(sorted)
+ qsort(sorted, n, sizeof *sorted, sortfunc);
for(int i = 0, row = 3; i < n; i++, row++) {
nodestats_t *node = sorted[i];
bool running = true;
while(running) {
- update(fd);
+ if(!update(fd))
+ break;
+
redraw();
switch(getch()) {