---
 src/service.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/src/service.c b/src/service.c
index eca4ef2..216fa47 100644
--- a/src/service.c
+++ b/src/service.c
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
+#include <netdb.h>
 #include <gdbus.h>
 
 #include "connman.h"
@@ -611,22 +612,63 @@ void __connman_service_nameserver_clear(struct 
connman_service *service)
 static void nameserver_add_routes(int index, char **nameservers,
                                        const char *gw)
 {
-       int i;
+       int i, ret, family;
+       struct addrinfo hints;
+       struct addrinfo *addr;
 
        for (i = 0; nameservers[i] != NULL; i++) {
-               if (connman_inet_compare_subnet(index, nameservers[i]))
+               memset(&hints, 0, sizeof(struct addrinfo));
+               hints.ai_flags = AI_NUMERICHOST;
+               addr = NULL;
+
+               ret = getaddrinfo(nameservers[i], NULL, &hints, &addr);
+               if (ret == EAI_NONAME)
+                       family = AF_INET; /* use the IPv4 as a default */
+               else if (ret != 0)
                        continue;
+               else
+                       family = addr->ai_family;
+
+               if (family == AF_INET) {
+                       if (connman_inet_compare_subnet(index,
+                                               nameservers[i]) != TRUE)
+                               connman_inet_add_host_route(index,
+                                                       nameservers[i], gw);
+               } else if (family == AF_INET6)
+                       connman_inet_add_ipv6_host_route(index,
+                                                       nameservers[i], gw);
 
-               connman_inet_add_host_route(index, nameservers[i], gw);
+               freeaddrinfo(addr);
        }
 }
 
 static void nameserver_del_routes(int index, char **nameservers)
 {
-       int i;
+       int i, ret, family;
+       struct addrinfo hints;
+       struct addrinfo *addr;
+
+       for (i = 0; nameservers[i] != NULL; i++) {
+               memset(&hints, 0, sizeof(struct addrinfo));
+               hints.ai_flags = AI_NUMERICHOST;
+               addr = NULL;
+
+               ret = getaddrinfo(nameservers[i], NULL, &hints, &addr);
+               if (ret == EAI_NONAME)
+                       family = AF_INET; /* use the IPv4 as a default */
+               else if (ret != 0)
+                       continue;
+               else
+                       family = addr->ai_family;
 
-       for (i = 0; nameservers[i] != NULL; i++)
-               connman_inet_del_host_route(index, nameservers[i]);
+               if (family == AF_INET)
+                       connman_inet_del_host_route(index, nameservers[i]);
+               else if (family == AF_INET6)
+                       connman_inet_del_ipv6_host_route(index,
+                                                       nameservers[i]);
+
+               freeaddrinfo(addr);
+       }
 }
 
 void __connman_service_nameserver_add_routes(struct connman_service *service,
-- 
1.7.1

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to