diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
commit | f7548d6d28c313cf80e6f3ef89aed16a19815df1 (patch) | |
tree | a3f6f2a3f247293bee59ecd28e8cd8ceb6ca064a /src/lib-fs/fs-wrapper.c | |
parent | Initial commit. (diff) | |
download | dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.tar.xz dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.zip |
Adding upstream version 1:2.3.19.1+dfsg1.upstream/1%2.3.19.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib-fs/fs-wrapper.c')
-rw-r--r-- | src/lib-fs/fs-wrapper.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/lib-fs/fs-wrapper.c b/src/lib-fs/fs-wrapper.c new file mode 100644 index 0000000..81d746e --- /dev/null +++ b/src/lib-fs/fs-wrapper.c @@ -0,0 +1,172 @@ +/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "fs-api-private.h" +#include "ostream.h" + +struct wrapper_fs_iter { + struct fs_iter iter; + struct fs_iter *parent; +}; + +enum fs_properties fs_wrapper_get_properties(struct fs *fs) +{ + return fs_get_properties(fs->parent); +} + +void fs_wrapper_file_close(struct fs_file *file) +{ + fs_file_close(file->parent); +} + +const char *fs_wrapper_file_get_path(struct fs_file *file) +{ + return fs_file_path(file->parent); +} + +void fs_wrapper_set_async_callback(struct fs_file *file, + fs_file_async_callback_t *callback, + void *context) +{ + fs_file_set_async_callback(file->parent, *callback, context); +} + +void fs_wrapper_wait_async(struct fs *fs) +{ + fs_wait_async(fs->parent); +} + +void fs_wrapper_set_metadata(struct fs_file *file, const char *key, + const char *value) +{ + fs_set_metadata(file->parent, key, value); +} + +int fs_wrapper_get_metadata(struct fs_file *file, + enum fs_get_metadata_flags flags, + const ARRAY_TYPE(fs_metadata) **metadata_r) +{ + return fs_get_metadata_full(file->parent, flags, metadata_r); +} + +bool fs_wrapper_prefetch(struct fs_file *file, uoff_t length) +{ + return fs_prefetch(file->parent, length); +} + +ssize_t fs_wrapper_read(struct fs_file *file, void *buf, size_t size) +{ + return fs_read(file->parent, buf, size); +} + +struct istream * +fs_wrapper_read_stream(struct fs_file *file, size_t max_buffer_size) +{ + return fs_read_stream(file->parent, max_buffer_size); +} + +int fs_wrapper_write(struct fs_file *file, const void *data, size_t size) +{ + return fs_write(file->parent, data, size); +} + +void fs_wrapper_write_stream(struct fs_file *file) +{ + i_assert(file->output == NULL); + + file->output = fs_write_stream(file->parent); +} + +int fs_wrapper_write_stream_finish(struct fs_file *file, bool success) +{ + if (file->output == NULL) + return fs_write_stream_finish_async(file->parent); + + if (!success) { + fs_write_stream_abort_parent(file, &file->output); + return -1; + } + return fs_write_stream_finish(file->parent, &file->output); +} + +int fs_wrapper_lock(struct fs_file *file, unsigned int secs, + struct fs_lock **lock_r) +{ + return fs_lock(file->parent, secs, lock_r); +} + +void fs_wrapper_unlock(struct fs_lock *_lock ATTR_UNUSED) +{ + i_unreached(); +} + +int fs_wrapper_exists(struct fs_file *file) +{ + return fs_exists(file->parent); +} + +int fs_wrapper_stat(struct fs_file *file, struct stat *st_r) +{ + return fs_stat(file->parent, st_r); +} + +int fs_wrapper_get_nlinks(struct fs_file *file, nlink_t *nlinks_r) +{ + return fs_get_nlinks(file->parent, nlinks_r); +} + +int fs_wrapper_copy(struct fs_file *src, struct fs_file *dest) +{ + if (src != NULL) + return fs_copy(src->parent, dest->parent); + else + return fs_copy_finish_async(dest->parent); +} + +int fs_wrapper_rename(struct fs_file *src, struct fs_file *dest) +{ + return fs_rename(src->parent, dest->parent); +} + +int fs_wrapper_delete(struct fs_file *file) +{ + return fs_delete(file->parent); +} + +struct fs_iter *fs_wrapper_iter_alloc(void) +{ + struct wrapper_fs_iter *iter = i_new(struct wrapper_fs_iter, 1); + return &iter->iter; +} + +void fs_wrapper_iter_init(struct fs_iter *_iter, const char *path, + enum fs_iter_flags flags) +{ + struct wrapper_fs_iter *iter = (struct wrapper_fs_iter *)_iter; + + iter->parent = fs_iter_init_parent(_iter, path, flags); +} + +const char *fs_wrapper_iter_next(struct fs_iter *_iter) +{ + struct wrapper_fs_iter *iter = (struct wrapper_fs_iter *)_iter; + const char *fname; + + iter->parent->async_callback = _iter->async_callback; + iter->parent->async_context = _iter->async_context; + + fname = fs_iter_next(iter->parent); + _iter->async_have_more = iter->parent->async_have_more; + return fname; +} + +int fs_wrapper_iter_deinit(struct fs_iter *_iter) +{ + struct wrapper_fs_iter *iter = (struct wrapper_fs_iter *)_iter; + const char *error; + int ret; + + if ((ret = fs_iter_deinit(&iter->parent, &error)) < 0) + fs_set_error_errno(_iter->event, "%s", error); + return ret; +} |