summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-01-23 18:57:29 +0100
committerLennart Poettering <lennart@poettering.net>2015-01-23 19:03:07 +0100
commit36a03ca2a8952ca1acb29fbe796210c27ff71aff (patch)
treef650269a39d6fb5ac73c72404f6f0f81b2550582
parentc9403dced7c3eb0cc2a925c6428ca30ef8527b55 (diff)
resolved: when rereading /etc/resolv.conf, always start using first DNS server again
Previously we tried to stick to a DNS server as long as it is available. When /etc/resolv.conf changed, and the old DNS server we used was still in there we'd continue to use it, even if it was at the end of the list. With this change we'll now always start with the first DNS server in the list again. Rationale: certain network managing implementations (notably NetworkManager) when connected to a VPN place both the VPN DNS server as well as the local DNS server in /etc/resolv.conf. If we used the local one before we would thus continue to use the local one, making VPN names unresolvable. NetworkManager really should be fixed to only place the VPN DNS servers in the file, but with this commit things are at least similarly bad as they used to be...
-rw-r--r--src/resolve/resolved-manager.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 0594479787..2edfb9f7fd 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -667,6 +667,16 @@ int manager_read_resolv_conf(Manager *m) {
if (s->marked)
dns_server_free(s);
+ /* Whenever /etc/resolv.conf changes, start using the first
+ * DNS server of it. This is useful to deal with broken
+ * network managing implementations (like NetworkManager),
+ * that when connecting to a VPN place both the VPN DNS
+ * servers and the local ones in /etc/resolv.conf. Without
+ * resetting the DNS server to use back to the first entry we
+ * will continue to use the local one thus being unable to
+ * resolve VPN domains. */
+ manager_set_dns_server(m, m->dns_servers);
+
return 0;
clear: