diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 9fe658c1c2..6d7661b916 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -310,8 +310,6 @@ gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue /*****************************************************************************/ -typedef gboolean (*NMSettingOptionFilterFcn)(const char *name); - GHashTable *_nm_setting_option_hash (NMSetting *setting, gboolean create_if_necessary); @@ -325,9 +323,6 @@ guint _nm_setting_option_get_all (NMSetting *setting, gboolean _nm_setting_option_clear (NMSetting *setting, const char *optname); -gboolean _nm_setting_option_clear_all (NMSetting *setting, - NMSettingOptionFilterFcn filter); - /*****************************************************************************/ guint nm_setting_ethtool_init_features (NMSettingEthtool *setting, diff --git a/libnm-core/nm-setting-ethtool.c b/libnm-core/nm-setting-ethtool.c index 1be74cc9cb..ac0310da82 100644 --- a/libnm-core/nm-setting-ethtool.c +++ b/libnm-core/nm-setting-ethtool.c @@ -226,9 +226,8 @@ nm_setting_ethtool_clear_features (NMSettingEthtool *setting) { g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting)); - if (_nm_setting_option_clear_all (NM_SETTING (setting), - &nm_ethtool_optname_is_feature)) - _notify_attributes (setting); + nm_setting_option_clear_by_name (NM_SETTING (setting), + nm_ethtool_optname_is_feature); } guint @@ -369,9 +368,8 @@ nm_setting_ethtool_clear_coalesce_all (NMSettingEthtool *setting) { g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting)); - if (_nm_setting_option_clear_all (NM_SETTING (setting), - &nm_ethtool_optname_is_coalesce)) - _notify_attributes (setting); + nm_setting_option_clear_by_name (NM_SETTING (setting), + nm_ethtool_optname_is_coalesce); } /** @@ -468,9 +466,8 @@ nm_setting_ethtool_clear_ring_all (NMSettingEthtool *setting) { g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting)); - if (_nm_setting_option_clear_all (NM_SETTING (setting), - &nm_ethtool_optname_is_ring)) - _notify_attributes (setting); + nm_setting_option_clear_by_name (NM_SETTING (setting), + nm_ethtool_optname_is_ring); } /*****************************************************************************/ diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index a99a46b0ea..dfb2bed958 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -2525,30 +2525,47 @@ _nm_setting_option_clear (NMSetting *setting, return g_hash_table_remove (ht, optname); } -gboolean -_nm_setting_option_clear_all (NMSetting *setting, - NMSettingOptionFilterFcn filter) +/** + * nm_setting_option_clear_by_name: + * @setting: the #NMSetting + * @predicate: (allow-none) (scope call): the predicate for which names + * should be clear. + * If the predicate returns %TRUE for an option name, the option + * gets removed. If %NULL, all options will be removed. + * + * Since: 1.26 + */ +void +nm_setting_option_clear_by_name (NMSetting *setting, + NMUtilsPredicateStr predicate) { - GHashTable *ht; - const char *name; + GHashTable *hash; GHashTableIter iter; + const char *name; gboolean changed = FALSE; - nm_assert (NM_IS_SETTING (setting)); + g_return_if_fail (NM_IS_SETTING (setting)); - ht = _nm_setting_option_hash (setting, FALSE); - if (!ht) - return FALSE; + hash = _nm_setting_option_hash (NM_SETTING (setting), FALSE); + if (!hash) + return; - 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; + if (!predicate) { + changed = (g_hash_table_size (hash) > 0); + if (changed) + g_hash_table_remove_all (hash); + } else { + g_hash_table_iter_init (&iter, hash); + while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) { + if (predicate (name)) { + g_hash_table_iter_remove (&iter); + changed = TRUE; + } } } - return changed; + if (changed) + _nm_setting_option_notify (setting, TRUE); } /*****************************************************************************/ diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h index a3a732218e..01cd1503e8 100644 --- a/libnm-core/nm-setting.h +++ b/libnm-core/nm-setting.h @@ -366,6 +366,11 @@ NM_AVAILABLE_IN_1_26 const char *const*nm_setting_option_get_all_names (NMSetting *setting, guint *out_len); + +NM_AVAILABLE_IN_1_26 +void nm_setting_option_clear_by_name (NMSetting *setting, + NMUtilsPredicateStr predicate); + /*****************************************************************************/ const GVariantType *nm_setting_get_dbus_property_type (NMSetting *setting, diff --git a/libnm/libnm.ver b/libnm/libnm.ver index 5a3c5eeeac..030a68c885 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -1732,6 +1732,7 @@ global: nm_setting_match_remove_driver_by_value; nm_setting_match_remove_kernel_command_line; nm_setting_match_remove_kernel_command_line_by_value; + nm_setting_option_clear_by_name; nm_setting_option_get; nm_setting_option_get_all_names; nm_setting_option_get_boolean;