summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cardace <acardace@redhat.com>2020-05-15 15:26:30 +0200
committerAntonio Cardace <acardace@redhat.com>2020-05-20 10:55:01 +0200
commite08c3a6e180e9a9a9ad9b3198176e3dd6eb671f4 (patch)
tree7702a5af63db1d51b120457c74914eb42e0bd30f
parent572f82a77b94fb0f1b39c27bc4075c3437201211 (diff)
downloadNetworkManager-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.h8
-rw-r--r--libnm-core/nm-setting.c42
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