+ if(n < 2)
+ break;
+
+ if(!do_graph)
+ printf("%s\n", line + 5);
+ else {
+ if(req == REQ_DUMP_NODES)
+ printf(" %s [label = \"%s\"];\n", node1, node1);
+ else
+ printf(" %s -> %s;\n", node1, node2);
+ }
+ }
+
+ fprintf(stderr, "Error receiving dump.\n");
+ return 1;
+}
+
+static int cmd_purge(int argc, char *argv[]) {
+ if(!connect_tincd())
+ return 1;
+
+ sendline(fd, "%d %d", CONTROL, REQ_PURGE);
+ if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_PURGE || result) {
+ fprintf(stderr, "Could not purge old information.\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+static int cmd_debug(int argc, char *argv[]) {
+ if(argc != 2) {
+ fprintf(stderr, "Invalid number of arguments.\n");
+ return 1;
+ }
+
+ if(!connect_tincd())
+ return 1;
+
+ int debuglevel = atoi(argv[1]);
+ int origlevel;
+
+ sendline(fd, "%d %d %d", CONTROL, REQ_SET_DEBUG, debuglevel);
+ if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &origlevel) != 3 || code != CONTROL || req != REQ_SET_DEBUG) {
+ fprintf(stderr, "Could not set debug level.\n");
+ return 1;
+ }
+
+ fprintf(stderr, "Old level %d, new level %d.\n", origlevel, debuglevel);
+ return 0;
+}
+
+static int cmd_retry(int argc, char *argv[]) {
+ if(!connect_tincd())
+ return 1;
+
+ sendline(fd, "%d %d", CONTROL, REQ_RETRY);
+ if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_RETRY || result) {
+ fprintf(stderr, "Could not retry outgoing connections.\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+static int cmd_connect(int argc, char *argv[]) {
+ if(argc != 2) {
+ fprintf(stderr, "Invalid number of arguments.\n");
+ return 1;
+ }
+
+ if(!check_id(argv[2])) {
+ fprintf(stderr, "Invalid name for node.\n");
+ return 1;
+ }
+
+ if(!connect_tincd())
+ return 1;
+
+ sendline(fd, "%d %d %s", CONTROL, REQ_CONNECT, argv[1]);
+ if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_CONNECT || result) {
+ fprintf(stderr, "Could not connect to %s.\n", argv[1]);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int cmd_disconnect(int argc, char *argv[]) {
+ if(argc != 2) {
+ fprintf(stderr, "Invalid number of arguments.\n");
+ return 1;
+ }
+
+ if(!check_id(argv[2])) {
+ fprintf(stderr, "Invalid name for node.\n");
+ return 1;
+ }
+
+ if(!connect_tincd())
+ return 1;
+
+ sendline(fd, "%d %d %s", CONTROL, REQ_DISCONNECT, argv[1]);
+ if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_DISCONNECT || result) {
+ fprintf(stderr, "Could not disconnect %s.\n", argv[1]);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int cmd_top(int argc, char *argv[]) {
+#ifdef HAVE_CURSES
+ if(!connect_tincd())
+ return 1;
+
+ top(fd);
+ return 0;