Subject: [PATCH] c-ares: Add support for multiple DNS servers on Android

[PATCH] c-ares: Add support for multiple DNS servers on Android

From: Geert Uytterhoeven <Geert.Uytterhoeven_at_sonycom.com>
Date: Thu, 19 Apr 2012 15:48:00 +0200

Before, c-ares always used the first DNS server on Android, causing
network problems if this DNS server was not available.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven_at_sonycom.com>

---
 ares_init.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/ares_init.c b/ares_init.c
index a0bfc83..fa9e1d7 100644
--- a/ares_init.c
+++ b/ares_init.c
@@ -62,6 +62,7 @@
 
 #if defined(ANDROID) || defined(__ANDROID__)
 #include <sys/system_properties.h>
+#define MAX_DNS_PROPERTIES	8	/* From the Bionic sources */
 #endif
 
 #include "ares.h"
@@ -953,11 +954,22 @@ DhcpNameServer
   status = ARES_EOF;
 
 #elif defined(ANDROID) || defined(__ANDROID__)
+  unsigned int i;
+  char name[PROP_NAME_MAX];
   char value[PROP_VALUE_MAX]="";
-  __system_property_get("net.dns1", value);
-  status = config_nameserver(&servers, &nservers, value);
-  if (status == ARES_SUCCESS)
+  int len;
+  for (i = 1; i <= MAX_DNS_PROPERTIES; i++) {
+    snprintf(name, sizeof(name), "net.dns%u", i);
+    len = __system_property_get(name, value);
+    if (len < 1) {
+      status = ARES_EOF;
+      break;
+    }
+    status = config_nameserver(&servers, &nservers, value);
+    if (status != ARES_SUCCESS)
+      break;
     status = ARES_EOF;
+  }
 #else
   {
     char *p;
-- 
1.7.0.4
Received on 2012-04-19