diff options
author | Patrik Flykt <patrik.flykt@linux.intel.com> | 2016-04-01 12:29:57 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2016-04-13 16:19:11 +0300 |
commit | b868362baa33523791dbe1bbe51345962c668582 (patch) | |
tree | 12ffdc6d968de543b003fbf954b081faa714a453 | |
parent | 808e0119d90929cac03781c8615f77e0756d3614 (diff) | |
download | connman-b868362baa33523791dbe1bbe51345962c668582.tar.gz |
dnsproxy: Enable fallback nameservers when default service changes
Enable fallback nameservers if there are no service specific ones. The
fallback nameservers will be enabled when the default service changes or
the last service specific nameservers are removed.
Reported by Viliam Lejcik.
-rw-r--r-- | src/dnsproxy.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/dnsproxy.c b/src/dnsproxy.c index 206008fa..f3ebcf0e 100644 --- a/src/dnsproxy.c +++ b/src/dnsproxy.c @@ -2525,6 +2525,25 @@ static int server_create_socket(struct server_data *data) return 0; } +static void enable_fallback(bool enable) +{ + GSList *list; + + for (list = server_list; list; list = list->next) { + struct server_data *data = list->data; + + if (data->index != -1) + continue; + + if (enable) + DBG("Enabling fallback DNS server %s", data->server); + else + DBG("Disabling fallback DNS server %s", data->server); + + data->enabled = enable; + } +} + static struct server_data *create_server(int index, const char *domain, const char *server, int protocol) @@ -2611,6 +2630,8 @@ static struct server_data *create_server(int index, data->index)) { data->enabled = true; DBG("Adding DNS server %s", data->server); + + enable_fallback(false); } server_list = g_slist_append(server_list, data); @@ -2772,12 +2793,22 @@ static void remove_server(int index, const char *domain, const char *server, int protocol) { struct server_data *data; + GSList *list; data = find_server(index, server, protocol); if (!data) return; destroy_server(data); + + for (list = server_list; list; list = list->next) { + struct server_data *data = list->data; + + if (data->index != -1 && data->enabled == true) + return; + } + + enable_fallback(true); } int __connman_dnsproxy_remove(int index, const char *domain, @@ -2830,6 +2861,7 @@ static void dnsproxy_offline_mode(bool enabled) static void dnsproxy_default_changed(struct connman_service *service) { + bool server_enabled = false; GSList *list; int index; @@ -2854,12 +2886,16 @@ static void dnsproxy_default_changed(struct connman_service *service) if (data->index == index) { DBG("Enabling DNS server %s", data->server); data->enabled = true; + server_enabled = true; } else { DBG("Disabling DNS server %s", data->server); data->enabled = false; } } + if (!server_enabled) + enable_fallback(true); + cache_refresh(); } |