static void fs_posix_write_rename_if_needed(struct posix_fs_file *file)
{
struct posix_fs *fs = (struct posix_fs *)file->file.fs;
- const char *new_fname, *new_prefix, *p;
+ const char *new_fname;
new_fname = fs_metadata_find(&file->file.metadata, FS_METADATA_WRITE_FNAME);
if (new_fname == NULL)
return;
- p = strrchr(file->file.path, '/');
- if (p == NULL)
- new_prefix = "";
- else
- new_prefix = t_strdup_until(file->file.path, p+1);
i_free(file->file.path);
- file->file.path = i_strconcat(new_prefix, new_fname, NULL);
+ file->file.path = i_strdup(new_fname);
i_free(file->full_path);
file->full_path = fs->path_prefix == NULL ? i_strdup(file->file.path) :
#include "lib.h"
#include "str.h"
+#include "ostream.h"
#include "fs-api.h"
#include "safe-mkdir.h"
#include "safe-mkstemp.h"
fs_file_deinit(&file);
test_end();
+ test_begin("test-fs-posix file write fname rename");
+ file = fs_file_init(fs, "subdir/badfname", FS_OPEN_MODE_REPLACE);
+ struct ostream *output = fs_write_stream(file);
+ o_stream_nsend_str(output, "hello");
+ fs_set_metadata(file, FS_METADATA_WRITE_FNAME, "subdir/rename1");
+ test_assert(fs_write_stream_finish(file, &output) == 1);
+ test_assert(strcmp(fs_file_path(file), "subdir/rename1") == 0);
+ fs_file_deinit(&file);
+ file = fs_file_init(fs, "subdir/rename1", 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: