X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;ds=inline;f=src%2Ftincctl.c;h=aee09085d3daf03a1cc53aade2d619f50259613f;hb=83a94ab08fb36b88a473a56b164a9795637fe798;hp=2de89e81200728ecc0bc5008c760ad9b0268ac2d;hpb=717ea66d7ba0c23f27d86b3d5c6992b751135455;p=tinc diff --git a/src/tincctl.c b/src/tincctl.c index 2de89e81..aee09085 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -57,11 +57,12 @@ static char *name = NULL; static char *identname = NULL; /* program name for syslog */ static char *pidfilename = NULL; /* pid file location */ static char *confdir = NULL; -static char controlcookie[1024]; +static char controlcookie[1025]; char *netname = NULL; char *confbase = NULL; static char *tinc_conf = NULL; static char *hosts_dir = NULL; +struct timeval now; // Horrible global variables... static int pid = 0; @@ -134,7 +135,7 @@ static void usage(bool status) { " generate-rsa-keys [bits] Generate a new RSA public/private keypair.\n" " generate-ecdsa-keys Generate a new ECDSA public/private keypair.\n" " dump Dump a list of one of the following things:\n" - " nodes - all known nodes in the VPN\n" + " [reachable] nodes - all known nodes in the VPN\n" " edges - all known connections in the VPN\n" " subnets - all known subnets in the VPN\n" " connections - all meta connections with ourself\n" @@ -708,8 +709,8 @@ static bool connect_tincd(bool verbose) { return false; } - char host[128]; - char port[128]; + char host[129]; + char port[129]; if(fscanf(f, "%20d %1024s %128s port %128s", &pid, controlcookie, host, port) != 4) { if(verbose) @@ -853,6 +854,11 @@ static int cmd_start(int argc, char *argv[]) { } static int cmd_stop(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + #ifndef HAVE_MINGW if(!connect_tincd(true)) { if(pid) { @@ -897,6 +903,11 @@ static int cmd_restart(int argc, char *argv[]) { } static int cmd_reload(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true)) return 1; @@ -911,6 +922,19 @@ static int cmd_reload(int argc, char *argv[]) { } 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); @@ -985,8 +1009,10 @@ static int cmd_dump(int argc, char *argv[]) { fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line); return 1; } + + memcpy(&status, &status_int, sizeof status); + if(do_graph) { - memcpy(&status, &status_int, sizeof status); const char *color = "black"; if(!strcmp(host, "MYSELF")) color = "green"; @@ -1000,6 +1026,8 @@ static int cmd_dump(int argc, char *argv[]) { 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 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, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu); } @@ -1052,6 +1080,11 @@ static int cmd_dump(int argc, char *argv[]) { } static int cmd_purge(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true)) return 1; @@ -1087,6 +1120,11 @@ static int cmd_debug(int argc, char *argv[]) { } static int cmd_retry(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true)) return 1; @@ -1146,6 +1184,11 @@ static int cmd_disconnect(int argc, char *argv[]) { } static int cmd_top(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + #ifdef HAVE_CURSES if(!connect_tincd(true)) return 1; @@ -1159,6 +1202,11 @@ static int cmd_top(int argc, char *argv[]) { } static int cmd_pcap(int argc, char *argv[]) { + if(argc > 2) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true)) return 1; @@ -1167,6 +1215,11 @@ static int cmd_pcap(int argc, char *argv[]) { } static int cmd_log(int argc, char *argv[]) { + if(argc > 2) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true)) return 1; @@ -1175,6 +1228,11 @@ static int cmd_log(int argc, char *argv[]) { } static int cmd_pid(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + if(!connect_tincd(true) && !pid) return 1; @@ -1595,7 +1653,10 @@ static int cmd_init(int argc, char *argv[]) { return 1; } - if(argc < 2) { + if(argc > 2) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } else if(argc < 2) { if(tty) { char buf[1024]; fprintf(stdout, "Enter the Name you want your tinc node to have: "); @@ -1674,14 +1735,29 @@ static int cmd_init(int argc, char *argv[]) { } static int cmd_generate_keys(int argc, char *argv[]) { + if(argc > 2) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + return !(rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true) && ecdsa_keygen(true)); } static int cmd_generate_rsa_keys(int argc, char *argv[]) { + if(argc > 2) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + return !rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true); } static int cmd_generate_ecdsa_keys(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + return !ecdsa_keygen(true); } @@ -1691,6 +1767,11 @@ static int cmd_help(int argc, char *argv[]) { } static int cmd_version(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + version(); return 0; } @@ -1793,6 +1874,11 @@ static int export(const char *name, FILE *out) { } static int cmd_export(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + char *name = get_my_name(); if(!name) return 1; @@ -1801,6 +1887,11 @@ static int cmd_export(int argc, char *argv[]) { } static int cmd_export_all(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + DIR *dir = opendir(hosts_dir); if(!dir) { fprintf(stderr, "Could not open host configuration directory %s: %s\n", hosts_dir, strerror(errno)); @@ -1828,6 +1919,11 @@ static int cmd_export_all(int argc, char *argv[]) { } static int cmd_import(int argc, char *argv[]) { + if(argc > 1) { + fprintf(stderr, "Too many arguments!\n"); + return 1; + } + FILE *in = stdin; FILE *out = NULL; @@ -1839,6 +1935,8 @@ static int cmd_import(int argc, char *argv[]) { while(fgets(buf, sizeof buf, in)) { if(sscanf(buf, "Name = %s", name) == 1) { + firstline = false; + if(!check_id(name)) { fprintf(stderr, "Invalid Name in input!\n"); return 1; @@ -1863,7 +1961,6 @@ static int cmd_import(int argc, char *argv[]) { } count++; - firstline = false; continue; } else if(firstline) { fprintf(stderr, "Junk at the beginning of the input, ignoring.\n"); @@ -1946,7 +2043,7 @@ static char *complete_command(const char *text, int state) { } static char *complete_dump(const char *text, int state) { - const char *matches[] = {"nodes", "edges", "subnets", "connections", "graph", NULL}; + const char *matches[] = {"reachable", "nodes", "edges", "subnets", "connections", "graph", NULL}; static int i; if(!state)