summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-06-01 11:39:34 +0200
committerThomas Haller <thaller@redhat.com>2019-06-13 09:44:23 +0200
commitbd86f6990ecdf2331fa38af39419da2be460a87e (patch)
tree4ec8057275c7520a55fc890d51c0a87ad18a6fc0
parent8a0edbdc0414c534aad3bb6765e6fed8758b16bc (diff)
downloadNetworkManager-th/various-settings-cleanup.tar.gz
libnm: add _nm_connection_ensure_normalized() helperth/various-settings-cleanup
-rw-r--r--libnm-core/nm-connection.c54
-rw-r--r--libnm-core/nm-core-internal.h6
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