summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenri Bragge <henri.bragge@ixonos.com>2010-12-07 10:49:38 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-12-07 19:04:42 +0100
commit2cc48d91f82cf1aaa2c002b5e617cfa5df5f2545 (patch)
treebf4ba01f851dc897860f41c1103c4e0e21620c5b /src
parent0ab9afa9c8edf471ec9b669c125662336dd0d379 (diff)
downloadconnman-2cc48d91f82cf1aaa2c002b5e617cfa5df5f2545.tar.gz
connman-2cc48d91f82cf1aaa2c002b5e617cfa5df5f2545.tar.bz2
connman-2cc48d91f82cf1aaa2c002b5e617cfa5df5f2545.zip
resolver: Add support for multiple search domains
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. Search domains should only be useful for resolvfile_resolver and should be ignored by dnsproxy_resolver.
Diffstat (limited to 'src')
-rw-r--r--src/resolver.c31
-rw-r--r--src/service.c18
2 files changed, 43 insertions, 6 deletions
diff --git a/src/resolver.c b/src/resolver.c
index cbb628e5..6ee4d483 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -164,7 +164,7 @@ static int append_resolver(const char *interface, const char *domain,
DBG("interface %s domain %s server %s lifetime %d flags %d",
interface, domain, server, lifetime, flags);
- if (server == NULL)
+ if (server == NULL && domain == NULL)
return -EINVAL;
entry = g_try_new0(struct entry_data, 1);
@@ -409,14 +409,37 @@ 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)
+ continue;
+
+ 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;
+
+ if (!entry->server)
+ continue;
+
g_string_append_printf(content, "nameserver %s\n",
entry->server);
count++;
diff --git a/src/service.c b/src/service.c
index c49cb00d..aecbe9a9 100644
--- a/src/service.c
+++ b/src/service.c
@@ -368,6 +368,15 @@ 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);
+ } else if (service->domainname != NULL)
+ connman_resolver_append(ifname, service->domainname, NULL);
+
connman_resolver_flush();
}
@@ -1516,7 +1525,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 service->domainname;
}
const char *connman_service_get_nameserver(struct connman_service *service)
@@ -1986,7 +1998,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);
@@ -3030,6 +3042,7 @@ int __connman_service_indicate_state(struct connman_service *service,
update_nameservers(service);
dns_changed(service);
+ domain_changed(service);
__connman_wpad_start(service);
@@ -3045,6 +3058,7 @@ int __connman_service_indicate_state(struct connman_service *service,
update_nameservers(service);
dns_changed(service);
+ domain_changed(service);
__connman_notifier_disconnect(service->type);
}