[tor-commits] [tor/master] Expose commandline parser so that we can use it for --quiet, etc.

nickm at torproject.org nickm at torproject.org
Fri Sep 13 16:41:19 UTC 2013


commit 34ec954f8ef8201fd16942acca55ac19db8ff7b7
Author: Nick Mathewson <nickm at torproject.org>
Date:   Sun Aug 25 12:49:16 2013 -0400

    Expose commandline parser so that we can use it for --quiet,etc.
    
    Fix for bug 9578.
---
 changes/bug4647 |    3 ++-
 src/or/config.c |   23 +++++++++++++----------
 src/or/config.h |    4 ++++
 src/or/main.c   |   27 ++++++++++++++++++---------
 4 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/changes/bug4647 b/changes/bug4647
index ed4c1ff..2ad08fe 100644
--- a/changes/bug4647
+++ b/changes/bug4647
@@ -3,7 +3,8 @@
     - Use a single command-line parser for parsing torrc options on the
       command line and for finding special command-line options to avoid
       inconsistent behavior for torrc option arguments that have the same
-      names as command-line options. Fixes bugs 4647; bugfix on 0.0.9pre5.
+      names as command-line options. Fixes bugs 4647 and 9578; bugfix on
+      0.0.9pre5.
 
 
 
diff --git a/src/or/config.c b/src/or/config.c
index de9c5ee..c1bbf78 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1792,12 +1792,14 @@ options_act(const or_options_t *old_options)
 }
 
 /** Helper: Read a list of configuration options from the command line.  If
- * successful, put them in *<b>result</b>, put the commandline-only options in
- * *<b>cmdline_result</b>, and return 0; otherwise, return -1 and leave
- * *<b>result</b> and <b>cmdline_result</b> alone. */
-static int
-config_get_commandlines(int argc, char **argv, config_line_t **result,
-    config_line_t **cmdline_result)
+ * successful, or if ignore_errors is set, put them in *<b>result</b>, put the
+ * commandline-only options in *<b>cmdline_result</b>, and return 0;
+ * otherwise, return -1 and leave *<b>result</b> and <b>cmdline_result</b>
+ * alone. */
+int
+config_parse_commandline(int argc, char **argv, int ignore_errors,
+                         config_line_t **result,
+                         config_line_t **cmdline_result)
 {
   config_line_t *param = NULL;
 
@@ -1823,7 +1825,8 @@ config_get_commandlines(int argc, char **argv, config_line_t **result,
                !strcmp(argv[i],"--verify-config") ||
                !strcmp(argv[i],"--ignore-missing-torrc") ||
                !strcmp(argv[i],"--quiet") ||
-               !strcmp(argv[i],"--hush")) {
+               !strcmp(argv[i],"--hush") ||
+               !strcmp(argv[1],"--version")) {
       is_cmdline = 1;
       want_arg = 0;
     } else if (!strcmp(argv[i],"--nt-service") ||
@@ -1851,7 +1854,7 @@ config_get_commandlines(int argc, char **argv, config_line_t **result,
     }
 
     if (want_arg && i == argc-1) {
-      if (!strcmp(argv[i],"--hash-password")) {
+      if (!strcmp(argv[i],"--hash-password") || ignore_errors) {
         arg = strdup("");
       } else {
         log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.",
@@ -3852,8 +3855,8 @@ options_init_from_torrc(int argc, char **argv)
   if (!global_cmdline_options) {
     /* Or we could redo the list every time we pass this place.
      * It does not really matter */
-    if (config_get_commandlines(argc, argv, &global_cmdline_options,
-        &cmdline_only_options) < 0) {
+    if (config_parse_commandline(argc, argv, 0, &global_cmdline_options,
+                                 &cmdline_only_options) < 0) {
       goto err;
     }
   }
diff --git a/src/or/config.h b/src/or/config.h
index eb16e74..0ed5a5b 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -96,6 +96,10 @@ int init_cookie_authentication(const char *fname, const char *header,
 
 or_options_t *options_new(void);
 
+int config_parse_commandline(int argc, char **argv, int ignore_errors,
+                             config_line_t **result,
+                             config_line_t **cmdline_result);
+
 void config_register_addressmaps(const or_options_t *options);
 /* XXXX024 move to connection_edge.h */
 int addressmap_register_auto(const char *from, const char *to,
diff --git a/src/or/main.c b/src/or/main.c
index 33e1c64..e816a66 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -21,6 +21,7 @@
 #include "circuituse.h"
 #include "command.h"
 #include "config.h"
+#include "confparse.h"
 #include "connection.h"
 #include "connection_edge.h"
 #include "connection_or.h"
@@ -2320,7 +2321,7 @@ int
 tor_init(int argc, char *argv[])
 {
   char buf[256];
-  int i, quiet = 0;
+  int quiet = 0;
   time_of_process_start = time(NULL);
   init_connection_lists();
   /* Have the log set up with our application name. */
@@ -2333,17 +2334,25 @@ tor_init(int argc, char *argv[])
   addressmap_init(); /* Init the client dns cache. Do it always, since it's
                       * cheap. */
 
+  {
   /* We search for the "quiet" option first, since it decides whether we
    * will log anything at all to the command line. */
-  for (i=1;i<argc;++i) {
-    if (!strcmp(argv[i], "--hush"))
-      quiet = 1;
-    if (!strcmp(argv[i], "--quiet"))
-      quiet = 2;
-    /* --version implies --quiet */
-    if (!strcmp(argv[i], "--version"))
-      quiet = 2;
+    config_line_t *opts = NULL, *cmdline_opts = NULL;
+    const config_line_t *cl;
+    (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts);
+    for (cl = cmdline_opts; cl; cl = cl->next) {
+      if (!strcmp(cl->key, "--hush"))
+        quiet = 1;
+      if (!strcmp(cl->key, "--quiet"))
+        quiet = 2;
+      /* --version implies --quiet */
+      if (!strcmp(cl->key, "--version"))
+        quiet = 2;
+    }
+    config_free_lines(opts);
+    config_free_lines(cmdline_opts);
   }
+
  /* give it somewhere to log to initially */
   switch (quiet) {
     case 2:





More information about the tor-commits mailing list