diff options
Diffstat (limited to 'src/core/settings/plugins/keyfile/nms-keyfile-plugin.c')
| -rw-r--r-- | src/core/settings/plugins/keyfile/nms-keyfile-plugin.c | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c index 1d7de8d2..1679cab6 100644 --- a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c +++ b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c @@ -891,6 +891,7 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, gboolean reread_same; const char *uuid; char strbuf[100]; + NMTernary force_rename2; _nm_assert_storage(self, storage, TRUE); nm_assert(NM_IS_CONNECTION(connection)); @@ -910,6 +911,20 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, previous_filename = nms_keyfile_storage_get_filename(storage); uuid = nms_keyfile_storage_get_uuid(storage); + if (force_rename) + force_rename2 = NM_TERNARY_TRUE; + else { + /* If the caller does not force a rename, we honor [keyfile].rename + * setting, and (if enabled) we rename by following the preferred name + * as necessary. That's indicated with NM_TERNARY_DEFAULT. */ + force_rename2 = nm_config_data_get_value_boolean(NM_CONFIG_GET_DATA, + NM_CONFIG_KEYFILE_GROUP_KEYFILE, + NM_CONFIG_KEYFILE_KEY_KEYFILE_RENAME, + FALSE) + ? NM_TERNARY_DEFAULT + : NM_TERNARY_FALSE; + } + if (!nms_keyfile_writer_connection( connection, is_nm_generated, @@ -922,7 +937,7 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, _get_plugin_dir(priv), previous_filename, FALSE, - FALSE, + force_rename2, nm_sett_util_allow_filename_cb, NM_SETT_UTIL_ALLOW_FILENAME_DATA(&priv->storages, previous_filename), &full_filename, @@ -938,7 +953,8 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, return FALSE; } - nm_assert(full_filename && nm_streq(full_filename, previous_filename)); + nm_assert(full_filename); + nm_assert(force_rename2 != NM_TERNARY_FALSE || nm_streq(full_filename, previous_filename)); if (!reread || reread_same) nm_g_object_ref_set(&reread, connection); @@ -957,11 +973,33 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, "\")", "")); - storage->u.conn_data.is_nm_generated = is_nm_generated; - storage->u.conn_data.is_volatile = is_volatile; - storage->u.conn_data.is_external = is_external; - storage->u.conn_data.stat_mtime = *nm_sett_util_stat_mtime(full_filename, FALSE, &mtime); - storage->u.conn_data.shadowed_owned = shadowed_owned; + nm_sett_util_stat_mtime(full_filename, FALSE, &mtime); + + if (nm_streq(full_filename, previous_filename)) { + storage->u.conn_data.is_nm_generated = is_nm_generated; + storage->u.conn_data.is_volatile = is_volatile; + storage->u.conn_data.is_external = is_external; + storage->u.conn_data.stat_mtime = mtime; + storage->u.conn_data.shadowed_owned = shadowed_owned; + } else { + NMSKeyfileStorage *storage_new; + + /* The filename changed. We cannot modify the filename of an NMSettingsStorage. + * We need to create a new one. */ + storage_new = + nms_keyfile_storage_new_connection(NMS_KEYFILE_PLUGIN(storage->parent._plugin), + g_object_ref(reread), + full_filename, + storage->storage_type, + is_nm_generated, + is_volatile, + is_external, + storage->u.conn_data.shadowed_storage, + shadowed_owned, + &mtime); + nm_sett_util_storages_add_take(&priv->storages, storage_new); + storage = storage_new; + } *out_storage = g_object_ref(NM_SETTINGS_STORAGE(storage)); *out_connection = g_steal_pointer(&reread); @@ -1066,12 +1104,12 @@ delete_connection(NMSettingsPlugin *plugin, NMSettingsStorage *storage_x, GError * @shadowed_storage: a tombstone can also shadow an existing storage. * In combination with @set and @in_memory, this is allowed to store * the shadowed storage filename. - * @out_storage: (transfer full) (allow-none): the storage element that changes, or - * NULL if nothing changed. Note that the file on disk is already as - * we want to write it, then this still counts as a change. No change only + * @out_storage: (transfer full) (optional) (nullable): the storage element that + * changes, or %NULL if nothing changed. Note that the file on disk is already + * as we want to write it, then this still counts as a change. No change only * means if we try to delete a storage (@set %FALSE) that did not * exist previously. - * @out_hard_failure: (allow-none): on failure, indicate that this is a hard failure. + * @out_hard_failure: (optional): on failure, indicate that this is a hard failure. * * The function writes or deletes nmmeta files to/from filesystem. In this case, * the nmmeta files can only be symlinks to /dev/null (to indicate tombstones). |