Make info pool available for more general use in mailbox list iteration.
unsigned int root_idx;
char sep;
- pool_t info_pool;
struct mailbox_info info;
/* current directory we're handling */
struct list_dir_context *dir;
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 =
}
hash_table_destroy(&_ctx->found_mailboxes);
- pool_unref(&ctx->info_pool);
pool_unref(&_ctx->pool);
return ret;
}
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
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);
/* 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;
!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)
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 */
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
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";
}
} 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;
}
int ret = ctx->failed ? -1 : 0;
pool_unref(&ctx->mailbox_pool);
- pool_unref(&ctx->info_pool);
pool_unref(&_ctx->pool);
return ret;
}
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;
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 {
} 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 */
pool_t mailbox_pool;
struct mailbox_info info;
- pool_t info_pool;
size_t parent_len;
string_t *path;
}
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);
{
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;
if (ctx == &mailbox_list_iter_failed)
return NULL;
+
+ p_clear(ctx->info_pool);
+
do {
T_BEGIN {
info = mailbox_list_iter_next_call(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);
}
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;