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