Expose commandline parser so that we can use it for --quiet,etc.

Fix for bug 9578.
This commit is contained in:
Nick Mathewson 2013-08-25 12:49:16 -04:00
parent d98dfb3746
commit 34ec954f8e
4 changed files with 37 additions and 20 deletions

View File

@ -3,7 +3,8 @@
- Use a single command-line parser for parsing torrc options on the - Use a single command-line parser for parsing torrc options on the
command line and for finding special command-line options to avoid command line and for finding special command-line options to avoid
inconsistent behavior for torrc option arguments that have the same 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.

View File

@ -1792,12 +1792,14 @@ options_act(const or_options_t *old_options)
} }
/** Helper: Read a list of configuration options from the command line. If /** 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 * successful, or if ignore_errors is set, put them in *<b>result</b>, put the
* *<b>cmdline_result</b>, and return 0; otherwise, return -1 and leave * commandline-only options in *<b>cmdline_result</b>, and return 0;
* *<b>result</b> and <b>cmdline_result</b> alone. */ * otherwise, return -1 and leave *<b>result</b> and <b>cmdline_result</b>
static int * alone. */
config_get_commandlines(int argc, char **argv, config_line_t **result, int
config_line_t **cmdline_result) config_parse_commandline(int argc, char **argv, int ignore_errors,
config_line_t **result,
config_line_t **cmdline_result)
{ {
config_line_t *param = NULL; 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],"--verify-config") ||
!strcmp(argv[i],"--ignore-missing-torrc") || !strcmp(argv[i],"--ignore-missing-torrc") ||
!strcmp(argv[i],"--quiet") || !strcmp(argv[i],"--quiet") ||
!strcmp(argv[i],"--hush")) { !strcmp(argv[i],"--hush") ||
!strcmp(argv[1],"--version")) {
is_cmdline = 1; is_cmdline = 1;
want_arg = 0; want_arg = 0;
} else if (!strcmp(argv[i],"--nt-service") || } 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 (want_arg && i == argc-1) {
if (!strcmp(argv[i],"--hash-password")) { if (!strcmp(argv[i],"--hash-password") || ignore_errors) {
arg = strdup(""); arg = strdup("");
} else { } else {
log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.", 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) { if (!global_cmdline_options) {
/* Or we could redo the list every time we pass this place. /* Or we could redo the list every time we pass this place.
* It does not really matter */ * It does not really matter */
if (config_get_commandlines(argc, argv, &global_cmdline_options, if (config_parse_commandline(argc, argv, 0, &global_cmdline_options,
&cmdline_only_options) < 0) { &cmdline_only_options) < 0) {
goto err; goto err;
} }
} }

View File

@ -96,6 +96,10 @@ int init_cookie_authentication(const char *fname, const char *header,
or_options_t *options_new(void); 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); void config_register_addressmaps(const or_options_t *options);
/* XXXX024 move to connection_edge.h */ /* XXXX024 move to connection_edge.h */
int addressmap_register_auto(const char *from, const char *to, int addressmap_register_auto(const char *from, const char *to,

View File

@ -21,6 +21,7 @@
#include "circuituse.h" #include "circuituse.h"
#include "command.h" #include "command.h"
#include "config.h" #include "config.h"
#include "confparse.h"
#include "connection.h" #include "connection.h"
#include "connection_edge.h" #include "connection_edge.h"
#include "connection_or.h" #include "connection_or.h"
@ -2320,7 +2321,7 @@ int
tor_init(int argc, char *argv[]) tor_init(int argc, char *argv[])
{ {
char buf[256]; char buf[256];
int i, quiet = 0; int quiet = 0;
time_of_process_start = time(NULL); time_of_process_start = time(NULL);
init_connection_lists(); init_connection_lists();
/* Have the log set up with our application name. */ /* 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 addressmap_init(); /* Init the client dns cache. Do it always, since it's
* cheap. */ * cheap. */
{
/* We search for the "quiet" option first, since it decides whether we /* We search for the "quiet" option first, since it decides whether we
* will log anything at all to the command line. */ * will log anything at all to the command line. */
for (i=1;i<argc;++i) { config_line_t *opts = NULL, *cmdline_opts = NULL;
if (!strcmp(argv[i], "--hush")) const config_line_t *cl;
quiet = 1; (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts);
if (!strcmp(argv[i], "--quiet")) for (cl = cmdline_opts; cl; cl = cl->next) {
quiet = 2; if (!strcmp(cl->key, "--hush"))
/* --version implies --quiet */ quiet = 1;
if (!strcmp(argv[i], "--version")) if (!strcmp(cl->key, "--quiet"))
quiet = 2; 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 */ /* give it somewhere to log to initially */
switch (quiet) { switch (quiet) {
case 2: case 2: