resolver: Do not touch IPv4 servers in redo case
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 17 Sep 2012 13:43:53 +0000 (16:43 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 26 Sep 2012 09:32:57 +0000 (12:32 +0300)
The name server refresh should be only done for IPv6
nameservers.

src/resolver.c

index 2d52457..009110f 100644 (file)
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <sys/stat.h>
 #include <resolv.h>
+#include <netdb.h>
 
 #include "connman.h"
 
@@ -46,6 +47,7 @@ struct entry_data {
        char *interface;
        char *domain;
        char *server;
+       int family;
        unsigned int flags;
        unsigned int lifetime;
        guint timeout;
@@ -317,6 +319,10 @@ static int append_resolver(const char *interface, const char *domain,
        entry->server = g_strdup(server);
        entry->flags = flags;
        entry->lifetime = lifetime;
+
+       if (server != NULL)
+               entry->family = connman_inet_check_ipaddress(server);
+
        if (lifetime) {
                int index;
                interval = lifetime * RESOLVER_LIFETIME_REFRESH_THRESHOLD;
@@ -539,6 +545,13 @@ int __connman_resolver_redo_servers(const char *interface)
                        continue;
 
                /*
+                * This function must only check IPv6 server addresses so
+                * do not remove IPv4 name servers unnecessarily.
+                */
+               if (entry->family != AF_INET6)
+                       continue;
+
+               /*
                 * We remove the server, and then re-create so that it will
                 * use proper source addresses when sending DNS queries.
                 */