From 0daa4db81bc3741ee61aa35c916609521b69de58 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Jan 2018 11:21:27 +0100 Subject: [PATCH 1/5] dns: split out domains retrieval (cherry picked from commit e78bfb63cd7c4727a283fb38cf196350fe974922) --- src/dns/nm-dns-manager.c | 41 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 858d8ed79c..4ce322e31c 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -376,15 +376,37 @@ add_dns_option_item (GPtrArray *array, const char *str) g_ptr_array_add (array, g_strdup (str)); } +static void +add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config) +{ + guint num_domains, num_searches, i; + const char *str; + + num_domains = nm_ip_config_get_num_domains (ip_config); + num_searches = nm_ip_config_get_num_searches (ip_config); + + for (i = 0; i < num_searches; i++) { + str = nm_ip_config_get_search (ip_config, i); + if (domain_is_valid (str, FALSE)) + add_string_item (array, str); + } + if (num_domains > 1 || !num_searches) { + for (i = 0; i < num_domains; i++) { + str = nm_ip_config_get_domain (ip_config, i); + if (domain_is_valid (str, FALSE)) + add_string_item (array, str); + } + } +} + static void merge_one_ip_config (NMResolvConfData *rc, int ifindex, const NMIPConfig *ip_config) { int addr_family; - guint num, num_domains, num_searches, i; + guint num, i; char buf[NM_UTILS_INET_ADDRSTRLEN + 50]; - const char *str; addr_family = nm_ip_config_get_addr_family (ip_config); @@ -417,20 +439,7 @@ merge_one_ip_config (NMResolvConfData *rc, add_string_item (rc->nameservers, buf); } - num_domains = nm_ip_config_get_num_domains (ip_config); - num_searches = nm_ip_config_get_num_searches (ip_config); - for (i = 0; i < num_searches; i++) { - str = nm_ip_config_get_search (ip_config, i); - if (domain_is_valid (str, FALSE)) - add_string_item (rc->searches, str); - } - if (num_domains > 1 || !num_searches) { - for (i = 0; i < num_domains; i++) { - str = nm_ip_config_get_domain (ip_config, i); - if (domain_is_valid (str, FALSE)) - add_string_item (rc->searches, str); - } - } + add_dns_domains (rc->searches, ip_config); num = nm_ip_config_get_num_dns_options (ip_config); for (i = 0; i < num; i++) { From f43febc2ab5dde1bcb11a35f5328d93baae19fc1 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Jan 2018 11:22:11 +0100 Subject: [PATCH 2/5] dns: add @dup argument to add_dns_domains() and add_string_item() Add a @dup argument that tells whether the new item should be duplicated. (cherry picked from commit b4db0e8362fa0587fcf25a13a2086864fd3062e2) --- src/dns/nm-dns-manager.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 4ce322e31c..297fce0af7 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -350,7 +350,7 @@ _ip_config_lst_head (NMDnsManager *self) /*****************************************************************************/ static void -add_string_item (GPtrArray *array, const char *str) +add_string_item (GPtrArray *array, const char *str, gboolean dup) { int i; @@ -366,7 +366,7 @@ add_string_item (GPtrArray *array, const char *str) } /* No dupes, add the new item */ - g_ptr_array_add (array, g_strdup (str)); + g_ptr_array_add (array, dup ? g_strdup (str): (gpointer) str); } static void @@ -377,7 +377,7 @@ add_dns_option_item (GPtrArray *array, const char *str) } static void -add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config) +add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config, gboolean dup) { guint num_domains, num_searches, i; const char *str; @@ -388,13 +388,13 @@ add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config) for (i = 0; i < num_searches; i++) { str = nm_ip_config_get_search (ip_config, i); if (domain_is_valid (str, FALSE)) - add_string_item (array, str); + add_string_item (array, str, dup); } if (num_domains > 1 || !num_searches) { for (i = 0; i < num_domains; i++) { str = nm_ip_config_get_domain (ip_config, i); if (domain_is_valid (str, FALSE)) - add_string_item (array, str); + add_string_item (array, str, dup); } } } @@ -436,10 +436,10 @@ merge_one_ip_config (NMResolvConfData *rc, } } - add_string_item (rc->nameservers, buf); + add_string_item (rc->nameservers, buf, TRUE); } - add_dns_domains (rc->searches, ip_config); + add_dns_domains (rc->searches, ip_config, TRUE); num = nm_ip_config_get_num_dns_options (ip_config); for (i = 0; i < num; i++) { @@ -454,7 +454,8 @@ merge_one_ip_config (NMResolvConfData *rc, num = nm_ip4_config_get_num_nis_servers (ip4_config); for (i = 0; i < num; i++) { add_string_item (rc->nis_servers, - nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (ip4_config, i), buf)); + nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (ip4_config, i), buf), + TRUE); } if (nm_ip4_config_get_nis_domain (ip4_config)) { @@ -966,17 +967,17 @@ merge_global_dns_config (NMResolvConfData *rc, NMGlobalDnsConfig *global_conf) for (i = 0; searches && searches[i]; i++) { if (domain_is_valid (searches[i], FALSE)) - add_string_item (rc->searches, searches[i]); + add_string_item (rc->searches, searches[i], TRUE); } for (i = 0; options && options[i]; i++) - add_string_item (rc->options, options[i]); + add_string_item (rc->options, options[i], TRUE); default_domain = nm_global_dns_config_lookup_domain (global_conf, "*"); g_assert (default_domain); servers = nm_global_dns_domain_get_servers (default_domain); for (i = 0; servers && servers[i]; i++) - add_string_item (rc->nameservers, servers[i]); + add_string_item (rc->nameservers, servers[i], TRUE); return TRUE; } @@ -1089,9 +1090,9 @@ _collect_resolv_conf_data (NMDnsManager *self, && !nm_utils_ipaddr_valid (AF_UNSPEC, priv->hostname)) { hostdomain++; if (domain_is_valid (hostdomain, TRUE)) - add_string_item (rc.searches, hostdomain); + add_string_item (rc.searches, hostdomain, TRUE); else if (domain_is_valid (priv->hostname, TRUE)) - add_string_item (rc.searches, priv->hostname); + add_string_item (rc.searches, priv->hostname, TRUE); } } From d4ca953620c4fb95d9fde9d9c851fba23d861caf Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Jan 2018 11:22:44 +0100 Subject: [PATCH 3/5] dns: export search list in the D-Bus "domain" attribute The "domain" key of the D-Bus configuration dictionary specifies the domains a configuration applies to. In DNS code we consider domains and searches as equivalent, so they should be exported via D-Bus using the same logic used to populate resolv.conf and for plugins. (cherry picked from commit 70550e2740ce26234aa715e11f5fc38091c5d7ea) --- src/dns/nm-dns-manager.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 297fce0af7..17a170a48e 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -1899,6 +1899,7 @@ _get_config_variant (NMDnsManager *self) GVariantBuilder builder; NMDnsIPConfigData *ip_data; const CList *head; + gs_unref_ptrarray GPtrArray *array_domains = NULL; if (priv->config_variant) return priv->config_variant; @@ -1941,18 +1942,28 @@ _get_config_variant (NMDnsManager *self) "nameservers", g_variant_builder_end (&strv_builder)); + num = nm_ip_config_get_num_domains (ip_config); + num += nm_ip_config_get_num_searches (ip_config); if (num > 0) { - g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); - for (i = 0; i < num; i++) { - g_variant_builder_add (&strv_builder, - "s", - nm_ip_config_get_domain (ip_config, i)); + if (!array_domains) + array_domains = g_ptr_array_sized_new (num); + else + g_ptr_array_set_size (array_domains, 0); + + add_dns_domains (array_domains, ip_config, FALSE); + if (array_domains->len) { + g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); + for (i = 0; i < array_domains->len; i++) { + g_variant_builder_add (&strv_builder, + "s", + array_domains->pdata[i]); + } + g_variant_builder_add (&entry_builder, + "{sv}", + "domains", + g_variant_builder_end (&strv_builder)); } - g_variant_builder_add (&entry_builder, - "{sv}", - "domains", - g_variant_builder_end (&strv_builder)); } ifname = nm_platform_link_get_name (NM_PLATFORM_GET, ip_data->data->ifindex); From f144eac12c3a02169e4fb375b77d5fcc4a419108 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Jan 2018 11:23:13 +0100 Subject: [PATCH 4/5] dns: systemd-resolved: use generic ip-config functions (cherry picked from commit 42ea86fb7a678d84c4cf490e83a4c5189af7b2cc) --- src/dns/nm-dns-systemd-resolved.c | 45 +++++++------------------------ 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/src/dns/nm-dns-systemd-resolved.c b/src/dns/nm-dns-systemd-resolved.c index b03d9842cb..ec8561fac0 100644 --- a/src/dns/nm-dns-systemd-resolved.c +++ b/src/dns/nm-dns-systemd-resolved.c @@ -141,40 +141,23 @@ static void update_add_ip_config (NMDnsSystemdResolved *self, GVariantBuilder *dns, GVariantBuilder *domains, - gpointer config) + NMIPConfig *config) { int addr_family; gsize addr_size; guint i, n; gboolean route_only; - if (NM_IS_IP4_CONFIG (config)) - addr_family = AF_INET; - else if (NM_IS_IP6_CONFIG (config)) - addr_family = AF_INET6; - else - g_return_if_reached (); - + addr_family = nm_ip_config_get_addr_family (config); addr_size = nm_utils_addr_family_to_size (addr_family); - n = addr_family == AF_INET - ? nm_ip4_config_get_num_nameservers (config) - : nm_ip6_config_get_num_nameservers (config); + n = nm_ip_config_get_num_nameservers (config); for (i = 0 ; i < n; i++) { - in_addr_t ns4; - gconstpointer ns; - - if (addr_family == AF_INET) { - ns4 = nm_ip4_config_get_nameserver (config, i); - ns = &ns4; - } else - ns = nm_ip6_config_get_nameserver (config, i); - g_variant_builder_open (dns, G_VARIANT_TYPE ("(iay)")); g_variant_builder_add (dns, "i", addr_family); g_variant_builder_add_value (dns, g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - ns, + nm_ip_config_get_nameserver (config, i), addr_size, 1)); g_variant_builder_close (dns); @@ -183,29 +166,21 @@ update_add_ip_config (NMDnsSystemdResolved *self, /* If this link is never the default (e.g. only used for resources on this * network) add a routing domain. */ route_only = addr_family == AF_INET - ? !nm_ip4_config_best_default_route_get (config) - : !nm_ip6_config_best_default_route_get (config); + ? !nm_ip4_config_best_default_route_get (NM_IP4_CONFIG (config)) + : !nm_ip6_config_best_default_route_get (NM_IP6_CONFIG (config)); - n = addr_family == AF_INET - ? nm_ip4_config_get_num_searches (config) - : nm_ip6_config_get_num_searches (config); + n = nm_ip_config_get_num_searches (config); if (n > 0) { for (i = 0; i < n; i++) { g_variant_builder_add (domains, "(sb)", - addr_family == AF_INET - ? nm_ip4_config_get_search (config, i) - : nm_ip6_config_get_search (config, i), + nm_ip_config_get_search (config, i), route_only); } } else { - n = addr_family == AF_INET - ? nm_ip4_config_get_num_domains (config) - : nm_ip6_config_get_num_domains (config); + n = nm_ip_config_get_num_domains (config); for (i = 0; i < n; i++) { g_variant_builder_add (domains, "(sb)", - addr_family == AF_INET - ? nm_ip4_config_get_domain (config, i) - : nm_ip6_config_get_domain (config, i), + nm_ip_config_get_domain (config, i), route_only); } } From 3422988c2a12426c48f396034ee1331008145469 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 10 Jan 2018 11:23:33 +0100 Subject: [PATCH 5/5] dns: introduce routing domains Similarly to what systemd-resolved does, introduce the concept of "routing" domain, which is a domain in the search list that is used only to decide the interface over which a query must be forwarded, but is not used to complete unqualified host names. Routing domains are those starting with a tilde ('~') before the actual domain name. Domains without the initial tilde are used both for completing unqualified names and for the routing decision. (cherry picked from commit e91f1a7d2a6b8400b6b331d5b72287dcb5164a39) --- clients/common/settings-docs.c.in | 4 ++-- libnm-core/nm-setting-ip-config.c | 5 ++++- src/dns/nm-dns-dnsmasq.c | 8 ++++--- src/dns/nm-dns-manager.c | 36 ++++++++++++++++++++++--------- src/dns/nm-dns-systemd-resolved.c | 21 +++++++++--------- src/nm-core-utils.c | 15 +++++++++++++ src/nm-core-utils.h | 2 ++ 7 files changed, 64 insertions(+), 27 deletions(-) diff --git a/clients/common/settings-docs.c.in b/clients/common/settings-docs.c.in index 8218d0a9d2..da1f24fa64 100644 --- a/clients/common/settings-docs.c.in +++ b/clients/common/settings-docs.c.in @@ -217,7 +217,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS N_("Array of IP addresses of DNS servers.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_OPTIONS N_("Array of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_PRIORITY N_("Intra-connection DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf. A lower value means that servers will be on top of the file. Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. For that, just specify the DNS servers in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used.") -#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_SEARCH N_("Array of DNS search domains.") +#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_SEARCH N_("Array of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_GATEWAY N_("The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used.") @@ -237,7 +237,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS N_("Array of IP addresses of DNS servers.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_OPTIONS N_("Array of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_PRIORITY N_("Intra-connection DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf. A lower value means that servers will be on top of the file. Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. For that, just specify the DNS servers in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used.") -#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_SEARCH N_("Array of DNS search domains.") +#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_SEARCH N_("Array of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_GATEWAY N_("The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used.") diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 779d4428ff..18d93f9deb 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -2960,7 +2960,10 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class) /** * NMSettingIPConfig:dns-search: * - * Array of DNS search domains. + * Array of DNS search domains. Domains starting with a tilde ('~') + * are considered 'routing' domains and are used only to decide the + * interface over which a query must be forwarded; they are not used + * to complete unqualified host names. **/ g_object_class_install_property (object_class, PROP_DNS_SEARCH, diff --git a/src/dns/nm-dns-dnsmasq.c b/src/dns/nm-dns-dnsmasq.c index f1cf406c91..bc6ef4a26d 100644 --- a/src/dns/nm-dns-dnsmasq.c +++ b/src/dns/nm-dns-dnsmasq.c @@ -219,7 +219,7 @@ add_ip_config (NMDnsDnsmasq *self, char ip_addr_to_string_buf[IP_ADDR_TO_STRING_BUFLEN]; char **domains, **iter; gboolean iface_resolved = FALSE; - const char *iface = NULL; + const char *iface = NULL, *domain; addr_family = nm_ip_config_get_addr_family (ip_config); g_return_if_fail (NM_IN_SET (addr_family, AF_INET, AF_INET6)); @@ -247,21 +247,23 @@ add_ip_config (NMDnsDnsmasq *self, /* searches are preferred over domains */ n = nm_ip_config_get_num_searches (ip_config); for (i = 0; i < n; i++) { + domain = nm_utils_parse_dns_domain (nm_ip_config_get_search (ip_config, i), NULL); add_dnsmasq_nameserver (self, servers, ip_addr_to_string_buf, - nm_ip_config_get_search (ip_config, i)); + domain); added = TRUE; } if (n == 0) { /* If not searches, use any domains */ n = nm_ip_config_get_num_domains (ip_config); + domain = nm_utils_parse_dns_domain (nm_ip_config_get_domain (ip_config, i), NULL); for (i = 0; i < n; i++) { add_dnsmasq_nameserver (self, servers, ip_addr_to_string_buf, - nm_ip_config_get_domain (ip_config, i)); + domain); added = TRUE; } } diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 17a170a48e..6813e9b86c 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -180,7 +180,7 @@ static void _ip_config_dns_priority_changed (gpointer config, /*****************************************************************************/ static gboolean -domain_is_valid (const gchar *domain, gboolean check_public_suffix) +domain_is_valid (const char *domain, gboolean check_public_suffix) { if (*domain == '\0') return FALSE; @@ -191,6 +191,12 @@ domain_is_valid (const gchar *domain, gboolean check_public_suffix) return TRUE; } +static gboolean +domain_is_routing (const char *domain) +{ + return domain[0] == '~'; +} + /*****************************************************************************/ NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_rc_manager_to_string, NMDnsManagerResolvConfManager, @@ -377,7 +383,8 @@ add_dns_option_item (GPtrArray *array, const char *str) } static void -add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config, gboolean dup) +add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config, + gboolean include_routing, gboolean dup) { guint num_domains, num_searches, i; const char *str; @@ -387,14 +394,20 @@ add_dns_domains (GPtrArray *array, const NMIPConfig *ip_config, gboolean dup) for (i = 0; i < num_searches; i++) { str = nm_ip_config_get_search (ip_config, i); - if (domain_is_valid (str, FALSE)) - add_string_item (array, str, dup); + if (!include_routing && domain_is_routing (str)) + continue; + if (!domain_is_valid (nm_utils_parse_dns_domain (str, NULL), FALSE)) + continue; + add_string_item (array, str, dup); } if (num_domains > 1 || !num_searches) { for (i = 0; i < num_domains; i++) { str = nm_ip_config_get_domain (ip_config, i); - if (domain_is_valid (str, FALSE)) - add_string_item (array, str, dup); + if (!include_routing && domain_is_routing (str)) + continue; + if (!domain_is_valid (nm_utils_parse_dns_domain (str, NULL), FALSE)) + continue; + add_string_item (array, str, dup); } } } @@ -439,7 +452,7 @@ merge_one_ip_config (NMResolvConfData *rc, add_string_item (rc->nameservers, buf, TRUE); } - add_dns_domains (rc->searches, ip_config, TRUE); + add_dns_domains (rc->searches, ip_config, FALSE, TRUE); num = nm_ip_config_get_num_dns_options (ip_config); for (i = 0; i < num; i++) { @@ -966,8 +979,11 @@ merge_global_dns_config (NMResolvConfData *rc, NMGlobalDnsConfig *global_conf) options = nm_global_dns_config_get_options (global_conf); for (i = 0; searches && searches[i]; i++) { - if (domain_is_valid (searches[i], FALSE)) - add_string_item (rc->searches, searches[i], TRUE); + if (domain_is_routing (searches[i])) + continue; + if (!domain_is_valid (searches[i], FALSE)) + continue; + add_string_item (rc->searches, searches[i], TRUE); } for (i = 0; options && options[i]; i++) @@ -1951,7 +1967,7 @@ _get_config_variant (NMDnsManager *self) else g_ptr_array_set_size (array_domains, 0); - add_dns_domains (array_domains, ip_config, FALSE); + add_dns_domains (array_domains, ip_config, TRUE, FALSE); if (array_domains->len) { g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); for (i = 0; i < array_domains->len; i++) { diff --git a/src/dns/nm-dns-systemd-resolved.c b/src/dns/nm-dns-systemd-resolved.c index ec8561fac0..4692f978fe 100644 --- a/src/dns/nm-dns-systemd-resolved.c +++ b/src/dns/nm-dns-systemd-resolved.c @@ -146,7 +146,8 @@ update_add_ip_config (NMDnsSystemdResolved *self, int addr_family; gsize addr_size; guint i, n; - gboolean route_only; + gboolean is_routing; + const char *domain; addr_family = nm_ip_config_get_addr_family (config); addr_size = nm_utils_addr_family_to_size (addr_family); @@ -163,25 +164,23 @@ update_add_ip_config (NMDnsSystemdResolved *self, g_variant_builder_close (dns); } - /* If this link is never the default (e.g. only used for resources on this - * network) add a routing domain. */ - route_only = addr_family == AF_INET - ? !nm_ip4_config_best_default_route_get (NM_IP4_CONFIG (config)) - : !nm_ip6_config_best_default_route_get (NM_IP6_CONFIG (config)); - n = nm_ip_config_get_num_searches (config); if (n > 0) { for (i = 0; i < n; i++) { + domain = nm_utils_parse_dns_domain (nm_ip_config_get_search (config, i), + &is_routing); g_variant_builder_add (domains, "(sb)", - nm_ip_config_get_search (config, i), - route_only); + domain, + is_routing); } } else { n = nm_ip_config_get_num_domains (config); for (i = 0; i < n; i++) { + domain = nm_utils_parse_dns_domain (nm_ip_config_get_domain (config, i), + &is_routing); g_variant_builder_add (domains, "(sb)", - nm_ip_config_get_domain (config, i), - route_only); + domain, + is_routing); } } } diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index f6b33a1490..a8c593ecaa 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -4329,6 +4329,21 @@ nm_utils_format_con_diff_for_audit (GHashTable *diff) return g_string_free (str, FALSE); } +const char * +nm_utils_parse_dns_domain (const char *domain, gboolean *is_routing) +{ + g_return_val_if_fail (domain, NULL); + g_return_val_if_fail (domain[0], NULL); + + if (domain[0] == '~') { + domain++; + NM_SET_OUT (is_routing, TRUE); + } else + NM_SET_OUT (is_routing, FALSE); + + return domain; +} + /*****************************************************************************/ NM_UTILS_ENUM2STR_DEFINE (nm_icmpv6_router_pref_to_string, NMIcmpv6RouterPref, diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index cc78472442..f43648c1bb 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -450,4 +450,6 @@ const char *nm_activation_type_to_string (NMActivationType activation_type); /*****************************************************************************/ +const char *nm_utils_parse_dns_domain (const char *domain, gboolean *is_routing); + #endif /* __NM_CORE_UTILS_H__ */