libnm: unify IPv4/IPv6 forms of DNS to GVariant helper

This commit is contained in:
Thomas Haller 2022-10-24 18:36:29 +02:00
parent d5be1c706e
commit bdb124852f
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
4 changed files with 31 additions and 54 deletions

View file

@ -391,7 +391,7 @@ ip4_dns_to_dbus(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil)
if (nm_g_ptr_array_len(dns) == 0)
return NULL;
return _nm_utils_ip4_dns_to_variant((const char *const *) dns->pdata, dns->len);
return nm_utils_dns_to_variant(AF_INET, (const char *const *) dns->pdata, dns->len);
}
static gboolean

View file

@ -392,7 +392,7 @@ ip6_dns_to_dbus(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil)
if (nm_g_ptr_array_len(dns) == 0)
return NULL;
return _nm_utils_ip6_dns_to_variant((const char *const *) dns->pdata, dns->len);
return nm_utils_dns_to_variant(AF_INET6, (const char *const *) dns->pdata, dns->len);
}
static gboolean

View file

@ -64,8 +64,7 @@ GVariant *_nm_team_settings_property_to_dbus(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS
void _nm_team_settings_property_from_dbus_link_watchers(
_NM_SETT_INFO_PROP_FROM_DBUS_GPROP_FCN_ARGS _nm_nil);
GVariant *_nm_utils_ip4_dns_to_variant(const char *const *dns, gssize len);
GVariant *_nm_utils_ip6_dns_to_variant(const char *const *dns, gssize len);
GVariant *nm_utils_dns_to_variant(int addr_family, const char *const *dns, gssize len);
const char *const *nmtst_system_encodings_for_lang(const char *lang);
const char *const *nmtst_system_encodings_get_default(void);

View file

@ -1297,12 +1297,30 @@ nm_utils_wpa_psk_valid(const char *psk)
GVariant *
nm_utils_ip4_dns_to_variant(char **dns)
{
return _nm_utils_ip4_dns_to_variant(NM_CAST_STRV_CC(dns), -1);
return nm_utils_dns_to_variant(AF_INET, NM_CAST_STRV_CC(dns), -1);
}
/**
* nm_utils_ip6_dns_to_variant:
* @dns: (type utf8): an array of IP address strings
*
* Utility function to convert an array of IP address strings int a #GVariant of
* type 'aay' representing an array of IPv6 addresses.
*
* If a string cannot be parsed, it will be silently ignored.
*
* Returns: (transfer none): a new floating #GVariant representing @dns.
**/
GVariant *
nm_utils_ip6_dns_to_variant(char **dns)
{
return nm_utils_dns_to_variant(AF_INET6, NM_CAST_STRV_CC(dns), -1);
}
GVariant *
_nm_utils_ip4_dns_to_variant(const char *const *dns, gssize len)
nm_utils_dns_to_variant(int addr_family, const char *const *dns, gssize len)
{
const int IS_IPv4 = NM_IS_IPv4(addr_family);
GVariantBuilder builder;
gsize l;
gsize i;
@ -1312,17 +1330,20 @@ _nm_utils_ip4_dns_to_variant(const char *const *dns, gssize len)
else
l = len;
g_variant_builder_init(&builder, G_VARIANT_TYPE("au"));
g_variant_builder_init(&builder, IS_IPv4 ? G_VARIANT_TYPE("au") : G_VARIANT_TYPE("aay"));
for (i = 0; i < l; i++) {
in_addr_t ip;
NMIPAddr ip;
/* We can only represent the IP address on the legacy property "ipv4.dns".
/* We can only represent the IP address on the legacy property "ipv[46].dns".
* Expose what we can. */
if (!nm_utils_dnsname_parse(AF_INET, dns[i], NULL, &ip, NULL))
if (!nm_utils_dnsname_parse(addr_family, dns[i], NULL, &ip, NULL))
continue;
g_variant_builder_add(&builder, "u", ip);
if (IS_IPv4)
g_variant_builder_add(&builder, "u", ip);
else
g_variant_builder_add(&builder, "@ay", nm_g_variant_new_ay_in6addr(&ip.addr6));
}
return g_variant_builder_end(&builder);
@ -1610,49 +1631,6 @@ nm_utils_ip4_get_default_prefix(guint32 ip)
return nm_ip4_addr_get_default_prefix(ip);
}
/**
* nm_utils_ip6_dns_to_variant:
* @dns: (type utf8): an array of IP address strings
*
* Utility function to convert an array of IP address strings int a #GVariant of
* type 'aay' representing an array of IPv6 addresses.
*
* If a string cannot be parsed, it will be silently ignored.
*
* Returns: (transfer none): a new floating #GVariant representing @dns.
**/
GVariant *
nm_utils_ip6_dns_to_variant(char **dns)
{
return _nm_utils_ip6_dns_to_variant(NM_CAST_STRV_CC(dns), -1);
}
GVariant *
_nm_utils_ip6_dns_to_variant(const char *const *dns, gssize len)
{
GVariantBuilder builder;
gsize i;
gsize l;
if (len < 0)
l = NM_PTRARRAY_LEN(dns);
else
l = len;
g_variant_builder_init(&builder, G_VARIANT_TYPE("aay"));
for (i = 0; i < l; i++) {
struct in6_addr ip;
/* We can only represent the IP address on the legacy property "ipv6.dns".
* Expose what we can. */
if (!nm_utils_dnsname_parse(AF_INET6, dns[i], NULL, &ip, NULL))
continue;
g_variant_builder_add(&builder, "@ay", nm_g_variant_new_ay_in6addr(&ip));
}
return g_variant_builder_end(&builder);
}
/**
* nm_utils_ip6_dns_from_variant:
* @value: a #GVariant of type 'aay'