- if(!strcasecmp(argv[1], "nodes"))
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
- else if(!strcasecmp(argv[1], "edges"))
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
- else if(!strcasecmp(argv[1], "subnets"))
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_SUBNETS);
- else if(!strcasecmp(argv[1], "connections"))
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_CONNECTIONS);
- else if(!strcasecmp(argv[1], "graph")) {
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
- do_graph = 1;
- } else if(!strcasecmp(argv[1], "digraph")) {
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
- sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
- do_graph = 2;
- } else {
- fprintf(stderr, "Unknown dump type '%s'.\n", argv[1]);
+ while((ent = readdir(dir))) {
+ char buf[MAX_STRING_SIZE];
+
+ if(b64decode(ent->d_name, buf, 24) != 18) {
+ continue;
+ }
+
+ char fname[PATH_MAX];
+
+ if(snprintf(fname, sizeof(fname), "%s" SLASH "%s", dname, ent->d_name) >= sizeof(fname)) {
+ fprintf(stderr, "Filename too long: %s" SLASH "%s\n", dname, ent->d_name);
+ continue;
+ }
+
+ FILE *f = fopen(fname, "r");
+
+ if(!f) {
+ fprintf(stderr, "Cannot open %s: %s\n", fname, strerror(errno));
+ continue;
+ }
+
+ buf[0] = 0;
+
+ if(!fgets(buf, sizeof(buf), f)) {
+ fprintf(stderr, "Invalid invitation file %s\n", fname);
+ fclose(f);
+ continue;
+ }
+
+ fclose(f);
+
+ char *eol = buf + strlen(buf);
+
+ while(strchr("\t \r\n", *--eol)) {
+ *eol = 0;
+ }
+
+ if(strncmp(buf, "Name = ", 7) || !check_id(buf + 7)) {
+ fprintf(stderr, "Invalid invitation file %s\n", fname);
+ continue;
+ }
+
+ found = true;
+ printf("%s %s\n", ent->d_name, buf + 7);
+ }
+
+ closedir(dir);
+
+ if(!found) {
+ fprintf(stderr, "No outstanding invitations.\n");
+ }
+
+ return 0;
+}
+
+static int cmd_dump(int argc, char *argv[]) {
+ bool only_reachable = false;
+
+ if(argc > 2 && !strcasecmp(argv[1], "reachable")) {
+ if(strcasecmp(argv[2], "nodes")) {
+ fprintf(stderr, "`reachable' only supported for nodes.\n");
+ usage(true);
+ return 1;
+ }
+
+ only_reachable = true;
+ argv++;
+ argc--;
+ }
+
+ if(argc != 2) {
+ fprintf(stderr, "Invalid number of arguments.\n");
+ usage(true);
+ return 1;
+ }
+
+ if(!strcasecmp(argv[1], "invitations")) {
+ return dump_invitations();
+ }
+
+ if(!connect_tincd(true)) {
+ return 1;
+ }
+
+ int do_graph = 0;
+
+ if(!strcasecmp(argv[1], "nodes")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
+ } else if(!strcasecmp(argv[1], "edges")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
+ } else if(!strcasecmp(argv[1], "subnets")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_SUBNETS);
+ } else if(!strcasecmp(argv[1], "connections")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_CONNECTIONS);
+ } else if(!strcasecmp(argv[1], "graph")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
+ do_graph = 1;
+ } else if(!strcasecmp(argv[1], "digraph")) {
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_NODES);
+ sendline(fd, "%d %d", CONTROL, REQ_DUMP_EDGES);
+ do_graph = 2;
+ } else {
+ fprintf(stderr, "Unknown dump type '%s'.\n", argv[1]);