diff options
-rw-r--r-- | libnm-core/nm-connection.c | 54 | ||||
-rw-r--r-- | libnm-core/nm-core-internal.h | 6 |
2 files changed, 60 insertions, 0 deletions
diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c index 4e4a835cbf..f986f824e3 100644 --- a/libnm-core/nm-connection.c +++ b/libnm-core/nm-connection.c @@ -1689,6 +1689,60 @@ nm_connection_normalize (NMConnection *connection, return TRUE; } +gboolean +_nm_connection_ensure_normalized (NMConnection *connection, + gboolean allow_modify, + const char *enforce_uuid, + NMConnection **out_connection_clone, + GError **error) +{ + gs_unref_object NMConnection *connection_clone = NULL; + gs_free_error GError *local = NULL; + NMSettingVerifyResult vresult; + + nm_assert (NM_IS_CONNECTION (connection)); + nm_assert (out_connection_clone && !*out_connection_clone); + nm_assert (!enforce_uuid || nm_utils_is_uuid (enforce_uuid)); + + vresult = _nm_connection_verify (connection, &local); + if (vresult != NM_SETTING_VERIFY_SUCCESS) { + if (!NM_IN_SET (vresult, NM_SETTING_VERIFY_NORMALIZABLE, + NM_SETTING_VERIFY_NORMALIZABLE_ERROR)) { + g_propagate_error (error, g_steal_pointer (&local)); + return FALSE; + } + if (!allow_modify) { + connection_clone = nm_simple_connection_new_clone (connection); + connection = connection_clone; + } + if (!nm_connection_normalize (connection, NULL, NULL, error)) { + nm_assert_not_reached (); + return FALSE; + } + } + + if (enforce_uuid) { + if (!nm_streq (enforce_uuid, nm_connection_get_uuid (connection))) { + NMSettingConnection *s_con; + + if ( !allow_modify + && !connection_clone) { + connection_clone = nm_simple_connection_new_clone (connection); + connection = connection_clone; + } + s_con = nm_connection_get_setting_connection (connection); + g_object_set (s_con, + NM_SETTING_CONNECTION_UUID, + enforce_uuid, + NULL); + } + } + + if (connection_clone) + *out_connection_clone = g_steal_pointer (&connection_clone); + return TRUE; +} + /*****************************************************************************/ #if NM_MORE_ASSERTS diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 7e55b1fc3c..aed25521cb 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -201,6 +201,12 @@ typedef enum { NMSettingVerifyResult _nm_connection_verify (NMConnection *connection, GError **error); +gboolean _nm_connection_ensure_normalized (NMConnection *connection, + gboolean allow_modify, + const char *enforce_uuid, + NMConnection **out_connection_clone, + GError **error); + gboolean _nm_connection_remove_setting (NMConnection *connection, GType setting_type); #if NM_MORE_ASSERTS |