summary refs log tree commit diff
path: root/src/dns/nm-dns-systemd-resolved.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dns/nm-dns-systemd-resolved.c')
-rw-r--r--src/dns/nm-dns-systemd-resolved.c123
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);