summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-07-25 15:36:50 +0200
committerThomas Haller <thaller@redhat.com>2022-07-26 12:28:03 +0200
commit1f7db38dd79e101735bf625cb8f5d0f28e32a016 (patch)
tree1015160802db8841fdef25308a92026d62a4f44d
parent76d63c66d773afe40640c1199ebdcc7e5a85b15b (diff)
downloadNetworkManager-1f7db38dd79e101735bf625cb8f5d0f28e32a016.tar.gz
glib-aux: add nm_ip_addr_cmp_for_sort() helper for sorting IP addresses
It's similar to nm_ip_addr_cmp(), but it can be used as an argument to g_qsort_with_data() to sort a list of NMIPAddr (or in_addr_t or struct in6_addr). The address family needs to be given as user-data.
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.c9
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.h5
2 files changed, 14 insertions, 0 deletions
diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c
index 6128b0cb8a..9c0d16164a 100644
--- a/src/libnm-glib-aux/nm-shared-utils.c
+++ b/src/libnm-glib-aux/nm-shared-utils.c
@@ -44,6 +44,15 @@ G_STATIC_ASSERT(_nm_alignof(struct in_addr) <= _nm_alignof(NMIPAddr));
G_STATIC_ASSERT(_nm_alignof(struct in6_addr) <= _nm_alignof(NMIPAddr));
G_STATIC_ASSERT(_nm_alignof(NMEtherAddr) <= _nm_alignof(NMIPAddr));
+int
+nm_ip_addr_cmp_for_sort(gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ /* This is a compare function that can be used for sorting IP addresses.
+ * Essentially, it calls memcmp(). @user_data must be GINT_TO_POINTER(addr_family).
+ * @a and @b must be either pointers to in_addr_t, struct in6_addr or NMIPAddr. */
+ return nm_ip_addr_cmp(GPOINTER_TO_INT(user_data), a, b);
+}
+
/* this initializes a struct in_addr/in6_addr and allows for untrusted
* arguments (like unsuitable @addr_family or @src_len). It's almost safe
* in the sense that it verifies input arguments strictly. Also, it
diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h
index 81c7260612..ab183d9ac8 100644
--- a/src/libnm-glib-aux/nm-shared-utils.h
+++ b/src/libnm-glib-aux/nm-shared-utils.h
@@ -243,11 +243,16 @@ extern const NMIPAddr nm_ip_addr_zero;
static inline int
nm_ip_addr_cmp(int addr_family, gconstpointer a, gconstpointer b)
{
+ /* Note that @a and @b are not required to be full NMIPAddr unions.
+ * Depending on @addr_family, they can also be only in_addr_t or
+ * struct in6_addr. */
NM_CMP_SELF(a, b);
NM_CMP_DIRECT_MEMCMP(a, b, nm_utils_addr_family_to_size(addr_family));
return 0;
}
+int nm_ip_addr_cmp_for_sort(gconstpointer a, gconstpointer b, gpointer user_data);
+
static inline gboolean
nm_ip_addr_equal(int addr_family, gconstpointer a, gconstpointer b)
{