diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2011-11-23 17:06:20 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-11-28 11:51:35 +0100 |
commit | 012bd3d307134928123b1479591bf754fe8713d3 (patch) | |
tree | 8ccd8479980971e2228ca4ed266ff64dd27bb7af /src/resolver.c | |
parent | 17d0eee00f7a247d279c17cb036672d3c5a67d77 (diff) | |
download | connman-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.c | 53 |
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; |