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