- Henrik Stoerner: found out that C-ARES does not look at the /etc/host.conf
authorDaniel Stenberg <daniel@haxx.se>
Sun, 26 Sep 2004 22:35:18 +0000 (22:35 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 26 Sep 2004 22:35:18 +0000 (22:35 +0000)
  file to determine the sequence in which to search /etc/hosts and DNS.  So on
  systems where this order is defined by /etc/host.conf instead of a "lookup"
  entry in /etc/resolv.conf, C-ARES will always default to looking in DNS
  first, and /etc/hosts second.

  c-ares now looks at

  1) resolv.conf (for the "lookup" line);
  2) nsswitch.fon (for the "hosts:" line);
  3) host.conf (for the "order" line).

  First match wins.

ares/CHANGES
ares/ares_init.c

index 0c3d6a3..f331b70 100644 (file)
@@ -2,6 +2,20 @@
 
 * September 26
 
+- Henrik Stoerner: found out that C-ARES does not look at the /etc/host.conf
+  file to determine the sequence in which to search /etc/hosts and DNS.  So on
+  systems where this order is defined by /etc/host.conf instead of a "lookup"
+  entry in /etc/resolv.conf, C-ARES will always default to looking in DNS
+  first, and /etc/hosts second.
+
+  c-ares now looks at
+
+  1) resolv.conf (for the "lookup" line);
+  2) nsswitch.fon (for the "hosts:" line);
+  3) host.conf (for the "order" line).
+
+  First match wins.
+
 - Dominick Meglio patched: C-ares on Windows assumed that the HOSTS file is
   located in a static location. It assumed
   C:\Windows\System32\Drivers\Etc. This is a poor assumption to make. In fact,
index 1d4a015..78d865c 100644 (file)
@@ -55,7 +55,8 @@ static int init_by_environment(ares_channel channel);
 static int init_by_resolv_conf(ares_channel channel);
 static int init_by_defaults(ares_channel channel);
 static int config_domain(ares_channel channel, char *str);
-static int config_lookup(ares_channel channel, const char *str);
+static int config_lookup(ares_channel channel, const char *str,
+                         const char *bindch, const char *filech);
 static int config_nameserver(struct server_state **servers, int *nservers,
                             char *str);
 static int config_sortlist(struct apattern **sortlist, int *nsort,
@@ -549,7 +550,7 @@ DhcpNameServer
       if ((p = try_config(line, "domain")))
         status = config_domain(channel, p);
       else if ((p = try_config(line, "lookup")) && !channel->lookups)
-        status = config_lookup(channel, p);
+        status = config_lookup(channel, p, "bind", "file");
       else if ((p = try_config(line, "search")))
         status = set_search(channel, p);
       else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
@@ -563,9 +564,33 @@ DhcpNameServer
       if (status != ARES_SUCCESS)
         break;
     }
+    fclose(fp);
+
+    if (!channel->lookups) {
+      fp = fopen("/etc/nsswitch.conf", "r");
+      if (fp) {
+        while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
+        {
+          if ((p = try_config(line, "hosts:")) && !channel->lookups)
+            status = config_lookup(channel, p, "dns", "files");
+        }
+        fclose(fp);
+      }
+    }
+    if (!channel->lookups) {
+      fp = fopen("/etc/host.conf", "r");
+      if (fp) {
+        while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
+        {
+          if ((p = try_config(line, "order")) && !channel->lookups)
+            status = config_lookup(channel, p, "bind", "hosts");
+        }
+        fclose(fp);
+      }
+    }
+
     if(line)
       free(line);
-    fclose(fp);
   }
 
 #endif
@@ -679,7 +704,8 @@ static int config_domain(ares_channel channel, char *str)
   return set_search(channel, str);
 }
 
-static int config_lookup(ares_channel channel, const char *str)
+static int config_lookup(ares_channel channel, const char *str,
+                         const char *bindch, const char *filech)
 {
   char lookups[3], *l;
   const char *p;
@@ -692,11 +718,13 @@ static int config_lookup(ares_channel channel, const char *str)
   p = str;
   while (*p)
     {
-      if ((*p == 'b' || *p == 'f') && l < lookups + 2)
-       *l++ = *p;
-      while (*p && !isspace((unsigned char)*p))
+      if ((*p == *bindch || *p == *filech) && l < lookups + 2) {
+       if (*p == *bindch) *l++ = 'b';
+        else *l++ = 'f';
+      }
+      while (*p && !isspace((unsigned char)*p) && (*p != ','))
        p++;
-      while (isspace((unsigned char)*p))
+      while (*p && (isspace((unsigned char)*p) || (*p == ',')))
        p++;
     }
   *l = 0;