X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Ftincd.c;h=d15d2ffaf5bfcd8b72a0973b40f0eb8c1037c08e;hp=aaad1da681e4bb7056d5ed1a0fb28158d4721044;hb=dc26ecc28046d9f3cb56f10b22636d04218ad545;hpb=fb5fcc575d25a51acf73d476f63ce72f30cda6c2 diff --git a/src/tincd.c b/src/tincd.c index aaad1da6..d15d2ffa 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -162,6 +162,11 @@ static bool parse_options(int argc, char **argv) { break; case 'c': /* config file */ + if(confbase) { + fprintf(stderr, "Only one configuration directory can be given.\n"); + usage(true); + return false; + } confbase = xstrdup(optarg); break; @@ -178,7 +183,9 @@ static bool parse_options(int argc, char **argv) { break; #endif - case 'd': /* inc debug level */ + case 'd': /* increase debug level */ + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) debug_level = atoi(optarg); else @@ -187,6 +194,8 @@ static bool parse_options(int argc, char **argv) { case 'k': /* kill old tincds */ #ifndef HAVE_MINGW + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) { if(!strcasecmp(optarg, "HUP")) kill_tincd = SIGHUP; @@ -225,8 +234,12 @@ static bool parse_options(int argc, char **argv) { case 'n': /* net name given */ /* netname "." is special: a "top-level name" */ - netname = strcmp(optarg, ".") != 0 ? - xstrdup(optarg) : NULL; + if(netname) { + fprintf(stderr, "Only one netname can be given.\n"); + usage(true); + return false; + } + netname = strcmp(optarg, ".") != 0 ? xstrdup(optarg) : NULL; break; case 'o': /* option */ @@ -237,6 +250,8 @@ static bool parse_options(int argc, char **argv) { break; case 'K': /* generate public/private keypair */ + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) { generate_keys = atoi(optarg); @@ -274,11 +289,24 @@ static bool parse_options(int argc, char **argv) { case 4: /* write log entries to a file */ use_logfile = true; - if(optarg) + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; + if(optarg) { + if(logfilename) { + fprintf(stderr, "Only one logfile can be given.\n"); + usage(true); + return false; + } logfilename = xstrdup(optarg); + } break; case 5: /* write PID to a file */ + if(pidfilename) { + fprintf(stderr, "Only one pidfile can be given.\n"); + usage(true); + return false; + } pidfilename = xstrdup(optarg); break; @@ -291,6 +319,12 @@ static bool parse_options(int argc, char **argv) { } } + if(optind < argc) { + fprintf(stderr, "%s: unrecognized argument '%s'\n", argv[0], argv[optind]); + usage(true); + return false; + } + return true; } @@ -337,7 +371,6 @@ static void indicator(int a, int b, void *p) { static bool keygen(int bits) { RSA *rsa_key; FILE *f; - char *name = get_name(); char *pubname, *privname; fprintf(stderr, "Generating %d bits keys:\n", bits); @@ -365,10 +398,14 @@ static bool keygen(int bits) { PEM_write_RSAPrivateKey(f, rsa_key, NULL, NULL, 0, NULL, NULL); fclose(f); - if(name) + char *name = get_name(); + + if(name) { xasprintf(&pubname, "%s/hosts/%s", confbase, name); - else + free(name); + } else { xasprintf(&pubname, "%s/rsa_key.pub", confbase); + } f = ask_and_open(pubname, "public RSA key"); free(pubname); @@ -379,7 +416,6 @@ static bool keygen(int bits) { fputc('\n', f); PEM_write_RSAPublicKey(f, rsa_key); fclose(f); - free(name); return true; }