diff options
author | Nick Mathewson <nickm@torproject.org> | 2008-12-10 20:45:31 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2008-12-10 20:45:31 +0000 |
commit | 9aa706e20c3ae91f6cac95964e291076b88ecd48 (patch) | |
tree | aa50df5ac10c25413d7321fba023fe2f4ade3360 /src/or/dns.c | |
parent | 355369a27a86942b34010392167ec9d284e294e4 (diff) | |
download | tor-9aa706e20c3ae91f6cac95964e291076b88ecd48.tar.gz tor-9aa706e20c3ae91f6cac95964e291076b88ecd48.zip |
Bug 691 fix: do not shutdown Tor servers right away if the network is down.
svn:r17566
Diffstat (limited to 'src/or/dns.c')
-rw-r--r-- | src/or/dns.c | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/src/or/dns.c b/src/or/dns.c index 03dc85f421..2b6ea88482 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -33,6 +33,8 @@ const char dns_c_id[] = /** Have we currently configured nameservers with eventdns? */ static int nameservers_configured = 0; +/** Did our most recent attempt to configure nameservers with eventdns fail? */ +static int nameserver_config_failed = 0; /** What was the resolv_conf fname we last used when configuring the * nameservers? Used to check whether we need to reconfigure. */ static char *resolv_conf_fname = NULL; @@ -220,12 +222,20 @@ dns_reset(void) tor_free(resolv_conf_fname); resolv_conf_mtime = 0; } else { - if (configure_nameservers(0) < 0) + if (configure_nameservers(0) < 0) { return -1; + } } return 0; } +/**DOCDOC*/ +int +has_dns_init_failed(void) +{ + return nameserver_config_failed; +} + /** Helper: Given a TTL from a DNS response, determine what TTL to give the * OP that asked us to resolve it. */ uint32_t @@ -1109,10 +1119,11 @@ evdns_err_is_transient(int err) } /** Configure eventdns nameservers if force is true, or if the configuration - * has changed since the last time we called this function. On Unix, this - * reads from options->ServerDNSResolvConfFile or /etc/resolv.conf; on - * Windows, this reads from options->ServerDNSResolvConfFile or the registry. - * Return 0 on success or -1 on failure. */ + * has changed since the last time we called this function, or if we failed on + * our last attempt. On Unix, this reads from /etc/resolv.conf or + * options->ServerDNSResolvConfFile; on Windows, this reads from + * options->ServerDNSResolvConfFile or the registry. Return 0 on success or + * -1 on failure. */ static int configure_nameservers(int force) { @@ -1132,7 +1143,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 options->ServerDNSAllowBrokenResolvConf ? 0 : -1; + goto err; } if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname) && st.st_mtime == resolv_conf_mtime) { @@ -1147,11 +1158,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 options->ServerDNSAllowBrokenResolvConf ? 0 : -1; + goto err; } if (evdns_count_nameservers() == 0) { log_warn(LD_EXIT, "Unable to find any nameservers in '%s'.", conf_fname); - return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; + goto err; } tor_free(resolv_conf_fname); resolv_conf_fname = tor_strdup(conf_fname); @@ -1167,13 +1178,12 @@ configure_nameservers(int force) } if (evdns_config_windows_nameservers()) { log_warn(LD_EXIT,"Could not config nameservers."); - return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; + goto err; } 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 options->ServerDNSAllowBrokenResolvConf ? 0 : -1; + "your Windows configuration."); + goto err; } if (nameservers_configured) evdns_resume(); @@ -1193,7 +1203,18 @@ configure_nameservers(int force) dns_servers_relaunch_checks(); nameservers_configured = 1; + if (nameserver_config_failed) { + nameserver_config_failed = 0; + mark_my_descriptor_dirty(); + } return 0; + err: + nameservers_configured = 0; + if (! nameserver_config_failed) { + nameserver_config_failed = 1; + mark_my_descriptor_dirty(); + } + return -1; } /** For eventdns: Called when we get an answer for a request we launched. @@ -1284,8 +1305,9 @@ launch_resolve(edge_connection_t *exitconn) if (!nameservers_configured) { log_warn(LD_EXIT, "(Harmless.) Nameservers not configured, but resolve " "launched. Configuring."); - if (configure_nameservers(1) < 0) + if (configure_nameservers(1) < 0) { return -1; + } } r = parse_inaddr_arpa_address(exitconn->_base.address, &in); |