Esempio n. 1
0
static gboolean
add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split)
{
	const struct in6_addr *addr;
	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 (nnameservers == 0)
			return FALSE;

		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);

			/* 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;
			}

			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);
		}
	}

	/* If no searches or domains, just add the namservers */
	if (!added) {
		for (i = 0; i < nnameservers; i++) {
			addr = nm_ip6_config_get_nameserver (ip6, i);
			buf = ip6_addr_to_string (addr, iface);
			if (buf) {
				g_string_append_printf (str, "server=%s\n", buf);
				g_free (buf);
			}
		}
	}

	return TRUE;
}
Esempio n. 2
0
static gboolean
add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split, const char *iface)
{
	const struct in6_addr *addr;
	char *buf;
	int n, i;
	gboolean added = FALSE;

	if (split) {
		/* FIXME: it appears that dnsmasq can only handle one nameserver
		 * per domain (at 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)
			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;
		}

		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);
	}

	/* 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++) {
			addr = nm_ip6_config_get_nameserver (ip6, i);
			buf = ip6_addr_to_string (addr, iface);
			if (buf) {
				g_string_append_printf (str, "server=%s\n", buf);
				g_free (buf);
			}
		}
	}

	return TRUE;
}
Esempio n. 3
0
static gboolean
add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
                const char *iface, gboolean split)
{
	const struct in6_addr *addr;
	char *buf = NULL;
	int nnameservers, i_nameserver, n, i;
	gboolean added = FALSE;

	g_return_val_if_fail (iface, FALSE);
	nnameservers = nm_ip6_config_get_num_nameservers (ip6);

	if (split) {
		char **domains, **iter;

		if (nnameservers == 0)
			return FALSE;

		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);

			/* searches are preferred over domains */
			n = nm_ip6_config_get_num_searches (ip6);
			for (i = 0; i < n; i++) {
				add_dnsmasq_nameserver (self,
				                        servers,
				                        buf,
				                        nm_ip6_config_get_search (ip6, i));
				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++) {
					add_dnsmasq_nameserver (self,
					                        servers,
					                        buf,
					                        nm_ip6_config_get_domain (ip6, i));
					added = TRUE;
				}
			}

			/* Ensure reverse-DNS works by directing queries for ip6.arpa
			 * domains to the split domain's nameserver.
			 */
			domains = get_ip6_rdns_domains (ip6);
			if (domains) {
				for (iter = domains; iter && *iter; iter++)
					add_dnsmasq_nameserver (self, servers, buf, *iter);
				g_strfreev (domains);
			}

			g_free (buf);
		}
	}

	/* If no searches or domains, just add the nameservers */
	if (!added) {
		for (i = 0; i < nnameservers; i++) {
			addr = nm_ip6_config_get_nameserver (ip6, i);
			buf = ip6_addr_to_string (addr, iface);
			if (buf) {
				add_dnsmasq_nameserver (self, servers, buf, NULL);
				g_free (buf);
			}
		}
	}

	return TRUE;
}