+ }
+
+ memcpy(&status, &status_int, sizeof status);
+
+ if(do_graph) {
+ const char *color = "black";
+ if(!strcmp(host, "MYSELF"))
+ color = "green";
+ else if(!status.reachable)
+ color = "red";
+ else if(strcmp(via, node))
+ color = "orange";
+ else if(!status.validkey)
+ color = "black";
+ else if(minmtu > 0)
+ color = "green";
+ printf(" %s [label = \"%s\", color = \"%s\"%s];\n", node, node, color, strcmp(host, "MYSELF") ? "" : ", style = \"filled\"");
+ } else {
+ if(only_reachable && !status.reachable)
+ continue;
+ printf("%s id %s at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %hd (min %hd max %hd)\n",
+ node, id, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu);
+ }
+ } break;
+
+ case REQ_DUMP_EDGES: {
+ int n = sscanf(line, "%*d %*d %s %s %s port %s %s port %s %x %d", from, to, host, port, local_host, local_port, &options, &weight);
+ if(n != 8) {
+ fprintf(stderr, "Unable to parse edge dump from tincd.\n");
+ return 1;
+ }
+
+ if(do_graph) {
+ float w = 1 + 65536.0 / weight;
+ if(do_graph == 1 && strcmp(node1, node2) > 0)
+ printf(" %s -- %s [w = %f, weight = %f];\n", node1, node2, w, w);
+ else if(do_graph == 2)
+ printf(" %s -> %s [w = %f, weight = %f];\n", node1, node2, w, w);
+ } else {
+ printf("%s to %s at %s port %s local %s port %s options %x weight %d\n", from, to, host, port, local_host, local_port, options, weight);
+ }
+ } break;
+
+ case REQ_DUMP_SUBNETS: {
+ int n = sscanf(line, "%*d %*d %s %s", subnet, node);
+ if(n != 2) {
+ fprintf(stderr, "Unable to parse subnet dump from tincd.\n");
+ return 1;
+ }
+ printf("%s owner %s\n", strip_weight(subnet), node);
+ } break;
+
+ case REQ_DUMP_CONNECTIONS: {
+ int n = sscanf(line, "%*d %*d %s %s port %s %x %d %x", node, host, port, &options, &socket, &status_int);
+ if(n != 6) {
+ fprintf(stderr, "Unable to parse connection dump from tincd.\n");
+ return 1;
+ }
+ printf("%s at %s port %s options %x socket %d status %x\n", node, host, port, options, socket, status_int);
+ } break;
+
+ default:
+ fprintf(stderr, "Unable to parse dump from tincd.\n");
+ return 1;