service: Return all system defined nameservers when asked
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Tue, 3 Jan 2012 12:36:28 +0000 (14:36 +0200)
committerDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 5 Jan 2012 10:09:16 +0000 (11:09 +0100)
The connman_service_get_nameservers() is changed to return
all system defined nameservers. This means that the function
now returns an allocated array of all nameservers and caller
must deallocate the returned array.

The change is needed so that we can combine the nameservers
that are set by DHCP code and the IPv6 nameservers that are
set by router advertisements.

plugins/pacrunner.c
src/service.c
src/wispr.c
src/wpad.c

index 84c22ab..0a9fa55 100644 (file)
@@ -183,6 +183,7 @@ static void create_proxy_configuration(void)
                connman_dbus_dict_append_array(&dict, "Nameservers",
                                        DBUS_TYPE_STRING, append_string_list,
                                        str_list);
+       g_strfreev(str_list);
 
        connman_dbus_dict_close(&iter, &dict);
 
index ef25069..02f494b 100644 (file)
@@ -2127,9 +2127,30 @@ char **connman_service_get_nameservers(struct connman_service *service)
                return NULL;
 
        if (service->nameservers_config != NULL)
-               return service->nameservers_config;
-       else if (service->nameservers != NULL)
-               return service->nameservers;
+               return g_strdupv(service->nameservers_config);
+       else if (service->nameservers != NULL ||
+                                       service->nameservers_auto != NULL) {
+               int len = 0, len_auto = 0, i;
+               char **nameservers;
+
+               if (service->nameservers != NULL)
+                       len = g_strv_length(service->nameservers);
+               if (service->nameservers_auto != NULL)
+                       len_auto = g_strv_length(service->nameservers_auto);
+
+               nameservers = g_try_new0(char *, len + len_auto + 1);
+               if (nameservers == NULL)
+                       return NULL;
+
+               for (i = 0; i < len; i++)
+                       nameservers[i] = g_strdup(service->nameservers[i]);
+
+               for (i = 0; i < len_auto; i++)
+                       nameservers[i + len] =
+                               g_strdup(service->nameservers_auto[i]);
+
+               return nameservers;
+       }
 
        return NULL;
 }
index 31f4caa..9c45c72 100644 (file)
@@ -627,7 +627,7 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
 {
        enum connman_service_type service_type;
        char *interface = NULL;
-       char **nameservers;
+       char **nameservers = NULL;
        int if_index;
        int err = 0;
        int i;
@@ -695,6 +695,8 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
                err = -EINVAL;
 
 done:
+       g_strfreev(nameservers);
+
        g_free(interface);
        return err;
 }
index dd25c7c..e6d77e7 100644 (file)
@@ -147,12 +147,15 @@ int __connman_wpad_start(struct connman_service *service)
                return -EINVAL;
 
        wpad = g_try_new0(struct connman_wpad, 1);
-       if (wpad == NULL)
+       if (wpad == NULL) {
+               g_strfreev(nameservers);
                return -ENOMEM;
+       }
 
        wpad->service = service;
        wpad->resolv = g_resolv_new(index);
        if (wpad->resolv == NULL) {
+               g_strfreev(nameservers);
                g_free(wpad);
                return -ENOMEM;
        }
@@ -163,6 +166,8 @@ int __connman_wpad_start(struct connman_service *service)
        for (i = 0; nameservers[i] != NULL; i++)
                g_resolv_add_nameserver(wpad->resolv, nameservers[i], 53, 0);
 
+       g_strfreev(nameservers);
+
        wpad->hostname = g_strdup_printf("wpad.%s", domainname);
 
        DBG("hostname %s", wpad->hostname);