summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-01-05 16:21:56 +0100
committerThomas Haller <thaller@redhat.com>2021-01-08 16:32:49 +0100
commit30e1f733473f8990040cc8a4a7531c7d46b87aea (patch)
tree39fe24b9fa716d3fb237386bd9ed4b8f3fb4b086
parentf0faf2e1a1eeaa15f7e84c1ccc8d4d8b28d2fe9f (diff)
downloadNetworkManager-30e1f733473f8990040cc8a4a7531c7d46b87aea.tar.gz
cloud-setup: add nmcs_utils_ipaddr_normalize*() helper
-rw-r--r--clients/cloud-setup/nm-cloud-setup-utils.c53
-rw-r--r--clients/cloud-setup/nm-cloud-setup-utils.h20
2 files changed, 73 insertions, 0 deletions
diff --git a/clients/cloud-setup/nm-cloud-setup-utils.c b/clients/cloud-setup/nm-cloud-setup-utils.c
index 24b3ee6a29..95a84d10f6 100644
--- a/clients/cloud-setup/nm-cloud-setup-utils.c
+++ b/clients/cloud-setup/nm-cloud-setup-utils.c
@@ -533,6 +533,59 @@ nmcs_utils_hwaddr_normalize(const char *hwaddr, gssize len)
/*****************************************************************************/
+gboolean
+nmcs_utils_ipaddr_normalize_bin(int addr_family,
+ const char *addr,
+ gssize len,
+ int * out_addr_family,
+ gpointer out_addr_bin)
+{
+ gs_free char *addr_clone = NULL;
+ char * ad;
+ gsize l;
+
+ nm_assert(len >= -1);
+
+ if (len < 0) {
+ if (!addr)
+ return FALSE;
+ l = strlen(addr);
+ } else {
+ l = len;
+ if (l > 0 && addr[l - 1] == '\0') {
+ /* we accept one '\0' at the end of the string. */
+ l--;
+ }
+ if (memchr(addr, '\0', l)) {
+ /* but we don't accept other NUL characters in the middle. */
+ return FALSE;
+ }
+ }
+
+ if (l == 0)
+ return FALSE;
+
+ nm_assert(addr);
+ ad = nm_strndup_a(300, addr, l, &addr_clone);
+
+ g_strstrip(ad);
+
+ return nm_utils_parse_inaddr_bin(addr_family, ad, out_addr_family, out_addr_bin);
+}
+
+char *
+nmcs_utils_ipaddr_normalize(int addr_family, const char *addr, gssize len)
+{
+ NMIPAddr ipaddr;
+
+ if (!nmcs_utils_ipaddr_normalize_bin(addr_family, addr, len, &addr_family, &ipaddr))
+ return NULL;
+
+ return nm_utils_inet_ntop_dup(addr_family, &ipaddr);
+}
+
+/*****************************************************************************/
+
const char *
nmcs_utils_parse_memmem(GBytes *mem, const char *needle)
{
diff --git a/clients/cloud-setup/nm-cloud-setup-utils.h b/clients/cloud-setup/nm-cloud-setup-utils.h
index 217f07550e..52edd27994 100644
--- a/clients/cloud-setup/nm-cloud-setup-utils.h
+++ b/clients/cloud-setup/nm-cloud-setup-utils.h
@@ -90,6 +90,26 @@ nmcs_utils_hwaddr_normalize_gbytes(GBytes *hwaddr)
/*****************************************************************************/
+gboolean nmcs_utils_ipaddr_normalize_bin(int addr_family,
+ const char *addr,
+ gssize len,
+ int * out_addr_family,
+ gpointer out_addr_bin);
+
+char *nmcs_utils_ipaddr_normalize(int addr_family, const char *addr, gssize len);
+
+static inline char *
+nmcs_utils_ipaddr_normalize_gbytes(int addr_family, GBytes *addr)
+{
+ const char *str;
+ gsize len;
+
+ str = g_bytes_get_data(addr, &len);
+ return nmcs_utils_ipaddr_normalize(addr_family, str, len);
+}
+
+/*****************************************************************************/
+
const char *nmcs_utils_parse_memmem(GBytes *mem, const char *needle);
const char *nmcs_utils_parse_get_full_line(GBytes *mem, const char *needle);