diff options
author | Antonio Cardace <acardace@redhat.com> | 2020-05-15 15:26:30 +0200 |
---|---|---|
committer | Antonio Cardace <acardace@redhat.com> | 2020-05-20 10:55:01 +0200 |
commit | e08c3a6e180e9a9a9ad9b3198176e3dd6eb671f4 (patch) | |
tree | 7702a5af63db1d51b120457c74914eb42e0bd30f | |
parent | 572f82a77b94fb0f1b39c27bc4075c3437201211 (diff) | |
download | NetworkManager-e08c3a6e180e9a9a9ad9b3198176e3dd6eb671f4.tar.gz |
nm-setting: add internal gendata API to clear value(s)
The filter function in nm_setting_gendata_clear_all() is useful
for when you want to only clear values according to a predicate,
if no such function is supplied all values will be cleared.
https://bugzilla.redhat.com/show_bug.cgi?id=1614700
-rw-r--r-- | libnm-core/nm-core-internal.h | 8 | ||||
-rw-r--r-- | libnm-core/nm-setting.c | 42 |
2 files changed, 50 insertions, 0 deletions
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 33062d74ab..cc37e68df0 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -310,6 +310,8 @@ gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue /*****************************************************************************/ +typedef gboolean (*nm_setting_gendata_filter_fcn)(const char *name); + GHashTable *_nm_setting_gendata_hash (NMSetting *setting, gboolean create_if_necessary); @@ -334,6 +336,12 @@ const char *const*nm_setting_gendata_get_all_names (NMSetting *setting, GVariant *const*nm_setting_gendata_get_all_values (NMSetting *setting); +gboolean nm_setting_gendata_clear (NMSetting *setting, + const char *optname); + +gboolean nm_setting_gendata_clear_all (NMSetting *setting, + nm_setting_gendata_filter_fcn filter); + gboolean nm_setting_gendata_get_uint32 (NMSetting *setting, const char *optname, guint32 *out_value); diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index bf721301f4..50a277d8b8 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -2649,6 +2649,48 @@ nm_setting_gendata_set_uint32 (NMSetting *setting, g_variant_ref_sink (g_variant_new_uint32 (value))); } +gboolean +nm_setting_gendata_clear (NMSetting *setting, + const char *optname) +{ + GHashTable *ht; + + nm_assert (NM_IS_SETTING (setting)); + nm_assert (nm_str_not_empty (optname)); + + ht = _nm_setting_gendata_hash (setting, FALSE); + if (!ht) + return FALSE; + + return g_hash_table_remove (ht, optname); +} + +gboolean +nm_setting_gendata_clear_all (NMSetting *setting, + nm_setting_gendata_filter_fcn filter) +{ + GHashTable *ht; + const char *name; + GHashTableIter iter; + gboolean changed = FALSE; + + nm_assert (NM_IS_SETTING (setting)); + + ht = _nm_setting_gendata_hash (setting, FALSE); + if (!ht) + return FALSE; + + g_hash_table_iter_init (&iter, ht); + while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) { + if (!filter || filter (name)) { + g_hash_table_iter_remove (&iter); + changed = TRUE; + } + } + + return changed; +} + /*****************************************************************************/ static void |