]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: list: mailbox-list-iter - Move info pool to struct mailbox_list_iterate_...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 13 May 2025 23:44:31 +0000 (01:44 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 26 Jan 2026 01:35:25 +0000 (02:35 +0100)
Make info pool available for more general use in mailbox list iteration.

src/lib-storage/list/mailbox-list-fs-iter.c
src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-index-sync.c
src/lib-storage/list/mailbox-list-index.h
src/lib-storage/list/mailbox-list-iter.c
src/lib-storage/mailbox-list-private.h

index 456f334ab39f75a86f340f0aade28b7bcd8b6a4a..7e5a8be2745dc914ab816b4f1575691fd2b2330f 100644 (file)
@@ -46,7 +46,6 @@ struct fs_list_iterate_context {
        unsigned int root_idx;
        char sep;
 
-       pool_t info_pool;
        struct mailbox_info info;
        /* current directory we're handling */
        struct list_dir_context *dir;
@@ -526,7 +525,6 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns,
        ctx->ctx.flags = flags;
        array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 
-       ctx->info_pool = pool_alloconly_create("fs list", 1024);
        ctx->sep = mail_namespace_get_sep(_list->ns);
        ctx->info.ns = _list->ns;
        ctx->ctx.iter_from_index_dir =
@@ -567,7 +565,6 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
        }
 
        hash_table_destroy(&_ctx->found_mailboxes);
-       pool_unref(&ctx->info_pool);
        pool_unref(&_ctx->pool);
        return ret;
 }
@@ -591,7 +588,7 @@ fs_list_get_inbox_vname(struct fs_list_iterate_context *ctx)
        if ((ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0)
                return "INBOX";
        else
-               return p_strconcat(ctx->info_pool, ns->prefix, "INBOX", NULL);
+               return p_strconcat(ctx->ctx.info_pool, ns->prefix, "INBOX", NULL);
 }
 
 static bool
@@ -646,7 +643,7 @@ fs_list_entry(struct fs_list_iterate_context *ctx,
        storage_name = dir_get_storage_name(dir, entry->fname);
 
        vname = mailbox_list_get_vname(ctx->ctx.list, storage_name);
-       ctx->info.vname = p_strdup(ctx->info_pool, vname);
+       ctx->info.vname = p_strdup(ctx->ctx.info_pool, vname);
        ctx->info.flags = entry->info_flags;
 
        match = imap_match(ctx->ctx.glob, ctx->info.vname);
@@ -769,7 +766,6 @@ fs_list_next(struct fs_list_iterate_context *ctx)
                /* NOTE: fs_list_entry() may change ctx->dir */
                entries = array_get(&ctx->dir->entries, &count);
                while (ctx->dir->entry_idx < count) {
-                       p_clear(ctx->info_pool);
                        ret = fs_list_entry(ctx, &entries[ctx->dir->entry_idx++]);
                        if (ret > 0)
                                return 1;
@@ -790,7 +786,7 @@ fs_list_next(struct fs_list_iterate_context *ctx)
            !ctx->listed_prefix_inbox) {
                ctx->info.flags = MAILBOX_CHILDREN | MAILBOX_NOSELECT;
                ctx->info.vname =
-                       p_strconcat(ctx->info_pool,
+                       p_strconcat(ctx->ctx.info_pool,
                                    ctx->ctx.list->ns->prefix, "INBOX", NULL);
                ctx->listed_prefix_inbox = TRUE;
                if (imap_match(ctx->ctx.glob, ctx->info.vname) == IMAP_MATCH_YES)
index c8b0efd0f5192b45d8f8516bad0f301cb7cc4fb3..88e085e696e3d76b0178a983491057297b83f396 100644 (file)
@@ -48,7 +48,6 @@ mailbox_list_index_iter_init(struct mailbox_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->info_pool = pool_alloconly_create("mailbox list index iter info", 128);
        ctx->ctx.index_iteration = TRUE;
 
        /* listing mailboxes from index */
@@ -79,8 +78,6 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx)
        struct mailbox_list_index_node *node = ctx->next_node;
        struct mailbox *box;
 
-       p_clear(ctx->info_pool);
-
        str_truncate(ctx->path, ctx->parent_len);
        /* the root directory may have an empty name. in that case we'll still
           want to insert the separator, so check for non-NULL parent rather
@@ -97,7 +94,7 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx)
                MAILBOX_CHILDREN : MAILBOX_NOCHILDREN;
        if (strcmp(ctx->info.vname, "INBOX") != 0) {
                /* non-INBOX */
-               ctx->info.vname = p_strdup(ctx->info_pool, ctx->info.vname);
+               ctx->info.vname = p_strdup(ctx->ctx.info_pool, ctx->info.vname);
        } else if (!ctx->prefix_inbox_list) {
                /* listing INBOX itself */
                ctx->info.vname = "INBOX";
@@ -108,7 +105,7 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx)
                }
        } else {
                /* listing INBOX/INBOX */
-               ctx->info.vname = p_strconcat(ctx->info_pool,
+               ctx->info.vname = p_strconcat(ctx->ctx.info_pool,
                        ctx->ctx.list->ns->prefix, "INBOX", NULL);
                ctx->info.flags |= MAILBOX_NONEXISTENT;
        }
@@ -229,7 +226,6 @@ int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
        int ret = ctx->failed ? -1 : 0;
 
        pool_unref(&ctx->mailbox_pool);
-       pool_unref(&ctx->info_pool);
        pool_unref(&_ctx->pool);
        return ret;
 }
index 580e39a08723c6a672ac681e834d2cc9ee16e118..31157e4f68429199c211fe6402659f6a6fe210e3 100644 (file)
@@ -299,6 +299,8 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx)
        enum mailbox_list_iter_flags iter_flags;
        const char *patterns[2];
        struct mailbox_list_index_node *node;
+       pool_t info_pool;
+       int ret;
        uint32_t seq;
        bool created;
 
@@ -317,6 +319,8 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx)
        iter = sync_ctx->ilist->module_ctx.super.
                iter_init(sync_ctx->list, patterns,
                          iter_flags);
+       info_pool = pool_alloconly_create("mailbox list iter info", 128);
+       iter->info_pool = info_pool;
 
        sync_ctx->syncing_list = TRUE;
        while ((info = sync_ctx->ilist->module_ctx.super.iter_next(iter)) != NULL) T_BEGIN {
@@ -345,7 +349,9 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx)
        } T_END;
        sync_ctx->syncing_list = FALSE;
 
-       if (sync_ctx->ilist->module_ctx.super.iter_deinit(iter) < 0)
+       ret = sync_ctx->ilist->module_ctx.super.iter_deinit(iter);
+       pool_unref(&info_pool);
+       if (ret < 0)
                return -1;
 
        /* successfully listed everything, expunge any unseen mailboxes */
index 798baf2a753925809d7461950c0446c4fe1ebdd5..deeb07cf95083774f6cbb0bf2eea8969f7c3d6ed 100644 (file)
@@ -143,7 +143,6 @@ struct mailbox_list_index_iterate_context {
        pool_t mailbox_pool;
 
        struct mailbox_info info;
-       pool_t info_pool;
 
        size_t parent_len;
        string_t *path;
index eb9e21cfc6b217bf300c6b30c748b587fa2f6d0a..b7a7e0be8bf22be0a9bef375c9179ccaccf7536b 100644 (file)
@@ -157,6 +157,7 @@ mailbox_list_iter_init_multiple(struct mailbox_list *list,
        }
 
        ctx = list->v.iter_init(list, patterns, flags);
+       ctx->info_pool = pool_alloconly_create("mailbox list iter info", 128);
        if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
                      MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0) {
                char sep = mail_namespace_get_sep(list->ns);
@@ -847,14 +848,16 @@ mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
 {
        struct ns_list_iterate_context *ctx;
        unsigned int i, count;
-       pool_t pool;
+       pool_t pool, info_pool;
 
        i_assert(namespaces != NULL);
 
        pool = pool_alloconly_create("mailbox list namespaces", 1024);
+       info_pool = pool_alloconly_create("mailbox list iter info", 128);
        ctx = p_new(pool, struct ns_list_iterate_context, 1);
        ctx->pool = pool;
        ctx->type_mask = type_mask;
+       ctx->ctx.info_pool = info_pool;
        ctx->ctx.flags = flags;
        ctx->ctx.list = p_new(pool, struct mailbox_list, 1);
        ctx->ctx.list->v.iter_next = mailbox_list_ns_iter_next;
@@ -1302,6 +1305,9 @@ mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
 
        if (ctx == &mailbox_list_iter_failed)
                return NULL;
+
+       p_clear(ctx->info_pool);
+
        do {
                T_BEGIN {
                        info = mailbox_list_iter_next_call(ctx);
@@ -1323,6 +1329,7 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
        i_free(ctx->specialuse_info_flags);
        mailbox_tree_iterate_deinit(&ctx->subscriptions_iter);
        mailbox_tree_deinit(&ctx->subscriptions);
+       pool_unref(&ctx->info_pool);
        return ctx->list->v.iter_deinit(ctx);
 }
 
index fe1e94be80ccfa7483e15873c5fb4d4be4248406..76149946cc6f3e709046690ca06e6f1a5d888e95 100644 (file)
@@ -163,6 +163,9 @@ struct mailbox_list_iterate_context {
        bool index_iteration;
        bool iter_from_index_dir;
 
+       struct mailbox_info info;
+       pool_t info_pool;
+
        struct imap_match_glob *glob;
        struct mailbox_list_autocreate_iterate_context *autocreate_ctx;
        struct mailbox_info specialuse_info;