From: Timo Sirainen Date: Tue, 22 May 2018 13:06:15 +0000 (+0300) Subject: fs-posix: Support FS_METADATA_WRITE_FNAME for fs_copy() X-Git-Tag: 2.3.9~1820 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2155f0b0f762c93765a619f98e24dd5d0d829300;p=thirdparty%2Fdovecot%2Fcore.git fs-posix: Support FS_METADATA_WRITE_FNAME for fs_copy() --- diff --git a/src/lib-fs/fs-posix.c b/src/lib-fs/fs-posix.c index 08069d1be5..f8019d0b70 100644 --- a/src/lib-fs/fs-posix.c +++ b/src/lib-fs/fs-posix.c @@ -763,6 +763,7 @@ static int fs_posix_copy(struct fs_file *_src, struct fs_file *_dest) unsigned int try_count = 0; int ret; + fs_posix_write_rename_if_needed(dest); ret = link(src->full_path, dest->full_path); if (errno == EEXIST && dest->open_mode == FS_OPEN_MODE_REPLACE) { /* destination file already exists - replace it */ diff --git a/src/lib-fs/test-fs-posix.c b/src/lib-fs/test-fs-posix.c index ada5a239a4..611d3d12ee 100644 --- a/src/lib-fs/test-fs-posix.c +++ b/src/lib-fs/test-fs-posix.c @@ -110,6 +110,20 @@ static void test_fs_posix(void) fs_file_deinit(&file); test_end(); + test_begin("test-fs-posix file copy fname rename"); + struct fs_file *src = fs_file_init(fs, "subdir/rename1", FS_OPEN_MODE_READONLY); + struct fs_file *dest = fs_file_init(fs, "subdir/badfname", FS_OPEN_MODE_REPLACE); + fs_set_metadata(dest, FS_METADATA_WRITE_FNAME, "subdir/rename2"); + test_assert(fs_copy(src, dest) == 0); + test_assert(strcmp(fs_file_path(dest), "subdir/rename2") == 0); + fs_file_deinit(&src); + fs_file_deinit(&dest); + file = fs_file_init(fs, "subdir/rename2", FS_OPEN_MODE_READONLY); + test_assert(fs_stat(file, &st) == 0); + test_assert(st.st_size == 5); + fs_file_deinit(&file); + test_end(); + fs_deinit(&fs); error_no_fs: