You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/09/30 19:35:44 UTC

svn commit: r1003179 - in /trafficserver/traffic/trunk: contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm iocore/dns/DNS.cc libinktomi++/ink_res_init.cc libinktomi++/ink_resolver.h proxy/config/records.config.in proxy/mgmt2/RecordsConfig.cc

Author: zwoop
Date: Thu Sep 30 17:35:43 2010
New Revision: 1003179

URL: http://svn.apache.org/viewvc?rev=1003179&view=rev
Log:
TS-313 Better support and handling of DNS round-robin options.

Author: Zhao Yongming
Review: Leif Hedstrom (and small cleanup)

Modified:
    trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm
    trafficserver/traffic/trunk/iocore/dns/DNS.cc
    trafficserver/traffic/trunk/libinktomi++/ink_res_init.cc
    trafficserver/traffic/trunk/libinktomi++/ink_resolver.h
    trafficserver/traffic/trunk/proxy/config/records.config.in
    trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc

Modified: trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm (original)
+++ trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm Thu Sep 30 17:35:43 2010
@@ -314,8 +314,7 @@ The Apache Traffic Server Administration
  proxy.config.dns.lookup_timeout
  proxy.config.dns.max_dns_in_flight
  proxy.config.dns.nameservers
- proxy.config.dns.proxy.enabled
- proxy.config.dns.proxy_port
+ proxy.config.dns.resolv_conf
  proxy.config.dns.retries
  proxy.config.dns.round_robin_nameservers
  proxy.config.dns.search_default_domains

Modified: trafficserver/traffic/trunk/iocore/dns/DNS.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/dns/DNS.cc?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/dns/DNS.cc (original)
+++ trafficserver/traffic/trunk/iocore/dns/DNS.cc Thu Sep 30 17:35:43 2010
@@ -49,6 +49,7 @@ unsigned int dns_handler_initialized = 0
 int dns_ns_rr = 0;
 int dns_ns_rr_init_down = 1;
 char *dns_ns_list = NULL;
+char *dns_resolv_conf = NULL;
 
 DNSProcessor dnsProcessor;
 ClassAllocator<DNSEntry> dnsEntryAllocator("dnsEntryAllocator");
@@ -120,6 +121,7 @@ DNSProcessor::start(int)
   IOCORE_EstablishStaticConfigInt32(dns_validate_qname, "proxy.config.dns.validate_query_name");
   IOCORE_EstablishStaticConfigInt32(dns_ns_rr, "proxy.config.dns.round_robin_nameservers");
   IOCORE_ReadConfigStringAlloc(dns_ns_list, "proxy.config.dns.nameservers");
+  IOCORE_ReadConfigStringAlloc(dns_resolv_conf, "proxy.config.dns.resolv_conf");
 
   dns_failover_try_period = dns_timeout + 1;    // Modify the "default" accordingly
 
@@ -157,7 +159,7 @@ DNSProcessor::dns_init()
   Debug("dns", "localhost=%s\n", try_server_names[0]);
   Debug("dns", "Round-robin nameservers = %d\n", dns_ns_rr);
 
-  if (dns_ns_rr && dns_ns_list) {
+  if (dns_ns_list) {
     Debug("dns", "Nameserver list specified \"%s\"\n", dns_ns_list);
     uint32 nameserver_ip[MAX_NAMED];
     int nameserver_port[MAX_NAMED];
@@ -197,18 +199,16 @@ DNSProcessor::dns_init()
       ns = (char *) ink_strtok_r(NULL, " ,;\t\r", &last);
     }
     xfree(ns_list);
-
     // Terminate the list for ink_res_init
     nameserver_ip[j] = 0;
 
     // The default domain (4th param) and search list (5th param) will
     // come from /etc/resolv.conf.
-    if (ink_res_init(&l_res, &nameserver_ip[0], &nameserver_port[0], NULL, NULL) < 0)
+    if (ink_res_init(&l_res, &nameserver_ip[0], &nameserver_port[0], NULL, NULL, dns_resolv_conf) < 0)
       Warning("Failed to build DNS res records for the servers (%s).  Using resolv.conf.", dns_ns_list);
   } else {
-    if (ink_res_init(&l_res, 0, 0, 0, 0) < 0)
+    if (ink_res_init(&l_res, NULL, NULL, NULL, NULL, dns_resolv_conf) < 0)
       Warning("Failed to build DNS res records for the servers (%s).  Using resolv.conf.", dns_ns_list);
-    dns_ns_rr = 0;
   }
 }
 
@@ -369,8 +369,8 @@ DNSHandler::startEvent(int event, Event 
   if (ip == DEFAULT_DOMAIN_NAME_SERVER) {
     // seems that res_init always sets m_res.nscount to at least 1!
     if (!m_res->nscount)
-      Warning("bad '/etc/resolv.conf': no nameservers given");
-    struct sockaddr_in *sa = &m_res->nsaddr_list[0];
+      Warning("bad configurations: no nameservers given");
+    struct sockaddr_in *sa = &m_res->nsaddr_list[0].sin;
     ip = sa->sin_addr.s_addr;
     if (!ip)
       ip = ink_inet_addr("127.0.0.1");
@@ -390,7 +390,7 @@ DNSHandler::startEvent(int event, Event 
         max_nscount = MAX_NAMED;
       n_con = 0;
       for (int i = 0; i < max_nscount; i++) {
-        struct sockaddr_in *sa = &m_res->nsaddr_list[i];
+        struct sockaddr_in *sa = &m_res->nsaddr_list[i].sin;
         ip = sa->sin_addr.s_addr;
         if (ip) {
           port = ntohs(sa->sin_port);
@@ -432,7 +432,7 @@ DNSHandler::startEvent_sdns(int event, E
     // seems that res_init always sets m_res.nscount to at least 1!
     if (!m_res->nscount)
       Warning("bad '/etc/resolv.conf': no nameservers given");
-    struct sockaddr_in *sa = &m_res->nsaddr_list[0];
+    struct sockaddr_in *sa = &m_res->nsaddr_list[0].sin;
     ip = sa->sin_addr.s_addr;
     if (!ip)
       ip = ink_inet_addr("127.0.0.1");
@@ -472,7 +472,7 @@ DNSHandler::retry_named(int ndx, ink_hrt
     last_primary_reopen = t;
     con[ndx].close();
     struct sockaddr_in *sa;
-    sa = &m_res->nsaddr_list[ndx];
+    sa = &m_res->nsaddr_list[ndx].sin;
     ip = sa->sin_addr.s_addr;
     port = ntohs(sa->sin_port);
 
@@ -543,11 +543,11 @@ DNSHandler::failover()
 
     if (max_nscount > MAX_NAMED)
       max_nscount = MAX_NAMED;
-    unsigned int old_ip = m_res->nsaddr_list[name_server].sin_addr.s_addr;
+    unsigned int old_ip = m_res->nsaddr_list[name_server].sin.sin_addr.s_addr;
     name_server = (name_server + 1) % max_nscount;
     Debug("dns", "failover: failing over to name_server=%d", name_server);
 
-    struct sockaddr_in *sa = &m_res->nsaddr_list[name_server];
+    struct sockaddr_in *sa = &m_res->nsaddr_list[name_server].sin;
 
     Warning("failover: connection to DNS server %d.%d.%d.%d lost, move to %d.%d.%d.%d",
             DOT_SEPARATED(old_ip), DOT_SEPARATED(sa->sin_addr.s_addr));
@@ -574,7 +574,7 @@ DNSHandler::rr_failure(int ndx)
     Debug("dns", "rr_failure: Marking nameserver %d as down", ndx);
     ns_down[ndx] = 1;
 
-    struct sockaddr_in *sa = &m_res->nsaddr_list[ndx];
+    struct sockaddr_in *sa = &m_res->nsaddr_list[ndx].sin;
     unsigned int tip = sa->sin_addr.s_addr;
     Warning("connection to DNS server %d.%d.%d.%d lost, marking as down", DOT_SEPARATED(tip));
   }
@@ -673,7 +673,7 @@ DNSHandler::recv_dns(int event, Event * 
         if (good_rcode(buf->buf)) {
           received_one(dnsc->num);
           if (ns_down[dnsc->num]) {
-            struct sockaddr_in *sa = &m_res->nsaddr_list[dnsc->num];
+            struct sockaddr_in *sa = &m_res->nsaddr_list[dnsc->num].sin;
             Warning("connection to DNS server %d.%d.%d.%d restored", DOT_SEPARATED(sa->sin_addr.s_addr));
             ns_down[dnsc->num] = 0;
           }

Modified: trafficserver/traffic/trunk/libinktomi++/ink_res_init.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/libinktomi%2B%2B/ink_res_init.cc?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/libinktomi++/ink_res_init.cc (original)
+++ trafficserver/traffic/trunk/libinktomi++/ink_res_init.cc Thu Sep 30 17:35:43 2010
@@ -103,6 +103,10 @@ static u_int32_t net_mask __P((struct in
 # define isascii(c) (!(c & 0200))
 #endif
 
+#define DOT_SEPARATED(_x)                                   \
+  ((unsigned char*)&(_x))[0], ((unsigned char*)&(_x))[1],   \
+    ((unsigned char*)&(_x))[2], ((unsigned char*)&(_x))[3]
+
 /*%
  * This routine is for closing the socket if a virtual circuit is used and
  * the program wants to close it.  This provides support for endhostent()
@@ -153,13 +157,11 @@ ink_res_setservers(ink_res_state statp, 
       case AF_INET:
         size = sizeof(set->sin);
         if (statp->_u._ext.ext)
-          memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
-                 &set->sin, size);
-        if (size <= sizeof(statp->nsaddr_list[nserv]))
-          memcpy(&statp->nsaddr_list[nserv],
-                 &set->sin, size);
+          memcpy(&statp->_u._ext.ext->nsaddrs[nserv], &set->sin, size);
+        if (size <= sizeof(statp->nsaddr_list[nserv].sin))
+          memcpy(&statp->nsaddr_list[nserv].sin, &set->sin, size);
         else
-          statp->nsaddr_list[nserv].sin_family = 0;
+          statp->nsaddr_list[nserv].sin.sin_family = 0;
         nserv++;
         break;
 
@@ -167,13 +169,11 @@ ink_res_setservers(ink_res_state statp, 
       case AF_INET6:
         size = sizeof(set->sin6);
         if (statp->_u._ext.ext)
-          memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
-                 &set->sin6, size);
-        if (size <= sizeof(statp->nsaddr_list[nserv]))
-          memcpy(&statp->nsaddr_list[nserv],
-                 &set->sin6, size);
+          memcpy(&statp->_u._ext.ext->nsaddrs[nserv], &set->sin6, size);
+        if (size <= sizeof(statp->nsaddr_list[nserv].sin6))
+          memcpy(&statp->nsaddr_list[nserv].sin6, &set->sin6, size);
         else
-          statp->nsaddr_list[nserv].sin_family = 0;
+          statp->nsaddr_list[nserv].sin6.sin6_family = 0;
         nserv++;
         break;
 #endif
@@ -184,7 +184,6 @@ ink_res_setservers(ink_res_state statp, 
     set++;
   }
   statp->nscount = nserv;
-
 }
 
 int
@@ -197,30 +196,24 @@ ink_res_getservers(ink_res_state statp, 
     if (statp->_u._ext.ext)
       family = statp->_u._ext.ext->nsaddrs[i].sin.sin_family;
     else
-      family = statp->nsaddr_list[i].sin_family;
+      family = statp->nsaddr_list[i].sin.sin_family;
 
     switch (family) {
       case AF_INET:
         size = sizeof(set->sin);
         if (statp->_u._ext.ext)
-          memcpy(&set->sin,
-                 &statp->_u._ext.ext->nsaddrs[i],
-                 size);
+          memcpy(&set->sin, &statp->_u._ext.ext->nsaddrs[i], size);
         else
-          memcpy(&set->sin, &statp->nsaddr_list[i],
-                 size);
+          memcpy(&set->sin, &statp->nsaddr_list[i].sin, size);
         break;
 
 #ifdef HAS_INET6_STRUCTS
       case AF_INET6:
         size = sizeof(set->sin6);
         if (statp->_u._ext.ext)
-          memcpy(&set->sin6,
-                 &statp->_u._ext.ext->nsaddrs[i],
-                 size);
+          memcpy(&set->sin6, &statp->_u._ext.ext->nsaddrs[i], size);
         else
-          memcpy(&set->sin6, &statp->nsaddr_list[i],
-                 size);
+          memcpy(&set->sin6, &statp->nsaddr_list[i].sin6, size);
         break;
 #endif
 
@@ -243,8 +236,7 @@ ink_res_setoptions(ink_res_state statp, 
 
 #ifdef DEBUG
   if (statp->options & INK_RES_DEBUG)
-    printf(";; res_setoptions(\"%s\", \"%s\")...\n",
-           options, source);
+    printf(";; res_setoptions(\"%s\", \"%s\")...\n", options, source);
 #endif
   while (*cp) {
     /* skip leading and inner runs of spaces */
@@ -300,23 +292,19 @@ ink_res_setoptions(ink_res_state statp, 
     } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) {
 #ifdef DEBUG
       if (!(statp->options & INK_RES_DEBUG)) {
-        printf(";; res_setoptions(\"%s\", \"%s\")..\n",
-               options, source);
+        printf(";; res_setoptions(\"%s\", \"%s\")..\n", options, source);
         statp->options |= INK_RES_DEBUG;
       }
       printf(";;\tdebug\n");
 #endif
-    } else if (!strncmp(cp, "no_tld_query",
-                        sizeof("no_tld_query") - 1) ||
-               !strncmp(cp, "no-tld-query",
-                        sizeof("no-tld-query") - 1)) {
+    } else if (!strncmp(cp, "no_tld_query", sizeof("no_tld_query") - 1) ||
+               !strncmp(cp, "no-tld-query", sizeof("no-tld-query") - 1)) {
       statp->options |= INK_RES_NOTLDQUERY;
     } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) {
       statp->options |= INK_RES_USE_INET6;
     } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) {
       statp->options |= INK_RES_ROTATE;
-    } else if (!strncmp(cp, "no-check-names",
-                        sizeof("no-check-names") - 1)) {
+    } else if (!strncmp(cp, "no-check-names", sizeof("no-check-names") - 1)) {
       statp->options |= INK_RES_NOCHECKNAME;
     }
 #ifdef INK_RES_USE_EDNS0
@@ -349,8 +337,7 @@ ink_res_setoptions(ink_res_state statp, 
       if (!strncmp(cp, "single", sizeof("single") - 1)) {
         statp->options |= INK_RES_NO_NIBBLE2;
       } else if (!strncmp(cp, "both", sizeof("both") - 1)) {
-        statp->options &=
-          ~INK_RES_NO_NIBBLE2;
+        statp->options &= ~INK_RES_NO_NIBBLE2;
       }
     }
     else {
@@ -424,12 +411,12 @@ ink_res_get_nibblesuffix2(ink_res_state 
  */
 /*% This function has to be reachable by res_data.c but not publically. */
 int
-ink_res_init(ink_res_state statp, unsigned int *pHostList, int *pPort, char *pDefDomain, char *pSearchList) {
+ink_res_init(ink_res_state statp, unsigned int *pHostList, int *pPort, char *pDefDomain, char *pSearchList, char *pResolvConf) {
   register FILE *fp;
   register char *cp, **pp;
   register int n;
   char buf[BUFSIZ];
-  int nserv = 0;    /*%< number of nameserver records read from file */
+  int nserv = 0;
   int haveenv = 0;
   int havesearch = 0;
 #ifdef RESOLVSORT
@@ -437,7 +424,6 @@ ink_res_init(ink_res_state statp, unsign
   char *net;
 #endif
   int dots;
-  union ink_res_sockaddr_union u[2];
   int maxns = INK_MAXNS;
 
   // INK_RES_SET_H_ERRNO(statp, 0);
@@ -450,31 +436,6 @@ ink_res_init(ink_res_state statp, unsign
   statp->options = INK_RES_DEFAULT;
   statp->id = ink_res_randomid();
 
-  memset(u, 0, sizeof(u));
-#ifdef USELOOPBACK
-  u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
-#else
-  u[nserv].sin.sin_addr.s_addr = INADDR_ANY;
-#endif
-  u[nserv].sin.sin_family = AF_INET;
-  u[nserv].sin.sin_port = htons(NAMESERVER_PORT);
-#ifdef HAVE_SA_LEN
-  u[nserv].sin.sin_len = sizeof(struct sockaddr_in);
-#endif
-  nserv++;
-#ifdef HAS_INET6_STRUCTS
-#ifdef USELOOPBACK
-  u[nserv].sin6.sin6_addr = in6addr_loopback;
-#else
-  u[nserv].sin6.sin6_addr = in6addr_any;
-#endif
-  u[nserv].sin6.sin6_family = AF_INET6;
-  u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT);
-#ifdef HAVE_SA_LEN
-  u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6);
-#endif
-  nserv++;
-#endif
   statp->nscount = 0;
   statp->ndots = 1;
   statp->pfcode = 0;
@@ -486,7 +447,7 @@ ink_res_init(ink_res_state statp, unsign
   statp->_u._ext.ext = (struct __ink_res_state_ext*)malloc(sizeof(*statp->_u._ext.ext));
   if (statp->_u._ext.ext != NULL) {
     memset(statp->_u._ext.ext, 0, sizeof(*statp->_u._ext.ext));
-    statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr;
+    statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr_list[0].sin;
     strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
     strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
   } else {
@@ -509,7 +470,7 @@ ink_res_init(ink_res_state statp, unsign
 #ifdef RESOLVSORT
   statp->nsort = 0;
 #endif
-  ink_res_setservers(statp, u, nserv);
+
 
 #ifdef	SOLARIS2
   /*
@@ -617,11 +578,11 @@ ink_res_init(ink_res_state statp, unsign
   /* -------------------------------------------
      we must be provided with atleast a named!
      ------------------------------------------- */
-
+  /* TODO we should figure out the IPV6 resolvers here. */
   while (pHostList && pHostList[nserv] != 0 && nserv < INK_MAXNS) {
-    statp->nsaddr_list[nserv].sin_addr.s_addr = pHostList[nserv];
-    statp->nsaddr_list[nserv].sin_family = AF_INET;
-    statp->nsaddr_list[nserv].sin_port = htons(pPort[nserv]);
+    statp->nsaddr_list[nserv].sin.sin_addr.s_addr = pHostList[nserv];
+    statp->nsaddr_list[nserv].sin.sin_family = AF_INET;
+    statp->nsaddr_list[nserv].sin.sin_port = htons(pPort[nserv]);
     nserv++;
   }
 
@@ -630,8 +591,7 @@ ink_res_init(ink_res_state statp, unsign
    (line[sizeof(name) - 1] == ' ' ||            \
     line[sizeof(name) - 1] == '\t'))
 
-  nserv = 0;
-  if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
+  if ((fp = fopen(pResolvConf, "r")) != NULL) {
     /* read the config file */
     while (fgets(buf, sizeof(buf), fp) != NULL) {
       /* skip comments */
@@ -710,15 +670,12 @@ ink_res_init(ink_res_state statp, unsign
           if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 &&
               ai->ai_addrlen <= minsiz) {
             if (statp->_u._ext.ext != NULL) {
-              memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
-                     ai->ai_addr, ai->ai_addrlen);
+              memcpy(&statp->_u._ext.ext->nsaddrs[nserv], ai->ai_addr, ai->ai_addrlen);
             }
-            if (ai->ai_addrlen <=
-                sizeof(statp->nsaddr_list[nserv])) {
-              memcpy(&statp->nsaddr_list[nserv],
-                     ai->ai_addr, ai->ai_addrlen);
+            if (ai->ai_addrlen <= sizeof(statp->nsaddr_list[nserv].sin)) {
+              memcpy(&statp->nsaddr_list[nserv].sin, ai->ai_addr, ai->ai_addrlen);
             } else
-              statp->nsaddr_list[nserv].sin_family = 0;
+              statp->nsaddr_list[nserv].sin.sin_family = 0;
             freeaddrinfo(ai);
             nserv++;
           }
@@ -781,6 +738,7 @@ ink_res_init(ink_res_state statp, unsign
 #endif
     (void) fclose(fp);
   }
+
 /*
  * Last chance to get a nameserver.  This should not normally
  * be necessary
@@ -795,6 +753,7 @@ ink_res_init(ink_res_state statp, unsign
       (cp = strchr(buf, '.')) != NULL)
     strcpy(statp->defdname, cp + 1);
 
+
   /* find components of local domain that might be searched */
   if (havesearch == 0) {
     pp = statp->dnsrch;
@@ -824,6 +783,9 @@ ink_res_init(ink_res_state statp, unsign
 #endif
   }
 
+  /* export all ns servers to DNSprocessor. */
+  ink_res_setservers(statp, &statp->nsaddr_list[0], statp->nscount);
+
   if ((cp = getenv("RES_OPTIONS")) != NULL)
     ink_res_setoptions(statp, cp, "env");
   statp->options |= INK_RES_INIT;

Modified: trafficserver/traffic/trunk/libinktomi++/ink_resolver.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/libinktomi%2B%2B/ink_resolver.h?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/libinktomi++/ink_resolver.h (original)
+++ trafficserver/traffic/trunk/libinktomi++/ink_resolver.h Thu Sep 30 17:35:43 2010
@@ -182,6 +182,19 @@
 } while (0)
 #endif
 
+union ink_res_sockaddr_union {
+        struct sockaddr_in      sin;
+#ifdef IN6ADDR_ANY_INIT
+        struct sockaddr_in6     sin6;
+#endif
+#ifdef ISC_ALIGN64
+        int64_t                 __align64;      /*%< 64bit alignment */
+#else
+        int32_t                 __align32;      /*%< 32bit alignment */
+#endif
+        char                    __space[128];   /*%< max size */
+};
+
 struct __ink_res_state {
   int     retrans;                /*%< retransmission time interval */
   int     retry;                  /*%< number of times to retransmit */
@@ -191,8 +204,7 @@ struct __ink_res_state {
   u_long  options;                /*%< option flags - see below. */
 #endif
   int     nscount;                /*%< number of name servers */
-  struct sockaddr_in
-  nsaddr_list[INK_MAXNS];     /*%< address of name server */
+  union ink_res_sockaddr_union nsaddr_list[INK_MAXNS];     /*%< address of name server */
 #define nsaddr  nsaddr_list[0]          /*%< for backward compatibility */
   u_short id;                     /*%< current message id */
   char    *dnsrch[MAXDNSRCH+1];   /*%< components of domain to search */
@@ -228,18 +240,6 @@ struct __ink_res_state {
 };
 typedef __ink_res_state *ink_res_state;
 
-union ink_res_sockaddr_union {
-        struct sockaddr_in      sin;
-#ifdef IN6ADDR_ANY_INIT
-        struct sockaddr_in6     sin6;
-#endif
-#ifdef ISC_ALIGN64
-        int64_t                 __align64;      /*%< 64bit alignment */
-#else
-        int32_t                 __align32;      /*%< 32bit alignment */
-#endif
-        char                    __space[128];   /*%< max size */
-};
 
 struct __ink_res_state_ext {
         union ink_res_sockaddr_union nsaddrs[INK_MAXNS];
@@ -255,8 +255,8 @@ struct __ink_res_state_ext {
 };
 
 
-int ink_res_init(ink_res_state, unsigned int *pHostList,
-                 int *pPort = 0, char *pDefDomain = 0, char *pSearchList = 0);
+int ink_res_init(ink_res_state, unsigned int *pHostList, int *pPort = NULL, char *pDefDomain = NULL,
+                 char *pSearchList = NULL, char *pResolvConf = NULL);
 int ink_res_mkquery(ink_res_state, int, const char *, int, int,
                     const unsigned char *, int, const unsigned char *, unsigned char *, int);
 

Modified: trafficserver/traffic/trunk/proxy/config/records.config.in
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/config/records.config.in?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/config/records.config.in (original)
+++ trafficserver/traffic/trunk/proxy/config/records.config.in Thu Sep 30 17:35:43 2010
@@ -355,6 +355,7 @@ CONFIG proxy.config.dns.max_dns_in_fligh
 CONFIG proxy.config.dns.url_expansions STRING NULL
 CONFIG proxy.config.dns.round_robin_nameservers INT 0
 CONFIG proxy.config.dns.nameservers STRING NULL
+CONFIG proxy.config.dns.resolv_conf STRING /etc/resolv.conf
    # This provides additional resilience against DNS forgery, particularly in
    # forward or transparent proxies, but requires that the resolver populates
    # the queries section of the response properly.

Modified: trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc?rev=1003179&r1=1003178&r2=1003179&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc (original)
+++ trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc Thu Sep 30 17:35:43 2010
@@ -2088,6 +2088,8 @@ RecordElement RecordsConfig[] = {
   ,
   {CONFIG, "proxy.config.dns.nameservers", "", INK_STRING, NULL, RU_REREAD, RR_NULL, RC_NULL, NULL, RA_NULL}
   ,
+  {CONFIG, "proxy.config.dns.resolv_conf", "", INK_STRING, "/etc/resolv.conf", RU_RESTART_TS, RR_NULL, RC_NULL, NULL, RA_NULL}
+  ,
   {CONFIG, "proxy.config.dns.round_robin_nameservers", "", INK_INT, "0", RU_REREAD, RR_NULL, RC_NULL, NULL, RA_NULL}
   ,
   {PROCESS, "proxy.process.dns.total_dns_lookups", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}