Use commandline parser for other options

These were previously allowed only in the initial position:
  --help, -h , --version, --digests, --list-torrc-options
This commit is contained in:
Nick Mathewson 2013-08-25 12:59:38 -04:00
parent 34ec954f8e
commit a1096fe180
4 changed files with 47 additions and 23 deletions

View File

@ -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,26 +3834,6 @@ 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"))) {
print_usage();
exit(0);
}
if (argc > 1 && !strcmp(argv[1], "--list-torrc-options")) {
/* For documenting validating whether we've documented everything. */
list_torrc_options();
exit(0);
}
if (argc > 1 && (!strcmp(argv[1],"--version"))) {
printf("Tor version %s.\n",get_version());
exit(0);
}
if (argc > 1 && (!strcmp(argv[1],"--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) {
@ -3861,6 +3845,28 @@ options_init_from_torrc(int argc, char **argv)
}
}
if (config_line_find(cmdline_only_options, "-h") ||
config_line_find(cmdline_only_options, "--help")) {
print_usage();
exit(0);
}
if (config_line_find(cmdline_only_options, "--list-torrc-options")) {
/* For documenting validating whether we've documented everything. */
list_torrc_options();
exit(0);
}
if (config_line_find(cmdline_only_options, "--version")) {
printf("Tor version %s.\n",get_version());
exit(0);
}
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);
}
command = CMD_RUN_TOR;
for (p_index = cmdline_only_options; p_index; p_index = p_index->next) {
if (!strcmp(p_index->key,"--list-fingerprint")) {

View File

@ -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

View File

@ -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);

View File

@ -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);