From d5c212b145b84461deea8523a64b42540d99c663 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 10 Dec 2017 12:18:21 +0100 Subject: [PATCH] shared: add nm_utils_strv_make_deep_copied() helper At several places we create strv arrays where the strings themself are not deep-copied. This helper function iterates over such an "const char **" array, clones the strings, and updates the strv array inplace to be a "char **" strv array. This helper function is to reduce code duplication. --- shared/nm-utils/nm-shared-utils.c | 17 +++++++++++++++++ shared/nm-utils/nm-shared-utils.h | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/shared/nm-utils/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c index 8a7890b093..25b867538c 100644 --- a/shared/nm-utils/nm-shared-utils.c +++ b/shared/nm-utils/nm-shared-utils.c @@ -1175,3 +1175,20 @@ nm_utils_strdict_get_keys (const GHashTable *hash, NM_SET_OUT (out_length, length); return names; } + +char ** +nm_utils_strv_make_deep_copied (const char **strv) +{ + gsize i; + + /* it takes a strv dictionary, and copies each + * strings. Note that this updates @strv *in-place* + * and returns it. */ + + if (!strv) + return NULL; + for (i = 0; strv[i]; i++) + strv[i] = g_strdup (strv[i]); + + return (char **) strv; +} diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h index 81a66d5b28..e52b419b0c 100644 --- a/shared/nm-utils/nm-shared-utils.h +++ b/shared/nm-utils/nm-shared-utils.h @@ -447,6 +447,14 @@ const char **nm_utils_strdict_get_keys (const GHashTable *hash, gboolean sorted, guint *out_length); +char **nm_utils_strv_make_deep_copied (const char **strv); + +static inline char ** +nm_utils_strv_make_deep_copied_nonnull (const char **strv) +{ + return nm_utils_strv_make_deep_copied (strv) ?: g_new0 (char *, 1); +} + /*****************************************************************************/ #define NM_UTILS_NS_PER_SECOND ((gint64) 1000000000)