summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/or/config.c3
-rw-r--r--src/or/dns.c10
-rw-r--r--src/or/or.h4
3 files changed, 11 insertions, 6 deletions
diff --git a/src/or/config.c b/src/or/config.c
index cca9a3c402..522e0c06fc 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -265,6 +265,7 @@ static config_var_t _option_vars[] = {
V(RunTesting, BOOL, "0"),
V(SafeLogging, BOOL, "1"),
V(SafeSocks, BOOL, "0"),
+ V(ServerDNSAllowBrokenResolvConf, BOOL, "0"),
V(ServerDNSAllowNonRFC953Hostnames, BOOL,"0"),
V(ServerDNSDetectHijacking, BOOL, "1"),
V(ServerDNSResolvConfFile, STRING, NULL),
@@ -3252,7 +3253,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
options->V3AuthVotingInterval/2) {
- REJECT("V3AuthVoteDelay and V3AuthDistDelay must be no more than half "
+ REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
"V3AuthVotingInterval");
}
if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS)
diff --git a/src/or/dns.c b/src/or/dns.c
index 79af4f0607..e1a56e4c1f 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -1108,7 +1108,7 @@ configure_nameservers(int force)
if (stat(conf_fname, &st)) {
log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s",
conf_fname, strerror(errno));
- return -1;
+ return options->ServerDNSAllowBrokenResolvConf ? 0 : -1;
}
if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname)
&& st.st_mtime == resolv_conf_mtime) {
@@ -1123,11 +1123,11 @@ configure_nameservers(int force)
if ((r = evdns_resolv_conf_parse(DNS_OPTIONS_ALL, conf_fname))) {
log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)",
conf_fname, conf_fname, r);
- return -1;
+ return options->ServerDNSAllowBrokenResolvConf ? 0 : -1;
}
if (evdns_count_nameservers() == 0) {
log_warn(LD_EXIT, "Unable to find any nameservers in '%s'.", conf_fname);
- return -1;
+ return options->ServerDNSAllowBrokenResolvConf ? 0 : -1;
}
tor_free(resolv_conf_fname);
resolv_conf_fname = tor_strdup(conf_fname);
@@ -1143,13 +1143,13 @@ configure_nameservers(int force)
}
if (evdns_config_windows_nameservers()) {
log_warn(LD_EXIT,"Could not config nameservers.");
- return -1;
+ return options->ServerDNSAllowBrokenResolvConf ? 0 : -1;
}
if (evdns_count_nameservers() == 0) {
log_warn(LD_EXIT, "Unable to find any platform nameservers in "
"your Windows configuration. Perhaps you should list a "
"ServerDNSResolvConfFile file in your torrc?");
- return -1;
+ return options->ServerDNSAllowBrokenResolvConf ? 0 : -1;
}
if (nameservers_configured)
evdns_resume();
diff --git a/src/or/or.h b/src/or/or.h
index 9ec57784fd..c2c4c0c560 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2291,6 +2291,10 @@ typedef struct {
char *ServerDNSResolvConfFile; /**< If provided, we configure our internal
* resolver from the file here rather than from
* /etc/resolv.conf (Unix) or the registry (Windows). */
+ /** Boolean: if set, we start even if our resolv.conf file is missing
+ * or broken. */
+ int ServerDNSAllowBrokenResolvConf;
+
smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely
* should be resolveable. Used for
* testing our DNS server. */