dns: merge IPv4 and IPv6 versions of add_ip_config() (part 1)

This commit is contained in:
Thomas Haller
2017-12-15 13:17:22 +01:00
parent 03cba93873
commit 49fd1e4126

View File

@@ -201,144 +201,146 @@ add_global_config (NMDnsDnsmasq *self, GVariantBuilder *dnsmasq_servers, const N
} }
static gboolean static gboolean
add_ip4_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP4Config *ip4, add_ip_config (NMDnsDnsmasq *self,
const char *iface, gboolean split) GVariantBuilder *servers,
NMIPConfig *ip_config,
const char *iface,
gboolean split)
{ {
char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ]; int addr_family = nm_ip_config_get_addr_family (ip_config);
char buf2[INET_ADDRSTRLEN];
in_addr_t addr;
int nnameservers, i_nameserver, n, i;
gboolean added = FALSE;
g_return_val_if_fail (iface, FALSE); if (addr_family == AF_INET) {
nnameservers = nm_ip4_config_get_num_nameservers (ip4); NMIP4Config *ip4 = (NMIP4Config *) ip_config;
char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ];
char buf2[INET_ADDRSTRLEN];
in_addr_t addr;
int nnameservers, i_nameserver, n, i;
gboolean added = FALSE;
if (split) { g_return_val_if_fail (iface, FALSE);
char **domains, **iter; nnameservers = nm_ip4_config_get_num_nameservers (ip4);
if (nnameservers == 0) if (split) {
return FALSE; char **domains, **iter;
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) { if (nnameservers == 0)
addr = nm_ip4_config_get_nameserver (ip4, i_nameserver); return FALSE;
g_snprintf (buf, sizeof (buf), "%s@%s",
nm_utils_inet4_ntop (addr, buf2), iface);
/* searches are preferred over domains */ for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
n = nm_ip4_config_get_num_searches (ip4); addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
for (i = 0; i < n; i++) { g_snprintf (buf, sizeof (buf), "%s@%s",
add_dnsmasq_nameserver (self, nm_utils_inet4_ntop (addr, buf2), iface);
servers,
buf,
nm_ip4_config_get_search (ip4, i));
added = TRUE;
}
if (n == 0) { /* searches are preferred over domains */
/* If not searches, use any domains */ n = nm_ip4_config_get_num_searches (ip4);
n = nm_ip4_config_get_num_domains (ip4);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
add_dnsmasq_nameserver (self, add_dnsmasq_nameserver (self,
servers, servers,
buf, buf,
nm_ip4_config_get_domain (ip4, i)); nm_ip4_config_get_search (ip4, i));
added = TRUE; added = TRUE;
} }
}
/* Ensure reverse-DNS works by directing queries for in-addr.arpa if (n == 0) {
* domains to the split domain's nameserver. /* If not searches, use any domains */
*/ n = nm_ip4_config_get_num_domains (ip4);
domains = get_ip4_rdns_domains (ip4); for (i = 0; i < n; i++) {
if (domains) { add_dnsmasq_nameserver (self,
for (iter = domains; iter && *iter; iter++) servers,
add_dnsmasq_nameserver (self, servers, buf, *iter); buf,
g_strfreev (domains); nm_ip4_config_get_domain (ip4, i));
} added = TRUE;
} }
} }
/* If no searches or domains, just add the nameservers */ /* Ensure reverse-DNS works by directing queries for in-addr.arpa
if (!added) { * domains to the split domain's nameserver.
for (i = 0; i < nnameservers; i++) { */
addr = nm_ip4_config_get_nameserver (ip4, i); domains = get_ip4_rdns_domains (ip4);
g_snprintf (buf, sizeof (buf), "%s@%s", if (domains) {
nm_utils_inet4_ntop (addr, buf2), iface); for (iter = domains; iter && *iter; iter++)
add_dnsmasq_nameserver (self, servers, buf, NULL); add_dnsmasq_nameserver (self, servers, buf, *iter);
} g_strfreev (domains);
}
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 no searches or domains, just add the nameservers */
if (!added) { if (!added) {
for (i = 0; i < nnameservers; i++) { for (i = 0; i < nnameservers; i++) {
addr = nm_ip6_config_get_nameserver (ip6, i); addr = nm_ip4_config_get_nameserver (ip4, i);
buf = ip6_addr_to_string (addr, iface); g_snprintf (buf, sizeof (buf), "%s@%s",
if (buf) { nm_utils_inet4_ntop (addr, buf2), iface);
add_dnsmasq_nameserver (self, servers, buf, NULL); add_dnsmasq_nameserver (self, servers, buf, NULL);
}
}
} else {
NMIP6Config *ip6 = (NMIP6Config *) ip_config;
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); 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; return TRUE;
@@ -347,20 +349,11 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
static gboolean static gboolean
add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *data) add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *data)
{ {
if (NM_IS_IP4_CONFIG (data->config)) { return add_ip_config (self,
return add_ip4_config (self, servers,
servers, data->config,
(NMIP4Config *) data->config, data->iface,
data->iface, data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
} else if (NM_IS_IP6_CONFIG (data->config)) {
return add_ip6_config (self,
servers,
(NMIP6Config *) data->config,
data->iface,
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
} else
g_return_val_if_reached (FALSE);
} }
static void static void