diff --git a/changes/bug4647 b/changes/bug4647
index ed4c1ff319..2ad08fec31 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 de9c5eee19..c1bbf7896f 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 *result, put the commandline-only options in
- * *cmdline_result, and return 0; otherwise, return -1 and leave
- * *result and cmdline_result 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 *result, put the
+ * commandline-only options in *cmdline_result, and return 0;
+ * otherwise, return -1 and leave *result and cmdline_result
+ * 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 eb16e74610..0ed5a5b5f8 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 33e1c6437f..e816a66670 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;inext) {
+ 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: