diff options
author | Thomas Haller <thaller@redhat.com> | 2021-01-05 16:21:56 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-01-08 16:32:49 +0100 |
commit | 30e1f733473f8990040cc8a4a7531c7d46b87aea (patch) | |
tree | 39fe24b9fa716d3fb237386bd9ed4b8f3fb4b086 /clients/cloud-setup | |
parent | f0faf2e1a1eeaa15f7e84c1ccc8d4d8b28d2fe9f (diff) | |
download | NetworkManager-30e1f733473f8990040cc8a4a7531c7d46b87aea.tar.gz |
cloud-setup: add nmcs_utils_ipaddr_normalize*() helper
Diffstat (limited to 'clients/cloud-setup')
-rw-r--r-- | clients/cloud-setup/nm-cloud-setup-utils.c | 53 | ||||
-rw-r--r-- | clients/cloud-setup/nm-cloud-setup-utils.h | 20 |
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); |