diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-08-25 12:59:38 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-09-13 12:36:39 -0400 |
commit | a1096fe1802ee3585dd6296b50085017e1928edf (patch) | |
tree | 0944be1e8668c421e861ce5da1a5dbaf2a308973 | |
parent | 34ec954f8ef8201fd16942acca55ac19db8ff7b7 (diff) | |
download | tor-a1096fe1802ee3585dd6296b50085017e1928edf.tar.gz tor-a1096fe1802ee3585dd6296b50085017e1928edf.zip |
Use commandline parser for other options
These were previously allowed only in the initial position:
--help, -h , --version, --digests, --list-torrc-options
-rw-r--r-- | src/or/config.c | 36 | ||||
-rw-r--r-- | src/or/confparse.c | 15 | ||||
-rw-r--r-- | src/or/confparse.h | 2 | ||||
-rw-r--r-- | src/or/main.c | 5 |
4 files changed, 41 insertions, 17 deletions
diff --git a/src/or/config.c b/src/or/config.c index c1bbf7896f..e6adcc4944 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1826,7 +1826,11 @@ config_parse_commandline(int argc, char **argv, int ignore_errors, !strcmp(argv[i],"--ignore-missing-torrc") || !strcmp(argv[i],"--quiet") || !strcmp(argv[i],"--hush") || - !strcmp(argv[1],"--version")) { + !strcmp(argv[i],"--version") || + !strcmp(argv[i],"-h") || + !strcmp(argv[i],"--help") || + !strcmp(argv[i],"--list-torrc-options") || + !strcmp(argv[i],"--digests")) { is_cmdline = 1; want_arg = 0; } else if (!strcmp(argv[i],"--nt-service") || @@ -3830,37 +3834,39 @@ options_init_from_torrc(int argc, char **argv) argv = backup_argv; argc = backup_argc; } - if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) { + + /* Go through command-line variables */ + if (!global_cmdline_options) { + /* Or we could redo the list every time we pass this place. + * It does not really matter */ + if (config_parse_commandline(argc, argv, 0, &global_cmdline_options, + &cmdline_only_options) < 0) { + goto err; + } + } + + if (config_line_find(cmdline_only_options, "-h") || + config_line_find(cmdline_only_options, "--help")) { print_usage(); exit(0); } - if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) { + if (config_line_find(cmdline_only_options, "--list-torrc-options")) { /* For documenting validating whether we've documented everything. */ list_torrc_options(); exit(0); } - if (argc > 1 && (!strcmp(argv[1],"--version"))) { + if (config_line_find(cmdline_only_options, "--version")) { printf("Tor version %s.\n",get_version()); exit(0); } - if (argc > 1 && (!strcmp(argv[1],"--digests"))) { + if (config_line_find(cmdline_only_options, "--digests")) { printf("Tor version %s.\n",get_version()); printf("%s", libor_get_digests()); printf("%s", tor_get_digests()); exit(0); } - /* Go through command-line variables */ - if (!global_cmdline_options) { - /* Or we could redo the list every time we pass this place. - * It does not really matter */ - if (config_parse_commandline(argc, argv, 0, &global_cmdline_options, - &cmdline_only_options) < 0) { - goto err; - } - } - command = CMD_RUN_TOR; for (p_index = cmdline_only_options; p_index; p_index = p_index->next) { if (!strcmp(p_index->key,"--list-fingerprint")) { diff --git a/src/or/confparse.c b/src/or/confparse.c index 41055791ef..12ab0e4556 100644 --- a/src/or/confparse.c +++ b/src/or/confparse.c @@ -79,6 +79,21 @@ config_line_append(config_line_t **lst, (*lst) = newline; } +/** Return the line in <b>lines</b> whose key is exactly <b>key</b>, or NULL + * if no such key exists. For handling commandline-only options only; other + * options should be looked up in the appropriate data structure. */ +const config_line_t * +config_line_find(const config_line_t *lines, + const char *key) +{ + const config_line_t *cl; + for (cl = lines; cl; cl = cl->next) { + if (!strcmp(cl->key, key)) + return cl; + } + return NULL; +} + /** Helper: parse the config string and strdup into key/value * strings. Set *result to the list, or NULL if parsing the string * failed. Return 0 on success, -1 on failure. Warn and ignore any diff --git a/src/or/confparse.h b/src/or/confparse.h index 924ee0d945..a1b6277255 100644 --- a/src/or/confparse.h +++ b/src/or/confparse.h @@ -103,6 +103,8 @@ void *config_new(const config_format_t *fmt); void config_line_append(config_line_t **lst, const char *key, const char *val); config_line_t *config_lines_dup(const config_line_t *inp); +const config_line_t *config_line_find(const config_line_t *lines, + const char *key); void config_free(const config_format_t *fmt, void *options); int config_lines_eq(config_line_t *a, config_line_t *b); int config_count_key(const config_line_t *a, const char *key); diff --git a/src/or/main.c b/src/or/main.c index e816a66670..22519f04aa 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -2345,8 +2345,9 @@ tor_init(int argc, char *argv[]) quiet = 1; if (!strcmp(cl->key, "--quiet")) quiet = 2; - /* --version implies --quiet */ - if (!strcmp(cl->key, "--version")) + /* --version and --help imply --quiet */ + if (!strcmp(cl->key, "--version") || + !strcmp(cl->key, "-h") || !strcmp(cl->key, "--help")) quiet = 2; } config_free_lines(opts); |