glib-aux: add nm_ip_addr_set_from_variant() helper

This commit is contained in:
Thomas Haller 2021-10-08 17:57:41 +02:00
parent 2675e18f13
commit 3b08e27f08
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 26 additions and 0 deletions

View file

@ -99,6 +99,29 @@ nm_ip_addr_set_from_untrusted(int addr_family,
return TRUE;
}
gboolean
nm_ip_addr_set_from_variant(int addr_family, gpointer dst, GVariant *variant, int *out_addr_family)
{
gconstpointer bytes;
gsize len;
g_return_val_if_fail(dst, FALSE);
g_return_val_if_fail(variant, FALSE);
/* This function always expects IP addressea a byte arrays ("ay"). Note that
* several NetworkManager API uses "u" (32 bit unsigned intergers) for IPv4 addresses.
* So this function won't work in those cases.
*
* Btw, using "u" for IPv4 address messes badly with the endianness (host
* vs network byte order). Don't do that.
*/
g_return_val_if_fail(g_variant_is_of_type(variant, G_VARIANT_TYPE("ay")), FALSE);
bytes = g_variant_get_fixed_array(variant, &len, sizeof(guint8));
return nm_ip_addr_set_from_untrusted(addr_family, dst, bytes, len, out_addr_family);
}
/*****************************************************************************/
G_STATIC_ASSERT(ETH_ALEN == sizeof(struct ether_addr));

View file

@ -315,6 +315,9 @@ gboolean nm_ip_addr_set_from_untrusted(int addr_family,
gsize src_len,
int * out_addr_family);
gboolean
nm_ip_addr_set_from_variant(int addr_family, gpointer dst, GVariant *variant, int *out_addr_family);
static inline gboolean
nm_ip4_addr_is_localhost(in_addr_t addr4)
{