diff options
Diffstat (limited to 'src/dns/nm-dns-systemd-resolved.c')
| -rw-r--r-- | src/dns/nm-dns-systemd-resolved.c | 123 |
1 files changed, 56 insertions, 67 deletions
diff --git a/src/dns/nm-dns-systemd-resolved.c b/src/dns/nm-dns-systemd-resolved.c index fce1fef1..315f2c4d 100644 --- a/src/dns/nm-dns-systemd-resolved.c +++ b/src/dns/nm-dns-systemd-resolved.c @@ -136,81 +136,75 @@ add_interface_configuration (NMDnsSystemdResolved *self, } static void -add_domain (GVariantBuilder *domains, - const char *domain, - gboolean never_default) -{ - /* If this link is never the default (e.g. only used for resources on this - * network) add a routing domain. */ - g_variant_builder_add (domains, "(sb)", domain, never_default); -} - -static void -update_add_ip6_config (NMDnsSystemdResolved *self, - GVariantBuilder *dns, - GVariantBuilder *domains, - const NMIP6Config *config) +update_add_ip_config (NMDnsSystemdResolved *self, + GVariantBuilder *dns, + GVariantBuilder *domains, + gpointer config) { + int addr_family; + gsize addr_size; guint i, n; + gboolean route_only; - n = nm_ip6_config_get_num_nameservers (config); - for (i = 0 ; i < n; i++) { - const struct in6_addr *ip; - - g_variant_builder_open (dns, G_VARIANT_TYPE ("(iay)")); - g_variant_builder_add (dns, "i", AF_INET6); - ip = nm_ip6_config_get_nameserver (config, i), - - g_variant_builder_add_value (dns, g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, ip, 16, 1)); - g_variant_builder_close (dns); - } - - n = nm_ip6_config_get_num_searches (config); - if (n > 0) { - for (i = 0; i < n; i++) { - add_domain (domains, nm_ip6_config_get_search (config, i), - nm_ip6_config_get_never_default (config)); - } - } else { - n = nm_ip6_config_get_num_domains (config); - for (i = 0; i < n; i++) { - add_domain (domains, nm_ip6_config_get_domain (config, i), - nm_ip6_config_get_never_default (config)); - } - } -} + 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 (); -static void -update_add_ip4_config (NMDnsSystemdResolved *self, - GVariantBuilder *dns, - GVariantBuilder *domains, - const NMIP4Config *config) -{ - guint i, n; + addr_size = nm_utils_addr_family_to_size (addr_family); - n = nm_ip4_config_get_num_nameservers (config); + n = addr_family == AF_INET + ? nm_ip4_config_get_num_nameservers (config) + : nm_ip6_config_get_num_nameservers (config); for (i = 0 ; i < n; i++) { - guint32 ns; + in_addr_t ns4; + gconstpointer ns; - g_variant_builder_open (dns, G_VARIANT_TYPE ("(iay)")); - g_variant_builder_add (dns, "i", AF_INET); - ns = nm_ip4_config_get_nameserver (config, i), + 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_add_value (dns, g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, &ns, 4, 1)); + 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, + addr_size, + 1)); g_variant_builder_close (dns); } - n = nm_ip4_config_get_num_searches (config); + /* 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); + + n = addr_family == AF_INET + ? nm_ip4_config_get_num_searches (config) + : nm_ip6_config_get_num_searches (config); if (n > 0) { for (i = 0; i < n; i++) { - add_domain (domains, nm_ip4_config_get_search (config, i), - nm_ip4_config_get_never_default (config)); + g_variant_builder_add (domains, "(sb)", + addr_family == AF_INET + ? nm_ip4_config_get_search (config, i) + : nm_ip6_config_get_search (config, i), + route_only); } } else { - n = nm_ip4_config_get_num_domains (config); + n = addr_family == AF_INET + ? nm_ip4_config_get_num_domains (config) + : nm_ip6_config_get_num_domains (config); for (i = 0; i < n; i++) { - add_domain (domains, nm_ip4_config_get_domain (config, i), - nm_ip4_config_get_never_default (config)); + g_variant_builder_add (domains, "(sb)", + addr_family == AF_INET + ? nm_ip4_config_get_domain (config, i) + : nm_ip6_config_get_domain (config, i), + route_only); } } } @@ -243,14 +237,9 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic) g_variant_builder_add (&domains, "i", ic->ifindex); g_variant_builder_open (&domains, G_VARIANT_TYPE ("a(sb)")); - for (l = ic->configs ; l != NULL ; l = g_list_next (l)) { - if (NM_IS_IP4_CONFIG (l->data)) - update_add_ip4_config (self, &dns, &domains, l->data); - else if (NM_IS_IP6_CONFIG (l->data)) - update_add_ip6_config (self, &dns, &domains, l->data); - else - g_assert_not_reached (); - } + for (l = ic->configs; l; l = l->next) + update_add_ip_config (self, &dns, &domains, l->data); + g_variant_builder_close (&dns); g_variant_builder_close (&domains); |