]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added pool to struct mailbox_list_iterate_context.
authorTimo Sirainen <tss@iki.fi>
Fri, 2 Dec 2011 12:49:08 +0000 (14:49 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 2 Dec 2011 12:49:08 +0000 (14:49 +0200)
src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/shared/shared-list.c
src/lib-storage/list/mailbox-list-fs-iter.c
src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-maildir-iter.c
src/lib-storage/list/mailbox-list-none.c
src/lib-storage/list/mailbox-list-subscriptions.c
src/lib-storage/mailbox-list-private.h
src/plugins/acl/acl-mailbox-list.c

index 70514879a243d7b462d429aed2bb51f1aee6d13b..6d14808b2921accd79c238e7928b80ca30e325a2 100644 (file)
@@ -360,6 +360,7 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
        struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
        struct mailbox_list_iterate_context *_ctx;
        struct imapc_mailbox_list_iterate_context *ctx;
+       pool_t pool;
        const char *ns_root_name;
        char sep;
        int ret = 0;
@@ -382,12 +383,13 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
 
        sep = mailbox_list_get_hierarchy_sep(_list);
 
-       ctx = i_new(struct imapc_mailbox_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list imapc iter", 1024);
+       ctx = p_new(pool, struct imapc_mailbox_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = _list;
        ctx->ctx.flags = flags;
-       ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns,
-                                                FALSE, sep);
-       array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5);
+       ctx->ctx.glob = imap_match_init_multiple(pool, patterns, FALSE, sep);
+       array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 
        ctx->info.ns = _list->ns;
 
@@ -451,9 +453,7 @@ static int imapc_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 
        mailbox_tree_iterate_deinit(&ctx->iter);
        mailbox_tree_deinit(&ctx->tree);
-       imap_match_deinit(&_ctx->glob);
-       array_free(&_ctx->module_contexts);
-       i_free(ctx);
+       pool_unref(&_ctx->pool);
        return ret;
 }
 
index d973cfa775578a00f75416f5b465a624411bb1b5..72704c09e0653ad49fead8fb2c7fc594df4f0e39 100644 (file)
@@ -177,14 +177,16 @@ shared_list_iter_init(struct mailbox_list *list, const char *const *patterns,
                      enum mailbox_list_iter_flags flags)
 {
        struct mailbox_list_iterate_context *ctx;
+       pool_t pool;
        char sep = mail_namespace_get_sep(list->ns);
 
-       ctx = i_new(struct mailbox_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list shared iter", 1024);
+       ctx = p_new(pool, struct mailbox_list_iterate_context, 1);
+       ctx->pool = pool;
        ctx->list = list;
        ctx->flags = flags;
-       ctx->glob = imap_match_init_multiple(default_pool, patterns,
-                                            FALSE, sep);
-       array_create(&ctx->module_contexts, default_pool, sizeof(void *), 5);
+       ctx->glob = imap_match_init_multiple(pool, patterns, FALSE, sep);
+       array_create(&ctx->module_contexts, pool, sizeof(void *), 5);
 
        if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0 &&
            (list->ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) T_BEGIN {
@@ -201,9 +203,7 @@ shared_list_iter_next(struct mailbox_list_iterate_context *ctx ATTR_UNUSED)
 
 static int shared_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
 {
-       imap_match_deinit(&ctx->glob);
-       array_free(&ctx->module_contexts);
-       i_free(ctx);
+       pool_unref(&ctx->pool);
        return 0;
 }
 
index 9c8f2b341dc7ed186a798e5afcc4c9d281078c59..06552efca409c422710c3e25faf050fcdd8000a1 100644 (file)
@@ -36,7 +36,7 @@ struct list_dir_context {
 struct fs_list_iterate_context {
        struct mailbox_list_iterate_context ctx;
 
-       ARRAY_DEFINE(valid_patterns, char *);
+       ARRAY_DEFINE(valid_patterns, const char *);
        char sep;
 
        enum mailbox_info_flags inbox_flags;
@@ -128,7 +128,7 @@ pattern_has_wildcard_at(struct fs_list_iterate_context *ctx,
 static int list_opendir(struct fs_list_iterate_context *ctx,
                        const char *path, const char *list_path, DIR **dirp)
 {
-       char *const *patterns;
+       const char *const *patterns;
        unsigned int i;
 
        /* if no patterns have wildcards at this point of the path, we don't
@@ -209,7 +209,8 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
 {
        struct fs_list_iterate_context *ctx;
        const char *path, *vpath, *rootdir, *test_pattern, *real_pattern;
-       char *pattern;
+       pool_t pool;
+       const char *pattern;
        DIR *dirp;
        unsigned int prefix_len;
        int ret;
@@ -221,10 +222,12 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
                                                            flags);
        }
 
-       ctx = i_new(struct fs_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list fs iter", 1024);
+       ctx = p_new(pool, struct fs_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = _list;
        ctx->ctx.flags = flags;
-       array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5);
+       array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 
        ctx->info_pool = pool_alloconly_create("fs list", 1024);
        ctx->next = fs_list_next;
@@ -232,7 +235,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
        ctx->info.ns = _list->ns;
 
        prefix_len = strlen(_list->ns->prefix);
-       i_array_init(&ctx->valid_patterns, 8);
+       p_array_init(&ctx->valid_patterns, pool, 8);
        for (; *patterns != NULL; patterns++) {
                /* check that we're not trying to do any "../../" lists */
                test_pattern = *patterns;
@@ -251,7 +254,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
                                ctx->inbox_match = TRUE;
                                continue;
                        }
-                       pattern = i_strdup(*patterns);
+                       pattern = p_strdup(pool, *patterns);
                        array_append(&ctx->valid_patterns, &pattern, 1);
                }
        }
@@ -262,7 +265,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
                return &ctx->ctx;
        }
        patterns = (const void *)array_idx(&ctx->valid_patterns, 0);
-       ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, TRUE,
+       ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE,
                                                 ctx->sep);
 
        vpath = _list->ns->prefix;
@@ -300,18 +303,11 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 {
        struct fs_list_iterate_context *ctx =
                (struct fs_list_iterate_context *)_ctx;
-       char **patterns;
-       unsigned int i, count;
        int ret = _ctx->failed ? -1 : 0;
 
        if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
                return mailbox_list_subscriptions_iter_deinit(_ctx);
 
-       patterns = array_get_modifiable(&ctx->valid_patterns, &count);
-       for (i = 0; i < count; i++)
-               i_free(patterns[i]);
-       array_free(&ctx->valid_patterns);
-
        while (ctx->dir != NULL) {
                struct list_dir_context *dir = ctx->dir;
 
@@ -321,11 +317,7 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 
        if (ctx->info_pool != NULL)
                pool_unref(&ctx->info_pool);
-       if (_ctx->glob != NULL)
-               imap_match_deinit(&_ctx->glob);
-       array_free(&_ctx->module_contexts);
-       i_free(ctx);
-
+       pool_unref(&_ctx->pool);
        return ret;
 }
 
@@ -639,7 +631,7 @@ fs_list_dir_next(struct fs_list_iterate_context *ctx)
 {
        struct list_dir_context *dir = ctx->dir;
        struct dirent *d;
-       char *const *patterns;
+       const char *const *patterns;
        const char *fname, *path, *p;
        unsigned int pos;
        struct stat st;
index 8a13dd57ab76775a3250df85f3e250a2a0463373..678c5e89f8f896193354cf694bc2f479c4130fec 100644 (file)
@@ -14,14 +14,16 @@ mailbox_list_index_iter_init(struct mailbox_list *list,
 {
        struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
        struct mailbox_list_index_iterate_context *ctx;
+       pool_t pool;
        char ns_sep = mail_namespace_get_sep(list->ns);
 
-       ctx = i_new(struct mailbox_list_index_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list index iter", 1024);
+       ctx = p_new(pool, struct mailbox_list_index_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = list;
        ctx->ctx.flags = flags;
-       ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns,
-                                                TRUE, ns_sep);
-       array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5);
+       ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep);
+       array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
        ctx->sep = ns_sep;
 
        if (mailbox_list_index_refresh(ctx->ctx.list) < 0) {
@@ -31,7 +33,7 @@ mailbox_list_index_iter_init(struct mailbox_list *list,
        } else {
                /* listing mailboxes from index */
                ctx->info.ns = list->ns;
-               ctx->path = str_new(default_pool, 128);
+               ctx->path = str_new(pool, 128);
                ctx->next_node = ilist->mailbox_tree;
                ilist->iter_refcount++;
        }
@@ -162,11 +164,8 @@ int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
        else {
                i_assert(ilist->iter_refcount > 0);
                ilist->iter_refcount--;
-               str_free(&ctx->path);
        }
 
-       imap_match_deinit(&ctx->ctx.glob);
-       array_free(&ctx->ctx.module_contexts);
-       i_free(ctx);
+       pool_unref(&_ctx->pool);
        return ret;
 }
index 51009ec52c9f233596e18ca78abae054d7e254ce..229ddc4bbdf9dccbfeef448487281a3335b50105 100644 (file)
@@ -19,7 +19,6 @@
 
 struct maildir_list_iterate_context {
        struct mailbox_list_iterate_context ctx;
-       pool_t pool;
 
        const char *dir;
        char prefix_char;
@@ -419,14 +418,14 @@ maildir_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
        char ns_sep = mail_namespace_get_sep(_list->ns);
        int ret;
 
-       pool = pool_alloconly_create("maildir_list", 1024);
+       pool = pool_alloconly_create("mailbox list maildir iter", 1024);
        ctx = p_new(pool, struct maildir_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = _list;
        ctx->ctx.flags = flags;
        ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep);
        array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 
-       ctx->pool = pool;
        ctx->tree_ctx = mailbox_tree_init(ns_sep);
        ctx->info.ns = _list->ns;
        ctx->prefix_char = strcmp(_list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0 ?
@@ -470,7 +469,7 @@ int maildir_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
        if (ctx->tree_iter != NULL)
                mailbox_tree_iterate_deinit(&ctx->tree_iter);
        mailbox_tree_deinit(&ctx->tree_ctx);
-       pool_unref(&ctx->pool);
+       pool_unref(&ctx->ctx.pool);
        return ret;
 }
 
index b1adeb4fffdb3f1e8f9858dd3d64701d7a971a1e..bfe35737444f2fde7115e38f7d6ecd72dadba8f3 100644 (file)
@@ -133,13 +133,16 @@ none_list_iter_init(struct mailbox_list *list,
                    enum mailbox_list_iter_flags flags)
 {
        struct noop_list_iterate_context *ctx;
+       pool_t pool;
 
-       ctx = i_new(struct noop_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list none iter", 1024);
+       ctx = p_new(pool, struct noop_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = list;
        ctx->ctx.flags = flags;
-       ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, TRUE,
+       ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE,
                                                 mail_namespace_get_sep(list->ns));
-       array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5);
+       array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
        if ((list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 &&
            imap_match(ctx->ctx.glob, "INBOX") == IMAP_MATCH_YES) {
                ctx->list_inbox = TRUE;
@@ -152,9 +155,7 @@ none_list_iter_init(struct mailbox_list *list,
 static int
 none_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
 {
-       array_free(&ctx->module_contexts);
-       imap_match_deinit(&ctx->glob);
-       i_free(ctx);
+       pool_unref(&ctx->pool);
        return 0;
 }
 
index 08733d6a016ee8ad3fbbc308840af41530762052..d0a3a1eeedaf7845003bd0393382ed6a08d13cfe 100644 (file)
@@ -211,14 +211,16 @@ mailbox_list_subscriptions_iter_init(struct mailbox_list *list,
                                     enum mailbox_list_iter_flags flags)
 {
        struct subscriptions_mailbox_list_iterate_context *ctx;
+       pool_t pool;
        char sep = mail_namespace_get_sep(list->ns);
 
-       ctx = i_new(struct subscriptions_mailbox_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list subscriptions iter", 1024);
+       ctx = p_new(pool, struct subscriptions_mailbox_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = list;
        ctx->ctx.flags = flags;
-       ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns,
-                                                TRUE, sep);
-       array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5);
+       ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, sep);
+       array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 
        ctx->tree = mailbox_tree_init(sep);
        mailbox_list_subscriptions_fill(&ctx->ctx, ctx->tree);
@@ -292,9 +294,6 @@ int mailbox_list_subscriptions_iter_deinit(struct mailbox_list_iterate_context *
 
        mailbox_tree_iterate_deinit(&ctx->iter);
        mailbox_tree_deinit(&ctx->tree);
-       if (_ctx->glob != NULL)
-               imap_match_deinit(&_ctx->glob);
-       array_free(&_ctx->module_contexts);
-       i_free(ctx);
+       pool_unref(&_ctx->pool);
        return ret;
 }
index 78ca61f71296a5baa50cd1408e83d752c9cb13a0..2a8853dd536119f6d28be72c41ea1a593a8b34a9 100644 (file)
@@ -141,6 +141,7 @@ union mailbox_list_iterate_module_context {
 
 struct mailbox_list_iterate_context {
        struct mailbox_list *list;
+       pool_t pool;
        enum mailbox_list_iter_flags flags;
        bool failed;
 
index f920b1ba0638abfd87cdf74e4e8ec345aaac2dbd..76d72d45f07bcf3d1580db109864910c506cb0c8 100644 (file)
@@ -162,17 +162,20 @@ acl_mailbox_list_iter_init(struct mailbox_list *list,
 {
        struct acl_mailbox_list *alist = ACL_LIST_CONTEXT(list);
        struct acl_mailbox_list_iterate_context *ctx;
+       pool_t pool;
        const char *p;
        unsigned int i;
        bool inboxcase;
 
-       ctx = i_new(struct acl_mailbox_list_iterate_context, 1);
+       pool = pool_alloconly_create("mailbox list acl iter", 1024);
+       ctx = p_new(pool, struct acl_mailbox_list_iterate_context, 1);
+       ctx->ctx.pool = pool;
        ctx->ctx.list = list;
        ctx->ctx.flags = flags;
 
        inboxcase = (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0;
        ctx->sep = mail_namespace_get_sep(list->ns);
-       ctx->glob = imap_match_init_multiple(default_pool, patterns,
+       ctx->glob = imap_match_init_multiple(pool, patterns,
                                             inboxcase, ctx->sep);
        /* see if all patterns have only a single '*' and it's at the end.
           we can use it to do some optimizations. */
@@ -410,9 +413,7 @@ acl_mailbox_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
                ret = -1;
        if (ctx->lookup_boxes != NULL)
                mailbox_tree_deinit(&ctx->lookup_boxes);
-       if (ctx->glob != NULL)
-               imap_match_deinit(&ctx->glob);
-       i_free(ctx);
+       pool_unref(&_ctx->pool);
        return ret;
 }