summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2015-04-01 08:26:29 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2015-05-08 10:21:28 +0200
commit6edc7371734315d57de020193102938846b2eb9e (patch)
tree36d52a570450ce5214efa62fdd8d93a32ea088c4
parent33527341b1e35034a4f1736df4bc98f8ac8418ab (diff)
downloadNetworkManager-6edc7371734315d57de020193102938846b2eb9e.tar.gz
dns: don't override DHCP-supplied search order with domain
NM always prepends the list of DNS domains received through DHCP to the search list in /etc/resolv.conf, overriding the DHCP-supplied DNS domain search order. This behavior is not entirely correct since it changes the search order provided by system administrators. We cannot simply avoid adding the DNS domain list to the search list because this would break some configurations that rely on the 'domain' option to deliver the search list. This patch modifies the behavior of DNS manager to: - insert the DHCP-provided 'domain' at the end of 'searches' option so that 'searches' is always preferred - ignore 'domain' if 'searches' option exists and 'domain' is a single domain https://bugzilla.gnome.org/show_bug.cgi?id=748900
-rw-r--r--src/dns-manager/nm-dns-manager.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c
index a403a85faf..430df122fa 100644
--- a/src/dns-manager/nm-dns-manager.c
+++ b/src/dns-manager/nm-dns-manager.c
@@ -145,7 +145,7 @@ add_string_item (GPtrArray *array, const char *str)
static void
merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
{
- guint32 num, i;
+ guint32 num, num_domains, num_searches, i;
num = nm_ip4_config_get_num_nameservers (src);
for (i = 0; i < num; i++) {
@@ -153,18 +153,10 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (src, i), NULL));
}
- num = nm_ip4_config_get_num_domains (src);
- for (i = 0; i < num; i++) {
- const char *domain;
+ num_domains = nm_ip4_config_get_num_domains (src);
+ num_searches = nm_ip4_config_get_num_searches (src);
- domain = nm_ip4_config_get_domain (src, i);
- if (!DOMAIN_IS_VALID (domain))
- continue;
- add_string_item (rc->searches, domain);
- }
-
- num = nm_ip4_config_get_num_searches (src);
- for (i = 0; i < num; i++) {
+ for (i = 0; i < num_searches; i++) {
const char *search;
search = nm_ip4_config_get_search (src, i);
@@ -173,6 +165,17 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
add_string_item (rc->searches, search);
}
+ if (num_domains > 1 || !num_searches) {
+ for (i = 0; i < num_domains; i++) {
+ const char *domain;
+
+ domain = nm_ip4_config_get_domain (src, i);
+ if (!DOMAIN_IS_VALID (domain))
+ continue;
+ add_string_item (rc->searches, domain);
+ }
+ }
+
/* NIS stuff */
num = nm_ip4_config_get_num_nis_servers (src);
for (i = 0; i < num; i++) {
@@ -190,7 +193,7 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
static void
merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
{
- guint32 num, i;
+ guint32 num, num_domains, num_searches, i;
const char *iface;
iface = g_object_get_data (G_OBJECT (src), IP_CONFIG_IFACE_TAG);
@@ -215,18 +218,10 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
add_string_item (rc->nameservers, buf);
}
- num = nm_ip6_config_get_num_domains (src);
- for (i = 0; i < num; i++) {
- const char *domain;
+ num_domains = nm_ip6_config_get_num_domains (src);
+ num_searches = nm_ip6_config_get_num_searches (src);
- domain = nm_ip6_config_get_domain (src, i);
- if (!DOMAIN_IS_VALID (domain))
- continue;
- add_string_item (rc->searches, domain);
- }
-
- num = nm_ip6_config_get_num_searches (src);
- for (i = 0; i < num; i++) {
+ for (i = 0; i < num_searches; i++) {
const char *search;
search = nm_ip6_config_get_search (src, i);
@@ -234,6 +229,17 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
continue;
add_string_item (rc->searches, search);
}
+
+ if (num_domains > 1 || !num_searches) {
+ for (i = 0; i < num_domains; i++) {
+ const char *domain;
+
+ domain = nm_ip6_config_get_domain (src, i);
+ if (!DOMAIN_IS_VALID (domain))
+ continue;
+ add_string_item (rc->searches, domain);
+ }
+ }
}