]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Implement all lib-fs functions as wrappers to parent stream.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 5 Jul 2016 14:52:00 +0000 (17:52 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 14:35:57 +0000 (17:35 +0300)
src/lib-fs/Makefile.am
src/lib-fs/fs-api-private.h
src/lib-fs/fs-wrapper.c [new file with mode: 0644]
src/lib-fs/fs-wrapper.h [new file with mode: 0644]

index 96930462eaad140a915422a1d9cdc094e4fb4d61..08bae08a6675cd3792a49d501987806368d502de 100644 (file)
@@ -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 \
index fa5168b575a452fdf014de5cdd870cecc977d0e5..da04b0b1208804ad4763c6352cc38c36b34b4561 100644 (file)
@@ -2,6 +2,7 @@
 #define FS_API_PRIVATE_H
 
 #include "fs-api.h"
+#include "fs-wrapper.h"
 #include "module-context.h"
 
 #include <sys/time.h>
@@ -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 (file)
index 0000000..36c8880
--- /dev/null
@@ -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 (file)
index 0000000..d7ee305
--- /dev/null
@@ -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