diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 768f55f8cb..0c06004859 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -604,44 +604,40 @@ ignore_cb (NMSettingsConnection *self, { } -/* Replaces the settings in this connection with those in 'new_connection'. If - * any changes are made, commits them to permanent storage and to any other - * subsystems watching this connection. Before returning, 'callback' is run - * with the given 'user_data' along with any errors encountered. - */ -static void -replace_and_commit (NMSettingsConnection *self, - NMConnection *new_connection, - NMSettingsConnectionCommitFunc callback, - gpointer user_data) -{ - GError *error = NULL; - NMSettingsConnectionCommitReason commit_reason = NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION; - - if (g_strcmp0 (nm_connection_get_id (NM_CONNECTION (self)), - nm_connection_get_id (new_connection)) != 0) - commit_reason |= NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED; - - if (nm_settings_connection_replace_settings (self, new_connection, TRUE, "replace-and-commit-disk", &error)) - nm_settings_connection_commit_changes (self, commit_reason, callback, user_data); - else { - g_assert (error); - if (callback) - callback (self, error, user_data); - g_clear_error (&error); - } -} - void nm_settings_connection_replace_and_commit (NMSettingsConnection *self, NMConnection *new_connection, NMSettingsConnectionCommitFunc callback, gpointer user_data) { + gs_free_error GError *error = NULL; + NMSettingsConnectionClass *klass; + NMSettingsConnectionCommitReason commit_reason = NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION; + g_return_if_fail (NM_IS_SETTINGS_CONNECTION (self)); g_return_if_fail (NM_IS_CONNECTION (new_connection)); - NM_SETTINGS_CONNECTION_GET_CLASS (self)->replace_and_commit (self, new_connection, callback, user_data); + klass = NM_SETTINGS_CONNECTION_GET_CLASS (self); + + if (nm_streq0 (nm_connection_get_id (NM_CONNECTION (self)), + nm_connection_get_id (new_connection))) + commit_reason |= NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED; + + if (klass->can_commit) { + if (!klass->can_commit (self, &error)) { + if (callback) + callback (self, error, user_data); + return; + } + } + + if (!nm_settings_connection_replace_settings (self, new_connection, TRUE, "replace-and-commit-disk", &error)) { + if (callback) + callback (self, error, user_data); + return; + } + + nm_settings_connection_commit_changes (self, commit_reason, callback, user_data); } static void @@ -2902,7 +2898,6 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *class) object_class->get_property = get_property; object_class->set_property = set_property; - class->replace_and_commit = replace_and_commit; class->commit_changes = commit_changes; class->delete = do_delete; class->supports_secrets = supports_secrets; diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h index ecfac07905..387267fa3b 100644 --- a/src/settings/nm-settings-connection.h +++ b/src/settings/nm-settings-connection.h @@ -112,11 +112,8 @@ struct _NMSettingsConnection { struct _NMSettingsConnectionClass { NMExportedObjectClass parent; - /* virtual methods */ - void (*replace_and_commit) (NMSettingsConnection *self, - NMConnection *new_connection, - NMSettingsConnectionCommitFunc callback, - gpointer user_data); + gboolean (*can_commit) (NMSettingsConnection *self, + GError **error); void (*commit_changes) (NMSettingsConnection *self, NMSettingsConnectionCommitReason commit_reason, diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c index b54f9549a6..fe8a4f079b 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c @@ -306,27 +306,21 @@ nm_ifcfg_connection_get_unrecognized_spec (NMIfcfgConnection *self) return NM_IFCFG_CONNECTION_GET_PRIVATE (self)->unrecognized_spec; } -static void -replace_and_commit (NMSettingsConnection *connection, - NMConnection *new_connection, - NMSettingsConnectionCommitFunc callback, - gpointer user_data) +static gboolean +can_commit (NMSettingsConnection *connection, + GError **error) { const char *filename; - GError *error = NULL; filename = nm_settings_connection_get_filename (connection); - if (filename && utils_has_complex_routes (filename)) { - if (callback) { - error = g_error_new_literal (NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED, - "Cannot modify a connection that has an associated 'rule-' or 'rule6-' file"); - callback (connection, error, user_data); - g_clear_error (&error); - } - return; + if ( filename + && utils_has_complex_routes (filename)) { + g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED, + "Cannot modify a connection that has an associated 'rule-' or 'rule6-' file"); + return FALSE; } - NM_SETTINGS_CONNECTION_CLASS (nm_ifcfg_connection_parent_class)->replace_and_commit (connection, new_connection, callback, user_data); + return TRUE; } static void @@ -530,7 +524,7 @@ nm_ifcfg_connection_class_init (NMIfcfgConnectionClass *ifcfg_connection_class) object_class->dispose = dispose; settings_class->delete = do_delete; - settings_class->replace_and_commit = replace_and_commit; + settings_class->can_commit = can_commit; settings_class->commit_changes = commit_changes; obj_properties[PROP_UNMANAGED_SPEC] =