core: merge IPv4 and IPv6 implementations in NMDnsManager

This commit is contained in:
Thomas Haller
2017-11-08 21:31:01 +01:00
parent 9e25538ff5
commit 54bcbb85d3
2 changed files with 97 additions and 210 deletions

View File

@@ -7001,7 +7001,7 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
{ {
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMIP6Config *from_config = NULL; NMIP6Config *from_config = NULL;
int i; guint i, len;
if (priv->ac_ip6_config) { if (priv->ac_ip6_config) {
nm_ip6_config_reset_nameservers (priv->ac_ip6_config); nm_ip6_config_reset_nameservers (priv->ac_ip6_config);
@@ -7014,12 +7014,14 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
if (!from_config) if (!from_config)
return; return;
for (i = 0; i < nm_ip6_config_get_num_nameservers (from_config); i++) { len = nm_ip6_config_get_num_nameservers (from_config);
for (i = 0; i < len; i++) {
nm_ip6_config_add_nameserver (priv->ac_ip6_config, nm_ip6_config_add_nameserver (priv->ac_ip6_config,
nm_ip6_config_get_nameserver (from_config, i)); nm_ip6_config_get_nameserver (from_config, i));
} }
for (i = 0; i < nm_ip6_config_get_num_searches (from_config); i++) { len = nm_ip6_config_get_num_searches (from_config);
for (i = 0; i < len; i++) {
nm_ip6_config_add_search (priv->ac_ip6_config, nm_ip6_config_add_search (priv->ac_ip6_config,
nm_ip6_config_get_search (from_config, i)); nm_ip6_config_get_search (from_config, i));
} }

View File

@@ -275,135 +275,83 @@ add_string_item (GPtrArray *array, const char *str)
} }
static void static void
add_dns_option_item (GPtrArray *array, const char *str, gboolean ipv6) add_dns_option_item (GPtrArray *array, const char *str)
{ {
if (_nm_utils_dns_option_find_idx (array, str) < 0) if (_nm_utils_dns_option_find_idx (array, str) < 0)
g_ptr_array_add (array, g_strdup (str)); g_ptr_array_add (array, g_strdup (str));
} }
static void static void
merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) merge_one_ip_config (NMResolvConfData *rc,
const NMIPConfig *config,
const char *iface)
{ {
guint32 num, num_domains, num_searches, i; int addr_family;
guint num, num_domains, num_searches, i;
num = nm_ip4_config_get_num_nameservers (src);
for (i = 0; i < num; i++) {
add_string_item (rc->nameservers,
nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (src, i), NULL));
}
num_domains = nm_ip4_config_get_num_domains (src);
num_searches = nm_ip4_config_get_num_searches (src);
for (i = 0; i < num_searches; i++) {
const char *search;
search = nm_ip4_config_get_search (src, i);
if (!domain_is_valid (search, FALSE))
continue;
add_string_item (rc->searches, search);
}
if (num_domains > 1 || !num_searches) {
for (i = 0; i < num_domains; i++) {
const char *domain;
domain = nm_ip4_config_get_domain (src, i);
if (!domain_is_valid (domain, FALSE))
continue;
add_string_item (rc->searches, domain);
}
}
num = nm_ip4_config_get_num_dns_options (src);
for (i = 0; i < num; i++) {
const char *option;
option = nm_ip4_config_get_dns_option (src, i);
add_dns_option_item (rc->options, option, FALSE);
}
/* NIS stuff */
num = nm_ip4_config_get_num_nis_servers (src);
for (i = 0; i < num; i++) {
add_string_item (rc->nis_servers,
nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (src, i), NULL));
}
if (nm_ip4_config_get_nis_domain (src)) {
/* FIXME: handle multiple domains */
if (!rc->nis_domain)
rc->nis_domain = nm_ip4_config_get_nis_domain (src);
}
}
static void
merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src, const char *iface)
{
guint32 num, num_domains, num_searches, i;
num = nm_ip6_config_get_num_nameservers (src);
for (i = 0; i < num; i++) {
const struct in6_addr *addr;
char buf[NM_UTILS_INET_ADDRSTRLEN + 50]; char buf[NM_UTILS_INET_ADDRSTRLEN + 50];
const char *str;
addr = nm_ip6_config_get_nameserver (src, i); addr_family = nm_ip_config_get_addr_family (config);
/* inet_ntop is probably supposed to do this for us, but it doesn't */ nm_assert_addr_family (addr_family);
if (IN6_IS_ADDR_V4MAPPED (addr))
nm_utils_inet4_ntop (addr->s6_addr32[3], buf); num = nm_ip_config_get_num_nameservers (config);
for (i = 0; i < num; i++) {
const NMIPAddr *addr;
addr = nm_ip_config_get_nameserver (config, i);
if (addr_family == AF_INET)
nm_utils_inet_ntop (addr_family, addr, buf);
else if (IN6_IS_ADDR_V4MAPPED (addr))
nm_utils_inet4_ntop (addr->addr6.s6_addr32[3], buf);
else { else {
nm_utils_inet6_ntop (addr, buf); nm_utils_inet6_ntop (&addr->addr6, buf);
if (IN6_IS_ADDR_LINKLOCAL (addr)) { if (IN6_IS_ADDR_LINKLOCAL (addr)) {
g_strlcat (buf, "%", sizeof (buf)); g_strlcat (buf, "%", sizeof (buf));
g_strlcat (buf, iface, sizeof (buf)); g_strlcat (buf, iface, sizeof (buf));
} }
} }
add_string_item (rc->nameservers, buf); add_string_item (rc->nameservers, buf);
} }
num_domains = nm_ip6_config_get_num_domains (src); num_domains = nm_ip_config_get_num_domains (config);
num_searches = nm_ip6_config_get_num_searches (src); num_searches = nm_ip_config_get_num_searches (config);
for (i = 0; i < num_searches; i++) { for (i = 0; i < num_searches; i++) {
const char *search; str = nm_ip_config_get_search (config, i);
if (domain_is_valid (str, FALSE))
search = nm_ip6_config_get_search (src, i); add_string_item (rc->searches, str);
if (!domain_is_valid (search, FALSE))
continue;
add_string_item (rc->searches, search);
} }
if (num_domains > 1 || !num_searches) { if (num_domains > 1 || !num_searches) {
for (i = 0; i < num_domains; i++) { for (i = 0; i < num_domains; i++) {
const char *domain; str = nm_ip_config_get_domain (config, i);
if (domain_is_valid (str, FALSE))
domain = nm_ip6_config_get_domain (src, i); add_string_item (rc->searches, str);
if (!domain_is_valid (domain, FALSE))
continue;
add_string_item (rc->searches, domain);
} }
} }
num = nm_ip6_config_get_num_dns_options (src); num = nm_ip_config_get_num_dns_options (config);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
const char *option; add_dns_option_item (rc->options,
nm_ip_config_get_dns_option (config, i));
option = nm_ip6_config_get_dns_option (src, i);
add_dns_option_item (rc->options, option, TRUE);
} }
}
static void if (addr_family == AF_INET) {
merge_one_ip_config_data (NMResolvConfData *rc, const NMIP4Config *config4 = (const NMIP4Config *) config;
NMDnsIPConfigData *data)
{ /* NIS stuff */
if (NM_IS_IP4_CONFIG (data->config)) num = nm_ip4_config_get_num_nis_servers (config4);
merge_one_ip4_config (rc, (NMIP4Config *) data->config); for (i = 0; i < num; i++) {
else if (NM_IS_IP6_CONFIG (data->config)) add_string_item (rc->nis_servers,
merge_one_ip6_config (rc, (NMIP6Config *) data->config, data->iface); nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (config4, i), buf));
else }
g_return_if_reached ();
if (nm_ip4_config_get_nis_domain (config4)) {
/* FIXME: handle multiple domains */
if (!rc->nis_domain)
rc->nis_domain = nm_ip4_config_get_nis_domain (config4);
}
}
} }
static GPid static GPid
@@ -927,39 +875,27 @@ merge_global_dns_config (NMResolvConfData *rc, NMGlobalDnsConfig *global_conf)
} }
static const char * static const char *
get_nameserver_list (void *config, GString **str) get_nameserver_list (const NMIPConfig *config, GString **str)
{ {
NMIP4Config *ip4;
NMIP6Config *ip6;
guint num, i; guint num, i;
char buf[NM_UTILS_INET_ADDRSTRLEN];
nm_assert (str); int addr_family;
if (*str) if (*str)
g_string_truncate (*str, 0); g_string_truncate (*str, 0);
else else
*str = g_string_sized_new (64); *str = g_string_sized_new (64);
if (NM_IS_IP4_CONFIG (config)) { addr_family = nm_ip_config_get_addr_family (config);
ip4 = (NMIP4Config *) config; num = nm_ip_config_get_num_nameservers (config);
num = nm_ip4_config_get_num_nameservers (ip4);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
g_string_append (*str, nm_utils_inet_ntop (addr_family,
nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (ip4, i), nm_ip_config_get_nameserver (config, i),
NULL)); buf);
if (i > 0)
g_string_append_c (*str, ' '); g_string_append_c (*str, ' ');
g_string_append (*str, buf);
} }
} else if (NM_IS_IP6_CONFIG (config)) {
ip6 = (NMIP6Config *) config;
num = nm_ip6_config_get_num_nameservers (ip6);
for (i = 0; i < num; i++) {
g_string_append (*str,
nm_utils_inet6_ntop (nm_ip6_config_get_nameserver (ip6, i),
NULL));
g_string_append_c (*str, ' ');
}
} else
g_return_val_if_reached (NULL);
return (*str)->str; return (*str)->str;
} }
@@ -998,34 +934,31 @@ _collect_resolv_conf_data (NMDnsManager *self, /* only for logging context, no o
nm_auto_free_gstring GString *tmp_gstring = NULL; nm_auto_free_gstring GString *tmp_gstring = NULL;
int prio, first_prio = 0; int prio, first_prio = 0;
NMDnsIPConfigData *current; NMDnsIPConfigData *current;
gboolean v4;
for (i = 0, j = 0; i < configs->len; i++) { for (i = 0, j = 0; i < configs->len; i++) {
gboolean skip = FALSE; gboolean skip = FALSE;
current = configs->pdata[i]; current = configs->pdata[i];
prio = nm_ip_config_get_dns_priority (NM_IP_CONFIG_CAST (current->config)); prio = nm_ip_config_get_dns_priority (current->config);
if (i == 0) if (i == 0)
first_prio = prio; first_prio = prio;
else if (first_prio < 0 && first_prio != prio) else if (first_prio < 0 && first_prio != prio)
skip = TRUE; skip = TRUE;
v4 = NM_IS_IP4_CONFIG (current->config); if (nm_ip_config_get_num_nameservers (current->config)) {
if ( ( v4 && nm_ip4_config_get_num_nameservers ((NMIP4Config *) current->config))
|| (!v4 && nm_ip6_config_get_num_nameservers ((NMIP6Config *) current->config))) {
_LOGT ("config: %8d %-7s v%c %-16s %s: %s", _LOGT ("config: %8d %-7s v%c %-16s %s: %s",
prio, prio,
_config_type_to_string (current->type), _config_type_to_string (current->type),
v4 ? '4' : '6', nm_utils_addr_family_to_char (nm_ip_config_get_addr_family (current->config)),
current->iface, current->iface,
skip ? "<SKIP>" : "", skip ? "<SKIP>" : "",
get_nameserver_list (current->config, &tmp_gstring)); get_nameserver_list (current->config, &tmp_gstring));
} }
if (!skip) if (!skip)
merge_one_ip_config_data (&rc, current); merge_one_ip_config (&rc, current->config, current->iface);
} }
} }
@@ -1307,7 +1240,7 @@ nm_dns_manager_add_ip_config (NMDnsManager *self,
g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE); g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE);
g_return_val_if_fail (config, FALSE); g_return_val_if_fail (config, FALSE);
g_return_val_if_fail (iface && iface[0], FALSE); g_return_val_if_fail (iface && iface[0], FALSE);
nm_assert (NM_IP4_CONFIG (config) || NM_IS_IP6_CONFIG (config)); nm_assert (NM_IS_IP_CONFIG (config));
priv = NM_DNS_MANAGER_GET_PRIVATE (self); priv = NM_DNS_MANAGER_GET_PRIVATE (self);
@@ -1365,7 +1298,7 @@ nm_dns_manager_remove_ip_config (NMDnsManager *self, gpointer config)
g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE); g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE);
g_return_val_if_fail (config, FALSE); g_return_val_if_fail (config, FALSE);
nm_assert (NM_IP4_CONFIG (config) || NM_IS_IP6_CONFIG (config)); nm_assert (NM_IS_IP_CONFIG (config));
priv = NM_DNS_MANAGER_GET_PRIVATE (self); priv = NM_DNS_MANAGER_GET_PRIVATE (self);
@@ -1885,42 +1818,39 @@ _get_config_variant (NMDnsManager *self)
for (i = 0; i < priv->configs->len; i++) { for (i = 0; i < priv->configs->len; i++) {
NMDnsIPConfigData *current = priv->configs->pdata[i]; NMDnsIPConfigData *current = priv->configs->pdata[i];
const NMIPConfig *config = current->config;
GVariantBuilder entry_builder; GVariantBuilder entry_builder;
GVariantBuilder strv_builder; GVariantBuilder strv_builder;
gboolean v4 = NM_IS_IP4_CONFIG (current->config); guint num;
gint priority; const int addr_family = nm_ip_config_get_addr_family (config);
char buf[NM_UTILS_INET_ADDRSTRLEN];
if (v4) { const NMIPAddr *addr;
NMIP4Config *config = NM_IP4_CONFIG (current->config);
guint num = nm_ip4_config_get_num_nameservers (config);
guint32 ns;
num = nm_ip_config_get_num_nameservers (config);
if (!num) if (!num)
continue; continue;
g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}"));
/* Add nameservers */
g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
for (j = 0; j < num; j++) { for (j = 0; j < num; j++) {
ns = nm_ip4_config_get_nameserver (config, j); addr = nm_ip_config_get_nameserver (config, j);
g_variant_builder_add (&strv_builder, g_variant_builder_add (&strv_builder,
"s", "s",
nm_utils_inet4_ntop (ns, NULL)); nm_utils_inet_ntop (addr_family, addr, buf));
} }
g_variant_builder_add (&entry_builder, g_variant_builder_add (&entry_builder,
"{sv}", "{sv}",
"nameservers", "nameservers",
g_variant_builder_end (&strv_builder)); g_variant_builder_end (&strv_builder));
/* Add domains */ num = nm_ip_config_get_num_domains (config);
num = nm_ip4_config_get_num_domains (config);
if (num > 0) { if (num > 0) {
g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
for (j = 0; j < num; j++) { for (j = 0; j < num; j++) {
g_variant_builder_add (&strv_builder, g_variant_builder_add (&strv_builder,
"s", "s",
nm_ip4_config_get_domain (config, j)); nm_ip_config_get_domain (config, j));
} }
g_variant_builder_add (&entry_builder, g_variant_builder_add (&entry_builder,
"{sv}", "{sv}",
@@ -1928,49 +1858,6 @@ _get_config_variant (NMDnsManager *self)
g_variant_builder_end (&strv_builder)); g_variant_builder_end (&strv_builder));
} }
priority = nm_ip4_config_get_dns_priority (config);
} else {
NMIP6Config *config = NM_IP6_CONFIG (current->config);
guint num = nm_ip6_config_get_num_nameservers (config);
const struct in6_addr *ns;
if (!num)
continue;
g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}"));
/* Add nameservers */
g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
for (j = 0; j < num; j++) {
ns = nm_ip6_config_get_nameserver (config, j);
g_variant_builder_add (&strv_builder,
"s",
nm_utils_inet6_ntop (ns, NULL));
}
g_variant_builder_add (&entry_builder,
"{sv}",
"nameservers",
g_variant_builder_end (&strv_builder));
/* Add domains */
num = nm_ip6_config_get_num_domains (config);
if (num > 0) {
g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
for (j = 0; j < num; j++) {
g_variant_builder_add (&strv_builder,
"s",
nm_ip6_config_get_domain (config, j));
}
g_variant_builder_add (&entry_builder,
"{sv}",
"domains",
g_variant_builder_end (&strv_builder));
}
priority = nm_ip6_config_get_dns_priority (config);
}
/* Add device */
if (current->iface) { if (current->iface) {
g_variant_builder_add (&entry_builder, g_variant_builder_add (&entry_builder,
"{sv}", "{sv}",
@@ -1978,13 +1865,11 @@ _get_config_variant (NMDnsManager *self)
g_variant_new_string (current->iface)); g_variant_new_string (current->iface));
} }
/* Add priority */
g_variant_builder_add (&entry_builder, g_variant_builder_add (&entry_builder,
"{sv}", "{sv}",
"priority", "priority",
g_variant_new_int32 (priority)); g_variant_new_int32 (nm_ip_config_get_dns_priority (config)));
/* Add VPN */
g_variant_builder_add (&entry_builder, g_variant_builder_add (&entry_builder,
"{sv}", "{sv}",
"vpn", "vpn",