summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2016-04-01 12:29:57 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2016-04-13 16:19:11 +0300
commitb868362baa33523791dbe1bbe51345962c668582 (patch)
tree12ffdc6d968de543b003fbf954b081faa714a453
parent808e0119d90929cac03781c8615f77e0756d3614 (diff)
downloadconnman-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.c36
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();
}