|
@@ -724,140 +724,23 @@ static int check_nickname_list(const char *lst, const char *name)
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- * file location based on the command line. After loading the options,
|
|
|
- * validate them for consistency. Return 0 if success, <0 if failure. */
|
|
|
-int
|
|
|
-getconfig(int argc, char **argv, or_options_t *options)
|
|
|
-{
|
|
|
- struct config_line_t *cl;
|
|
|
- FILE *cf;
|
|
|
- char *fname;
|
|
|
- int i;
|
|
|
- int result = 0;
|
|
|
- static int first_load = 1;
|
|
|
- static char **backup_argv;
|
|
|
- static int backup_argc;
|
|
|
- char *previous_pidfile = NULL;
|
|
|
- int previous_runasdaemon = 0;
|
|
|
- int previous_orport = -1;
|
|
|
- int using_default_torrc;
|
|
|
-
|
|
|
- if (first_load) {
|
|
|
- backup_argv = argv;
|
|
|
- backup_argc = argc;
|
|
|
- first_load = 0;
|
|
|
- } else {
|
|
|
- argv = backup_argv;
|
|
|
- argc = backup_argc;
|
|
|
-
|
|
|
-
|
|
|
- if (options->PidFile)
|
|
|
- previous_pidfile = tor_strdup(options->PidFile);
|
|
|
- previous_runasdaemon = options->RunAsDaemon;
|
|
|
- previous_orport = options->ORPort;
|
|
|
- free_options(options);
|
|
|
- }
|
|
|
- init_options(options);
|
|
|
-
|
|
|
- if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) {
|
|
|
- print_usage();
|
|
|
- exit(0);
|
|
|
- }
|
|
|
-
|
|
|
- if (argc > 1 && (!strcmp(argv[1],"--version"))) {
|
|
|
- printf("Tor version %s.\n",VERSION);
|
|
|
- exit(0);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- fname = NULL;
|
|
|
- using_default_torrc = 1;
|
|
|
- options->command = CMD_RUN_TOR;
|
|
|
- for (i = 1; i < argc; ++i) {
|
|
|
- if (i < argc-1 && !strcmp(argv[i],"-f")) {
|
|
|
- if (fname) {
|
|
|
- log(LOG_WARN, "Duplicate -f options on command line.");
|
|
|
- tor_free(fname);
|
|
|
- }
|
|
|
- fname = tor_strdup(argv[i+1]);
|
|
|
- using_default_torrc = 0;
|
|
|
- ++i;
|
|
|
- } else if (!strcmp(argv[i],"--list-fingerprint")) {
|
|
|
- options->command = CMD_LIST_FINGERPRINT;
|
|
|
- } else if (!strcmp(argv[i],"--hash-password")) {
|
|
|
- options->command = CMD_HASH_PASSWORD;
|
|
|
- options->command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : "");
|
|
|
- ++i;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (using_default_torrc) {
|
|
|
-
|
|
|
- char *fn;
|
|
|
- fn = get_default_conf_file();
|
|
|
- if (fn && file_status(fn) == FN_FILE) {
|
|
|
- fname = fn;
|
|
|
- } else {
|
|
|
- tor_free(fn);
|
|
|
- fn = expand_filename("~/.torrc");
|
|
|
- if (fn && file_status(fn) == FN_FILE) {
|
|
|
- fname = fn;
|
|
|
- } else {
|
|
|
- tor_free(fn);
|
|
|
- fname = get_default_conf_file();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- tor_assert(fname);
|
|
|
- log(LOG_DEBUG, "Opening config file '%s'", fname);
|
|
|
-
|
|
|
- cf = fopen(fname, "r");
|
|
|
- if (!cf) {
|
|
|
- if (using_default_torrc == 1) {
|
|
|
- log(LOG_NOTICE, "Configuration file '%s' not present, "
|
|
|
- "using reasonable defaults.", fname);
|
|
|
- tor_free(fname);
|
|
|
- } else {
|
|
|
- log(LOG_WARN, "Unable to open configuration file '%s'.", fname);
|
|
|
- tor_free(fname);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- } else {
|
|
|
- tor_free(fname);
|
|
|
- if (config_get_lines(cf, &cl)<0)
|
|
|
- return -1;
|
|
|
- if (config_assign(options,cl) < 0)
|
|
|
- return -1;
|
|
|
- config_free_lines(cl);
|
|
|
- fclose(cf);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- cl = config_get_commandlines(argc,argv);
|
|
|
- if (config_assign(options,cl) < 0)
|
|
|
- return -1;
|
|
|
- config_free_lines(cl);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if (previous_pidfile && strcmp(previous_pidfile,options->PidFile)) {
|
|
|
- log_fn(LOG_WARN,"During reload, PidFile changed from %s to %s. Failing.",
|
|
|
- previous_pidfile, options->PidFile);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- tor_free(previous_pidfile);
|
|
|
+smartlist_t *config_get_default_firewallports(void) {
|
|
|
+ static smartlist_t *answer;
|
|
|
|
|
|
- if (previous_runasdaemon && !options->RunAsDaemon) {
|
|
|
- log_fn(LOG_WARN,"During reload, change from RunAsDaemon=1 to =0 not allowed. Failing.");
|
|
|
- return -1;
|
|
|
+ if(!answer) {
|
|
|
+ answer = smartlist_create();
|
|
|
+ smartlist_add(answer, tor_strdup("80"));
|
|
|
+ smartlist_add(answer, tor_strdup("443"));
|
|
|
}
|
|
|
+ return answer;
|
|
|
+}
|
|
|
|
|
|
- if (previous_orport == 0 && options->ORPort > 0) {
|
|
|
- log_fn(LOG_WARN,"During reload, change from ORPort=0 to >0 not allowed. Failing.");
|
|
|
- return -1;
|
|
|
- }
|
|
|
+static int
|
|
|
+validate_options(or_options_t *options)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int result = 0;
|
|
|
+ struct config_line_t *cl;
|
|
|
|
|
|
if (options->ORPort < 0 || options->ORPort > 65535) {
|
|
|
log(LOG_WARN, "ORPort option out of bounds.");
|
|
@@ -944,11 +827,6 @@ getconfig(int argc, char **argv, or_options_t *options)
|
|
|
result = -1;
|
|
|
}
|
|
|
|
|
|
- if (options->FascistFirewall && !options->FirewallPorts) {
|
|
|
- options->FirewallPorts = smartlist_create();
|
|
|
- smartlist_add(options->FirewallPorts, tor_strdup("80"));
|
|
|
- smartlist_add(options->FirewallPorts, tor_strdup("443"));
|
|
|
- }
|
|
|
if (options->FirewallPorts) {
|
|
|
SMARTLIST_FOREACH(options->FirewallPorts, const char *, cp,
|
|
|
{
|
|
@@ -1032,27 +910,28 @@ getconfig(int argc, char **argv, or_options_t *options)
|
|
|
}
|
|
|
|
|
|
if (check_nickname_list(options->ExitNodes, "ExitNodes"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
if (check_nickname_list(options->EntryNodes, "EntryNodes"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
if (check_nickname_list(options->ExcludeNodes, "ExcludeNodes"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
if (check_nickname_list(options->RendNodes, "RendNodes"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
if (check_nickname_list(options->RendNodes, "RendExcludeNodes"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
if (check_nickname_list(options->MyFamily, "MyFamily"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
for (cl = options->NodeFamilies; cl; cl = cl->next) {
|
|
|
if (check_nickname_list(cl->value, "NodeFamily"))
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
}
|
|
|
|
|
|
if (!options->RedirectExitList)
|
|
|
options->RedirectExitList = smartlist_create();
|
|
|
+
|
|
|
for (cl = options->RedirectExit; cl; cl = cl->next) {
|
|
|
if (parse_redirect_line(options, cl)<0)
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
}
|
|
|
|
|
|
clear_trusted_dir_servers();
|
|
@@ -1061,10 +940,149 @@ getconfig(int argc, char **argv, or_options_t *options)
|
|
|
} else {
|
|
|
for (cl = options->DirServers; cl; cl = cl->next) {
|
|
|
if (parse_dir_server_line(cl->value)<0)
|
|
|
- return -1;
|
|
|
+ result = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * file location based on the command line. After loading the options,
|
|
|
+ * validate them for consistency. Return 0 if success, <0 if failure. */
|
|
|
+int
|
|
|
+getconfig(int argc, char **argv, or_options_t *options)
|
|
|
+{
|
|
|
+ struct config_line_t *cl;
|
|
|
+ FILE *cf;
|
|
|
+ char *fname;
|
|
|
+ int i;
|
|
|
+ int result = 0;
|
|
|
+ int using_default_torrc;
|
|
|
+ static char **backup_argv;
|
|
|
+ static int backup_argc;
|
|
|
+ char *previous_pidfile = NULL;
|
|
|
+ int previous_runasdaemon = 0;
|
|
|
+ int previous_orport = -1;
|
|
|
+
|
|
|
+ if (argv) {
|
|
|
+ backup_argv = argv;
|
|
|
+ backup_argc = argc;
|
|
|
+ } else {
|
|
|
+ argv = backup_argv;
|
|
|
+ argc = backup_argc;
|
|
|
+
|
|
|
+
|
|
|
+ if (options->PidFile)
|
|
|
+ previous_pidfile = tor_strdup(options->PidFile);
|
|
|
+ previous_runasdaemon = options->RunAsDaemon;
|
|
|
+ previous_orport = options->ORPort;
|
|
|
+ free_options(options);
|
|
|
+ }
|
|
|
+ init_options(options);
|
|
|
+
|
|
|
+ if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1],"--help"))) {
|
|
|
+ print_usage();
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (argc > 1 && (!strcmp(argv[1],"--version"))) {
|
|
|
+ printf("Tor version %s.\n",VERSION);
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ fname = NULL;
|
|
|
+ using_default_torrc = 1;
|
|
|
+ options->command = CMD_RUN_TOR;
|
|
|
+ for (i = 1; i < argc; ++i) {
|
|
|
+ if (i < argc-1 && !strcmp(argv[i],"-f")) {
|
|
|
+ if (fname) {
|
|
|
+ log(LOG_WARN, "Duplicate -f options on command line.");
|
|
|
+ tor_free(fname);
|
|
|
+ }
|
|
|
+ fname = tor_strdup(argv[i+1]);
|
|
|
+ using_default_torrc = 0;
|
|
|
+ ++i;
|
|
|
+ } else if (!strcmp(argv[i],"--list-fingerprint")) {
|
|
|
+ options->command = CMD_LIST_FINGERPRINT;
|
|
|
+ } else if (!strcmp(argv[i],"--hash-password")) {
|
|
|
+ options->command = CMD_HASH_PASSWORD;
|
|
|
+ options->command_arg = tor_strdup( (i < argc-1) ? argv[i+1] : "");
|
|
|
+ ++i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (using_default_torrc) {
|
|
|
+
|
|
|
+ char *fn;
|
|
|
+ fn = get_default_conf_file();
|
|
|
+ if (fn && file_status(fn) == FN_FILE) {
|
|
|
+ fname = fn;
|
|
|
+ } else {
|
|
|
+ tor_free(fn);
|
|
|
+ fn = expand_filename("~/.torrc");
|
|
|
+ if (fn && file_status(fn) == FN_FILE) {
|
|
|
+ fname = fn;
|
|
|
+ } else {
|
|
|
+ tor_free(fn);
|
|
|
+ fname = get_default_conf_file();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tor_assert(fname);
|
|
|
+ log(LOG_DEBUG, "Opening config file '%s'", fname);
|
|
|
+
|
|
|
+ cf = fopen(fname, "r");
|
|
|
+ if (!cf) {
|
|
|
+ if (using_default_torrc == 1) {
|
|
|
+ log(LOG_NOTICE, "Configuration file '%s' not present, "
|
|
|
+ "using reasonable defaults.", fname);
|
|
|
+ tor_free(fname);
|
|
|
+ } else {
|
|
|
+ log(LOG_WARN, "Unable to open configuration file '%s'.", fname);
|
|
|
+ tor_free(fname);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ tor_free(fname);
|
|
|
+ if (config_get_lines(cf, &cl)<0)
|
|
|
+ return -1;
|
|
|
+ if (config_assign(options,cl) < 0)
|
|
|
+ return -1;
|
|
|
+ config_free_lines(cl);
|
|
|
+ fclose(cf);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ cl = config_get_commandlines(argc,argv);
|
|
|
+ if (config_assign(options,cl) < 0)
|
|
|
+ return -1;
|
|
|
+ config_free_lines(cl);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (previous_pidfile && strcmp(previous_pidfile,options->PidFile)) {
|
|
|
+ log_fn(LOG_WARN,"During reload, PidFile changed from %s to %s. Failing.",
|
|
|
+ previous_pidfile, options->PidFile);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ tor_free(previous_pidfile);
|
|
|
+
|
|
|
+ if (previous_runasdaemon && !options->RunAsDaemon) {
|
|
|
+ log_fn(LOG_WARN,"During reload, change from RunAsDaemon=1 to =0 not allowed. Failing.");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (previous_orport == 0 && options->ORPort > 0) {
|
|
|
+ log_fn(LOG_WARN,"During reload, change from ORPort=0 to >0 not allowed. Failing.");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (validate_options(options) < 0)
|
|
|
+ result = -1;
|
|
|
+
|
|
|
if (rend_config_services(options) < 0) {
|
|
|
result = -1;
|
|
|
}
|