bool seek_to_beginning;
bool success;
+ bool open_failed;
};
struct posix_fs_lock {
file->write_buf = buffer_create_dynamic(default_pool, 1024*32);
_file->output = o_stream_create_buffer(file->write_buf);
} else if (file->fd == -1 && fs_posix_open(file) < 0) {
- _file->output = o_stream_create_error(errno);
+ _file->output = o_stream_create_error_str(errno, "%s",
+ fs_file_last_error(_file));
+ file->open_failed = TRUE;
} else {
_file->output = o_stream_create_fd_file(file->fd,
(uoff_t)-1, FALSE);
struct posix_fs_file *file = (struct posix_fs_file *)_file;
int ret = success ? 0 : -1;
- if (o_stream_nfinish(_file->output) < 0) {
- fs_set_error(_file->fs, "write(%s) failed: %m",
- o_stream_get_name(_file->output));
+ if (file->open_failed)
+ ret = -1;
+ else if (o_stream_nfinish(_file->output) < 0) {
+ fs_set_error(_file->fs, "write(%s) failed: %s",
+ o_stream_get_name(_file->output),
+ o_stream_get_error(_file->output));
ret = -1;
}
o_stream_destroy(&_file->output);
i_assert(_file->output == NULL);
- if (file->super == NULL)
- _file->output = o_stream_create_error(EINVAL);
- else
+ if (file->super == NULL) {
+ _file->output = o_stream_create_error_str(EINVAL, "%s",
+ fs_file_last_error(_file));
+ } else {
_file->output = fs_write_stream(file->super);
+ }
o_stream_set_name(_file->output, _file->path);
}
i_assert(_file->output == NULL);
- if (file->super == NULL)
- _file->output = o_stream_create_error(EINVAL);
- else {
+ if (file->super == NULL) {
+ _file->output = o_stream_create_error_str(EINVAL, "%s",
+ fs_file_last_error(_file));
+ } else {
file->fs_output = fs_write_stream(file->super);
if (file->hash_input == NULL)
_file->output = file->fs_output;