From: Timo Sirainen Date: Tue, 5 Jul 2016 14:52:00 +0000 (+0300) Subject: lib-fs: Implement all lib-fs functions as wrappers to parent stream. X-Git-Tag: 2.2.26~496 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=485061caed71bfadcf8e78b200c0f29a4951c946;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Implement all lib-fs functions as wrappers to parent stream. --- diff --git a/src/lib-fs/Makefile.am b/src/lib-fs/Makefile.am index 96930462ea..08bae08a66 100644 --- a/src/lib-fs/Makefile.am +++ b/src/lib-fs/Makefile.am @@ -18,6 +18,7 @@ libfs_la_SOURCES = \ fs-sis.c \ fs-sis-common.c \ fs-sis-queue.c \ + fs-wrapper.c \ istream-fs-file.c \ istream-fs-stats.c \ istream-metawrap.c \ @@ -28,6 +29,7 @@ headers = \ fs-api.h \ fs-api-private.h \ fs-sis-common.h \ + fs-wrapper.h \ fs-test.h \ istream-fs-file.h \ istream-fs-stats.h \ diff --git a/src/lib-fs/fs-api-private.h b/src/lib-fs/fs-api-private.h index fa5168b575..da04b0b120 100644 --- a/src/lib-fs/fs-api-private.h +++ b/src/lib-fs/fs-api-private.h @@ -2,6 +2,7 @@ #define FS_API_PRIVATE_H #include "fs-api.h" +#include "fs-wrapper.h" #include "module-context.h" #include @@ -98,6 +99,7 @@ struct fs_file { /* linked list of all files */ struct fs_file *prev, *next; + struct fs_file *parent; /* for wrapper filesystems */ struct fs *fs; struct ostream *output; char *path; diff --git a/src/lib-fs/fs-wrapper.c b/src/lib-fs/fs-wrapper.c new file mode 100644 index 0000000000..36c88800e2 --- /dev/null +++ b/src/lib-fs/fs-wrapper.c @@ -0,0 +1,163 @@ +/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "fs-api-private.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); +} + +int fs_wrapper_wait_async(struct fs *fs) +{ + return 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, + const ARRAY_TYPE(fs_metadata) **metadata_r) +{ + return fs_get_metadata(file->parent, 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 (!success) { + fs_write_stream_abort(file->parent, &file->output); + return -1; + } + + if (fs_write_stream_finish(file->parent, &file->output) < 0) + return -1; + return 1; +} + +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_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_init(struct fs *fs, const char *path, + enum fs_iter_flags flags) +{ + struct wrapper_fs_iter *iter; + + iter = i_new(struct wrapper_fs_iter, 1); + iter->iter.fs = fs; + iter->iter.flags = flags; + iter->parent = fs_iter_init(fs->parent, path, flags); + return &iter->iter; +} + +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; + int ret; + + ret = fs_iter_deinit(&iter->parent); + i_free(iter); + return ret; +} diff --git a/src/lib-fs/fs-wrapper.h b/src/lib-fs/fs-wrapper.h new file mode 100644 index 0000000000..d7ee3051a6 --- /dev/null +++ b/src/lib-fs/fs-wrapper.h @@ -0,0 +1,36 @@ +#ifndef FS_WRAPPER_H +#define FS_WRAPPER_H + +enum fs_properties fs_wrapper_get_properties(struct fs *fs); +void fs_wrapper_file_close(struct fs_file *file); +const char *fs_wrapper_file_get_path(struct fs_file *file); +void fs_wrapper_set_async_callback(struct fs_file *file, + fs_file_async_callback_t *callback, + void *context); +int fs_wrapper_wait_async(struct fs *fs); +void fs_wrapper_set_metadata(struct fs_file *file, const char *key, + const char *value); +int fs_wrapper_get_metadata(struct fs_file *file, + const ARRAY_TYPE(fs_metadata) **metadata_r); +bool fs_wrapper_prefetch(struct fs_file *file, uoff_t length); +ssize_t fs_wrapper_read(struct fs_file *file, void *buf, size_t size); +struct istream * +fs_wrapper_read_stream(struct fs_file *file, size_t max_buffer_size); +int fs_wrapper_write(struct fs_file *file, const void *data, size_t size); +void fs_wrapper_write_stream(struct fs_file *file); +int fs_wrapper_write_stream_finish(struct fs_file *file, bool success); +int fs_wrapper_lock(struct fs_file *file, unsigned int secs, + struct fs_lock **lock_r); +void fs_wrapper_unlock(struct fs_lock *_lock); +int fs_wrapper_exists(struct fs_file *file); +int fs_wrapper_stat(struct fs_file *file, struct stat *st_r); +int fs_wrapper_copy(struct fs_file *src, struct fs_file *dest); +int fs_wrapper_rename(struct fs_file *src, struct fs_file *dest); +int fs_wrapper_delete(struct fs_file *file); +struct fs_iter * +fs_wrapper_iter_init(struct fs *fs, const char *path, + enum fs_iter_flags flags); +const char *fs_wrapper_iter_next(struct fs_iter *iter); +int fs_wrapper_iter_deinit(struct fs_iter *iter); + +#endif