From 3b08e27f089f04717707350447b8dfd94cce7d0b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 8 Oct 2021 17:57:41 +0200 Subject: [PATCH] glib-aux: add nm_ip_addr_set_from_variant() helper --- src/libnm-glib-aux/nm-shared-utils.c | 23 +++++++++++++++++++++++ src/libnm-glib-aux/nm-shared-utils.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index c8bbc61d8b..c793580935 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -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)); diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index d9c74c138a..ebff9716a5 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -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) {