Forráskód Böngészése

New config option ServerDNSAllowBrokenResolvConf to start a relay
even when the local resolv.conf file is missing, broken, or contains
only unusable nameservers.

Now I can run a local network on my laptop when I'm on an airplane.


svn:r13402

Roger Dingledine 16 éve
szülő
commit
c054f90f02
3 módosított fájl, 11 hozzáadás és 6 törlés
  1. 2 1
      src/or/config.c
  2. 5 5
      src/or/dns.c
  3. 4 0
      src/or/or.h

+ 2 - 1
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)

+ 5 - 5
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();

+ 4 - 0
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. */