Browse Source

Use commandline parser for other options

These were previously allowed only in the initial position:
  --help, -h , --version, --digests, --list-torrc-options
Nick Mathewson 10 years ago
parent
commit
a1096fe180
4 changed files with 41 additions and 17 deletions
  1. 21 15
      src/or/config.c
  2. 15 0
      src/or/confparse.c
  3. 2 0
      src/or/confparse.h
  4. 3 2
      src/or/main.c

+ 21 - 15
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")) {

+ 15 - 0
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

+ 2 - 0
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);

+ 3 - 2
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);