Domains are appended to entry list just like nameservers, and finally exported
to /etc/resolv.conf. Domains are written to resolv.conf in reverse order so
that the most recently appended domain will have the highest priority.
---
 src/resolver.c |   33 +++++++++++++++++++++++++++------
 src/service.c  |   43 +++++++++++++++++++++++++++++++++----------
 2 files changed, 60 insertions(+), 16 deletions(-)

diff --git a/src/resolver.c b/src/resolver.c
index 8957645..8440e35 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -146,7 +146,7 @@ static int append_resolver(const char *interface, const 
char *domain,
        DBG("interface %s domain %s server %s flags %d",
                                        interface, domain, server, flags);
 
-       if (server == NULL)
+       if (server == NULL && domain == NULL)
                return -EINVAL;
 
        entry = g_try_new0(struct entry_data, 1);
@@ -392,17 +392,38 @@ static int resolvfile_export(void)
        content = g_string_new("# Generated by Connection Manager\n");
 
        /*
-        * Nameservers are added in reverse so that the most recently
-        * appended entry is the primary nameserver. No more than MAXNS
-        * nameservers are used.
+        * Domains and nameservers are added in reverse so that the most
+        * recently appended entry is the primary one. No more than
+        * MAXDNSRCH/MAXNS entries are used.
         */
+
+       for (count = 0, list = g_list_last(resolvfile_list);
+                                               list && (count < MAXDNSRCH);
+                                               list = g_list_previous(list)) {
+               struct resolvfile_entry *entry = list->data;
+
+               if (entry->domain) {
+                       if (count == 0)
+                               g_string_append_printf(content, "search ");
+
+                       g_string_append_printf(content, "%s ", entry->domain);
+                       count++;
+               }
+       }
+
+       if (count)
+               g_string_append_printf(content, "\n");
+
        for (count = 0, list = g_list_last(resolvfile_list);
                                                list && (count < MAXNS);
                                                list = g_list_previous(list)) {
                struct resolvfile_entry *entry = list->data;
-               g_string_append_printf(content, "nameserver %s\n",
+
+               if (entry->server) {
+                       g_string_append_printf(content, "nameserver %s\n",
                                                                entry->server);
-               count++;
+                       count++;
+               }
        }
 
        old_umask = umask(022);
diff --git a/src/service.c b/src/service.c
index b1842d6..d9026b8 100644
--- a/src/service.c
+++ b/src/service.c
@@ -85,7 +85,6 @@ struct connman_service {
        char **nameservers;
        char *nameserver;
        char **domains;
-       char *domainname;
        /* 802.1x settings from the config files */
        char *eap;
        char *identity;
@@ -368,6 +367,14 @@ static void update_nameservers(struct connman_service 
*service)
        } else if (service->nameserver != NULL)
                connman_resolver_append(ifname, NULL, service->nameserver);
 
+       if (service->domains != NULL) {
+               int i;
+
+               for (i = 0; service->domains[i]; i++)
+                       connman_resolver_append(ifname, service->domains[i],
+                                               NULL);
+       }
+
        connman_resolver_flush();
 }
 
@@ -831,15 +838,17 @@ static void append_dnsconfig(DBusMessageIter *iter, void 
*user_data)
 static void append_domain(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
+       int i;
 
        if (is_connected(service) == FALSE && is_connecting(service) == FALSE)
                return;
 
-       if (service->domainname == NULL)
+       if (service->domains == NULL)
                return;
 
-       dbus_message_iter_append_basic(iter,
-                               DBUS_TYPE_STRING, &service->domainname);
+       for (i = 0; service->domains[i]; i++)
+               dbus_message_iter_append_basic(iter,
+                               DBUS_TYPE_STRING, &service->domains[i]);
 }
 
 static void append_domainconfig(DBusMessageIter *iter, void *user_data)
@@ -1040,6 +1049,8 @@ static void domain_configuration_changed(struct 
connman_service *service)
                                CONNMAN_SERVICE_INTERFACE,
                                "Domains.Configuration",
                                DBUS_TYPE_STRING, append_domainconfig, service);
+
+       domain_changed(service);
 }
 
 static void proxy_changed(struct connman_service *service)
@@ -1505,10 +1516,18 @@ void __connman_service_set_domainname(struct 
connman_service *service,
        if (service == NULL)
                return;
 
-       g_free(service->domainname);
-       service->domainname = g_strdup(domainname);
+       g_strfreev(service->domains);
+       service->domains = NULL;
 
-       domain_changed(service);
+       /* Leave domain list empty if domainname is unset */
+       if (domainname != NULL && (g_strcmp0(domainname, "") != 0)) {
+               service->domains = g_try_malloc0(sizeof(char *));
+
+               if (service->domains != NULL)
+                       service->domains[0] = g_strdup(domainname);
+       }
+
+       domain_configuration_changed(service);
 }
 
 const char *connman_service_get_domainname(struct connman_service *service)
@@ -1516,7 +1535,10 @@ const char *connman_service_get_domainname(struct 
connman_service *service)
        if (service == NULL)
                return NULL;
 
-       return service->domainname;
+       if (service->domains != NULL)
+               return service->domains[0];
+       else
+               return NULL;
 }
 
 const char *connman_service_get_nameserver(struct connman_service *service)
@@ -1986,7 +2008,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                g_string_free(str, TRUE);
 
-               //update_domains(service);
+               update_nameservers(service);
                domain_configuration_changed(service);
 
                __connman_storage_save_service(service);
@@ -2575,7 +2597,6 @@ static void service_free(gpointer user_data)
        g_strfreev(service->excludes);
 
        g_free(service->nameserver);
-       g_free(service->domainname);
        g_free(service->pac);
        g_free(service->mcc);
        g_free(service->mnc);
@@ -3007,6 +3028,7 @@ int __connman_service_indicate_state(struct 
connman_service *service,
 
                update_nameservers(service);
                dns_changed(service);
+               domain_changed(service);
 
                __connman_wpad_start(service);
 
@@ -3022,6 +3044,7 @@ int __connman_service_indicate_state(struct 
connman_service *service,
 
                update_nameservers(service);
                dns_changed(service);
+               domain_changed(service);
 
                __connman_notifier_disconnect(service->type);
        }
-- 
1.7.0.4


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

Reply via email to