From: Guus Sliepen Date: Thu, 30 May 2013 14:43:20 +0000 (+0200) Subject: Better optional argument handling. X-Git-Tag: release-1.0.22~7 X-Git-Url: https://tinc-vpn.org/git/browse?a=commitdiff_plain;h=c9c3cc03bfec664f7386011f3fc608d1c0844836;p=tinc Better optional argument handling. Some options can take an optional argument. However, in this case GNU getopt requires that the optional argument is right next to the option without whitespace inbetween. If there is whitespace, getopt will treat it as a non-option argument, but tinc ignored those without a warning. Now tinc will allow optional arguments with whitespace inbetween, and will give an error when it encounters any other non-option arguments. --- diff --git a/src/tincd.c b/src/tincd.c index aaad1da6..7416d11b 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -178,7 +178,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 +189,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 +229,7 @@ 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; + netname = strcmp(optarg, ".") != 0 ? xstrdup(optarg) : NULL; break; case 'o': /* option */ @@ -237,6 +240,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,6 +279,8 @@ static bool parse_options(int argc, char **argv) { case 4: /* write log entries to a file */ use_logfile = true; + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) logfilename = xstrdup(optarg); break; @@ -291,6 +298,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; }