]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fs-posix: Support FS_METADATA_WRITE_FNAME for fs_copy()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 22 May 2018 13:06:15 +0000 (16:06 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 25 May 2018 07:34:38 +0000 (10:34 +0300)
src/lib-fs/fs-posix.c
src/lib-fs/test-fs-posix.c

index 3c0eebdbc08cd439add6ba70d1a2ad4b17032573..167c1c3d729672291b93c2f9d2a7cf39e07b4d5c 100644 (file)
@@ -736,6 +736,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 */
index ada5a239a4080d96f4cb2cf2d9bbf2d0bcb84a52..611d3d12ee9bf2ddf6d2ef3268c6c73744a89bac 100644 (file)
@@ -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: