From: Timo Sirainen Date: Sun, 22 Mar 2015 18:54:29 +0000 (+0200) Subject: lib-storage: Added mailbox_list_fs_get_list() X-Git-Tag: 2.2.17.rc1~237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=697ff56bf3cdc9e7989ea2a70accf866b14b64d1;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mailbox_list_fs_get_list() Using mailbox_list_init_fs() now sets the mailbox_list pointer to root fs, which allows the fs backends to lookup the list. Although this can't be done in the init() function since the list is set only afterwards. --- diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index adb2e09c77..4d41dea1e1 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -213,8 +213,4 @@ void mailbox_list_set_critical(struct mailbox_list *list, const char *fmt, ...) void mailbox_list_set_internal_error(struct mailbox_list *list); bool mailbox_list_set_error_from_errno(struct mailbox_list *list); -int mailbox_list_init_fs(struct mailbox_list *list, const char *driver, - const char *args, const char *root_dir, - struct fs **fs_r, const char **error_r); - #endif diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index c8112ef1ff..742f5c2556 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -13,7 +13,7 @@ #include "unichar.h" #include "settings-parser.h" #include "iostream-ssl.h" -#include "fs-api.h" +#include "fs-api-private.h" #include "imap-utf7.h" #include "mailbox-log.h" #include "mailbox-tree.h" @@ -36,9 +36,19 @@ #define MAILBOX_MAX_HIERARCHY_LEVELS 16 #define MAILBOX_MAX_HIERARCHY_NAME_LENGTH 255 +#define MAILBOX_LIST_FS_CONTEXT(obj) \ + MODULE_CONTEXT(obj, mailbox_list_fs_module) + +struct mailbox_list_fs_context { + union fs_api_module_context module_ctx; + struct mailbox_list *list; +}; + struct mailbox_list_module_register mailbox_list_module_register = { 0 }; static ARRAY(const struct mailbox_list *) mailbox_list_drivers; +static MODULE_CONTEXT_DEFINE_INIT(mailbox_list_fs_module, + &fs_api_module_register); void mailbox_lists_init(void) { @@ -1831,6 +1841,8 @@ int mailbox_list_init_fs(struct mailbox_list *list, const char *driver, { struct fs_settings fs_set; struct ssl_iostream_settings ssl_set; + struct mailbox_list_fs_context *ctx; + struct fs *parent_fs; memset(&ssl_set, 0, sizeof(ssl_set)); memset(&fs_set, 0, sizeof(fs_set)); @@ -1838,5 +1850,27 @@ int mailbox_list_init_fs(struct mailbox_list *list, const char *driver, fs_set.root_path = root_dir; fs_set.temp_file_prefix = mailbox_list_get_global_temp_prefix(list); - return fs_init(driver, args, &fs_set, fs_r, error_r); + if (fs_init(driver, args, &fs_set, fs_r, error_r) < 0) + return -1; + + /* add mailbox_list context to the parent fs, which allows + mailbox_list_fs_get_list() to work */ + for (parent_fs = *fs_r; parent_fs->parent != NULL; + parent_fs = parent_fs->parent) ; + + ctx = p_new(list->pool, struct mailbox_list_fs_context, 1); + ctx->list = list; + MODULE_CONTEXT_SET(parent_fs, mailbox_list_fs_module, ctx); + return 0; +} + +struct mailbox_list *mailbox_list_fs_get_list(struct fs *fs) +{ + struct mailbox_list_fs_context *ctx; + + while (fs->parent != NULL) + fs = fs->parent; + + ctx = MAILBOX_LIST_FS_CONTEXT(fs); + return ctx->list; } diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index c3e2388e56..f0d9a356e3 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -9,6 +9,7 @@ # define MAILBOX_LIST_NAME_MAX_LENGTH 4096 #endif +struct fs; struct mail_namespace; struct mail_storage; struct mailbox_list; @@ -257,4 +258,12 @@ const char * ATTR_NOWARN_UNUSED_RESULT mailbox_list_get_last_error(struct mailbox_list *list, enum mail_error *error_r); +/* Create a fs based on the settings in the given mailbox_list. */ +int mailbox_list_init_fs(struct mailbox_list *list, const char *driver, + const char *args, const char *root_dir, + struct fs **fs_r, const char **error_r); +/* Return mailbox_list that was used to create the fs via + mailbox_list_init_fs(). */ +struct mailbox_list *mailbox_list_fs_get_list(struct fs *fs); + #endif