summaryrefslogtreecommitdiff
path: root/src/resolver.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2011-11-23 17:06:20 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2011-11-28 11:51:35 +0100
commit012bd3d307134928123b1479591bf754fe8713d3 (patch)
tree8ccd8479980971e2228ca4ed266ff64dd27bb7af /src/resolver.c
parent17d0eee00f7a247d279c17cb036672d3c5a67d77 (diff)
downloadconnman-012bd3d307134928123b1479591bf754fe8713d3.tar.gz
connman-012bd3d307134928123b1479591bf754fe8713d3.tar.bz2
connman-012bd3d307134928123b1479591bf754fe8713d3.zip
service: Support automatically added nameservers
IPv6 autoconfigured nameservers can be added to resolver via netlink messages in rtnl.c. Because of this they are not seen in service object so we need to get those auto added nameserver to be added in service.c so that service can show them to user if necessary. Fixes BMC#24196
Diffstat (limited to 'src/resolver.c')
-rw-r--r--src/resolver.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/src/resolver.c b/src/resolver.c
index 68fa4f7b..29871e10 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -232,11 +232,22 @@ static gboolean resolver_expire_cb(gpointer user_data)
{
struct entry_data *entry = user_data;
GSList *list;
+ int index;
DBG("interface %s domain %s server %s",
entry->interface, entry->domain, entry->server);
list = g_slist_append(NULL, entry);
+
+ index = connman_inet_ifindex(entry->interface);
+ if (index >= 0) {
+ struct connman_service *service;
+ service = __connman_service_lookup_from_index(index);
+ if (service != NULL)
+ __connman_service_nameserver_remove(service,
+ entry->server, TRUE);
+ }
+
remove_entries(list);
return FALSE;
@@ -262,10 +273,24 @@ static int append_resolver(const char *interface, const char *domain,
entry->domain = g_strdup(domain);
entry->server = g_strdup(server);
entry->flags = flags;
- if (lifetime)
+ if (lifetime) {
+ int index;
entry->timeout = g_timeout_add_seconds(lifetime,
resolver_expire_cb, entry);
+ /*
+ * We update the service only for those nameservers
+ * that are automagically added via netlink (lifetime > 0)
+ */
+ index = connman_inet_ifindex(interface);
+ if (index >= 0) {
+ struct connman_service *service;
+ service = __connman_service_lookup_from_index(index);
+ if (service != NULL)
+ __connman_service_nameserver_append(service,
+ server, TRUE);
+ }
+ }
entry_list = g_slist_append(entry_list, entry);
if (dnsproxy_enabled == TRUE)
@@ -287,8 +312,28 @@ static int append_resolver(const char *interface, const char *domain,
int connman_resolver_append(const char *interface, const char *domain,
const char *server)
{
+ GSList *list, *matches = NULL;
+
DBG("interface %s domain %s server %s", interface, domain, server);
+ if (server == NULL)
+ return -EINVAL;
+
+ for (list = entry_list; list; list = list->next) {
+ struct entry_data *entry = list->data;
+
+ if (entry->timeout > 0 ||
+ g_strcmp0(entry->interface, interface) != 0 ||
+ g_strcmp0(entry->domain, domain) != 0 ||
+ g_strcmp0(entry->server, server) != 0)
+ continue;
+
+ matches = g_slist_append(matches, entry);
+ }
+
+ if (matches != NULL)
+ remove_entries(matches);
+
return append_resolver(interface, domain, server, 0, 0);
}
@@ -322,6 +367,12 @@ int connman_resolver_append_lifetime(const char *interface, const char *domain,
continue;
g_source_remove(entry->timeout);
+
+ if (lifetime == 0) {
+ resolver_expire_cb(entry);
+ return 0;
+ }
+
entry->timeout = g_timeout_add_seconds(lifetime,
resolver_expire_cb, entry);
return 0;