about summary refs log tree commit diff
path: root/src/dns-manager/nm-dns-dnsmasq.c
diff options
context:
space:
mode:
authorSjoerd Simons <sjoerd@luon.net>2013-10-25 21:20:58 +0200
committerSjoerd Simons <sjoerd@luon.net>2013-10-25 21:20:58 +0200
commita4256940da049f91bbbea5e53e469a59ea9c10f7 (patch)
tree2211c102aea3a33f34f960f48c8b8a55daccd97b /src/dns-manager/nm-dns-dnsmasq.c
parent8d275584fc94f398f0a7c990dcd057533d9a5856 (diff)
Imported Upstream version 0.9.8.8 upstream/0.9.8.8
Diffstat (limited to 'src/dns-manager/nm-dns-dnsmasq.c')
-rw-r--r--src/dns-manager/nm-dns-dnsmasq.c128
1 files changed, 63 insertions, 65 deletions
diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c
index f7e27da3..a41f87b2 100644
--- a/src/dns-manager/nm-dns-dnsmasq.c
+++ b/src/dns-manager/nm-dns-dnsmasq.c
@@ -72,63 +72,62 @@ static gboolean
 add_ip4_config (GString *str, NMIP4Config *ip4, gboolean split)
 {
 	char buf[INET_ADDRSTRLEN + 1];
-	struct in_addr addr;
-	int n, i;
+	in_addr_t addr;
+	int nnameservers, i_nameserver, n, i;
 	gboolean added = FALSE;
 
+	nnameservers = nm_ip4_config_get_num_nameservers (ip4);
+
 	if (split) {
 		char **domains, **iter;
 
-		if (nm_ip4_config_get_num_nameservers (ip4) == 0)
+		if (nnameservers == 0)
 			return FALSE;
 
-		/* FIXME: it appears that dnsmasq can only handle one nameserver
-		 * per domain (and the manpage says this too) so only use the first
-		 * nameserver here.
-		 */
-		addr.s_addr = nm_ip4_config_get_nameserver (ip4, 0);
-		memset (&buf[0], 0, sizeof (buf));
-		if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
-			return FALSE;
-
-		/* searches are preferred over domains */
-		n = nm_ip4_config_get_num_searches (ip4);
-		for (i = 0; i < n; i++) {
-			g_string_append_printf (str, "server=/%s/%s\n",
-				                    nm_ip4_config_get_search (ip4, i),
-				                    buf);
-			added = TRUE;
-		}
+		for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
+			addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
+			memset (&buf[0], 0, sizeof (buf));
+			if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
+				return FALSE;
 
-		if (n == 0) {
-			/* If not searches, use any domains */
-			n = nm_ip4_config_get_num_domains (ip4);
+			/* searches are preferred over domains */
+			n = nm_ip4_config_get_num_searches (ip4);
 			for (i = 0; i < n; i++) {
 				g_string_append_printf (str, "server=/%s/%s\n",
-							            nm_ip4_config_get_domain (ip4, i),
-							            buf);
+				                        nm_ip4_config_get_search (ip4, i),
+				                        buf);
 				added = TRUE;
 			}
-		}
 
-		/* Ensure reverse-DNS works by directing queries for in-addr.arpa
-		 * domains to the split domain's nameserver.
-		 */
-		domains = nm_dns_utils_get_ip4_rdns_domains (ip4);
-		if (domains) {
-			for (iter = domains; iter && *iter; iter++)
-				g_string_append_printf (str, "server=/%s/%s\n", *iter, buf);
-			g_strfreev (domains);
-			added = TRUE;
+			if (n == 0) {
+				/* If not searches, use any domains */
+				n = nm_ip4_config_get_num_domains (ip4);
+				for (i = 0; i < n; i++) {
+					g_string_append_printf (str, "server=/%s/%s\n",
+					                        nm_ip4_config_get_domain (ip4, i),
+					                        buf);
+					added = TRUE;
+				}
+			}
+
+			/* Ensure reverse-DNS works by directing queries for in-addr.arpa
+			 * domains to the split domain's nameserver.
+			 */
+			domains = nm_dns_utils_get_ip4_rdns_domains (ip4);
+			if (domains) {
+				for (iter = domains; iter && *iter; iter++)
+					g_string_append_printf (str, "server=/%s/%s\n", *iter, buf);
+				g_strfreev (domains);
+				added = TRUE;
+			}
 		}
 	}
 
 	/* If no searches or domains, just add the namservers */
 	if (!added) {
-		n = nm_ip4_config_get_num_nameservers (ip4);
-		for (i = 0; i < n; i++) {
+		for (i = 0; i < nnameservers; i++) {
 			memset (&buf[0], 0, sizeof (buf));
-			addr.s_addr = nm_ip4_config_get_nameserver (ip4, i);
+			addr = nm_ip4_config_get_nameserver (ip4, i);
 			if (inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
 				g_string_append_printf (str, "server=%s\n", buf);
 		}
@@ -186,45 +185,45 @@ static gboolean
 add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split)
 {
 	const struct in6_addr *addr;
-	char *buf;
-	int n, i;
+	char *buf = NULL;
+	int nnameservers, i_nameserver, n, i;
 	gboolean added = FALSE;
 	const char *iface;
 
+	nnameservers = nm_ip6_config_get_num_nameservers (ip6);
+
 	iface = g_object_get_data (G_OBJECT (ip6), IP_CONFIG_IFACE_TAG);
 	g_assert (iface);
 
 	if (split) {
-		if (nm_ip6_config_get_num_nameservers (ip6) == 0)
-			return FALSE;
-
-		/* FIXME: it appears that dnsmasq can only handle one nameserver
-		 * per domain (at least the manpage seems to indicate that) so only use
-		 * the first nameserver here.
-		 */
-		addr = nm_ip6_config_get_nameserver (ip6, 0);
-		buf = ip6_addr_to_string (addr, iface);
-		if (!buf)
+		if (nnameservers == 0)
 			return FALSE;
 
-		/* searches are preferred over domains */
-		n = nm_ip6_config_get_num_searches (ip6);
-		for (i = 0; i < n; i++) {
-			g_string_append_printf (str, "server=/%s/%s\n",
-				                    nm_ip6_config_get_search (ip6, i),
-				                    buf);
-			added = TRUE;
-		}
+		for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
+			addr = nm_ip6_config_get_nameserver (ip6, i_nameserver);
+			buf = ip6_addr_to_string (addr, iface);
+			if (!buf)
+				return FALSE;
 
-		if (n == 0) {
-			/* If not searches, use any domains */
-			n = nm_ip6_config_get_num_domains (ip6);
+			/* searches are preferred over domains */
+			n = nm_ip6_config_get_num_searches (ip6);
 			for (i = 0; i < n; i++) {
 				g_string_append_printf (str, "server=/%s/%s\n",
-							            nm_ip6_config_get_domain (ip6, i),
-							            buf);
+				                        nm_ip6_config_get_search (ip6, i),
+				                        buf);
 				added = TRUE;
 			}
+
+			if (n == 0) {
+				/* If not searches, use any domains */
+				n = nm_ip6_config_get_num_domains (ip6);
+				for (i = 0; i < n; i++) {
+					g_string_append_printf (str, "server=/%s/%s\n",
+					                        nm_ip6_config_get_domain (ip6, i),
+					                        buf);
+					added = TRUE;
+				}
+			}
 		}
 
 		g_free (buf);
@@ -232,8 +231,7 @@ add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split)
 
 	/* If no searches or domains, just add the namservers */
 	if (!added) {
-		n = nm_ip6_config_get_num_nameservers (ip6);
-		for (i = 0; i < n; i++) {
+		for (i = 0; i < nnameservers; i++) {
 			addr = nm_ip6_config_get_nameserver (ip6, i);
 			buf = ip6_addr_to_string (addr, iface);
 			if (buf) {