From: Timo Sirainen Date: Mon, 21 Jun 2010 14:46:21 +0000 (+0100) Subject: doveadm: Ignore non-selectable mailboxes for most commands. X-Git-Tag: 2.0.rc1~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=323a9de5b41c4f9e4a26f22b92205678114ae14e;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Ignore non-selectable mailboxes for most commands. --HG-- branch : HEAD --- diff --git a/src/doveadm/doveadm-mail-list-iter.c b/src/doveadm/doveadm-mail-list-iter.c index 76e6ccce36..c3d07a9561 100644 --- a/src/doveadm/doveadm-mail-list-iter.c +++ b/src/doveadm/doveadm-mail-list-iter.c @@ -13,6 +13,7 @@ struct doveadm_mail_list_iter { enum mailbox_list_iter_flags iter_flags; struct mailbox_list_iterate_context *iter; + bool only_selectable; }; static int @@ -72,6 +73,7 @@ doveadm_mail_list_iter_init(struct mail_user *user, } (void)array_append_space(&patterns); + iter->only_selectable = TRUE; iter->iter_flags = iter_flags; iter->iter = mailbox_list_iter_init_namespaces(user->namespaces, array_idx(&patterns, 0), @@ -80,6 +82,18 @@ doveadm_mail_list_iter_init(struct mail_user *user, return iter; } +struct doveadm_mail_list_iter * +doveadm_mail_list_iter_full_init(struct mail_user *user, + struct mail_search_args *search_args, + enum mailbox_list_iter_flags iter_flags) +{ + struct doveadm_mail_list_iter *iter; + + iter = doveadm_mail_list_iter_init(user, search_args, iter_flags); + iter->only_selectable = FALSE; + return iter; +} + void doveadm_mail_list_iter_deinit(struct doveadm_mail_list_iter **_iter) { struct doveadm_mail_list_iter *iter = *_iter; @@ -98,6 +112,11 @@ doveadm_mail_list_iter_next(struct doveadm_mail_list_iter *iter) unsigned int len; while ((info = mailbox_list_iter_next(iter->iter)) != NULL) { + if ((info->flags & (MAILBOX_NOSELECT | + MAILBOX_NONEXISTENT)) != 0) { + if (iter->only_selectable) + continue; + } len = strlen(info->name); if (len > 0 && info->name[len-1] == info->ns->sep) { /* when listing "foo/%" it lists "foo/". skip it. */ diff --git a/src/doveadm/doveadm-mail-list-iter.h b/src/doveadm/doveadm-mail-list-iter.h index 1d3da5504c..7358963d8a 100644 --- a/src/doveadm/doveadm-mail-list-iter.h +++ b/src/doveadm/doveadm-mail-list-iter.h @@ -1,10 +1,16 @@ #ifndef DOVEADM_MAIL_LIST_ITER_H #define DOVEADM_MAIL_LIST_ITER_H +/* List only selectable mailboxes */ struct doveadm_mail_list_iter * doveadm_mail_list_iter_init(struct mail_user *user, struct mail_search_args *search_args, enum mailbox_list_iter_flags iter_flags); +/* List all mailboxes */ +struct doveadm_mail_list_iter * +doveadm_mail_list_iter_full_init(struct mail_user *user, + struct mail_search_args *search_args, + enum mailbox_list_iter_flags iter_flags); void doveadm_mail_list_iter_deinit(struct doveadm_mail_list_iter **iter); const struct mailbox_info * diff --git a/src/doveadm/doveadm-mail-mailbox.c b/src/doveadm/doveadm-mail-mailbox.c index aea9c5a68a..cf3a6af3b7 100644 --- a/src/doveadm/doveadm-mail-mailbox.c +++ b/src/doveadm/doveadm-mail-mailbox.c @@ -120,7 +120,8 @@ cmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx, if (ctx->ctx.subscriptions) iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED; - iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags); + iter = doveadm_mail_list_iter_full_init(user, ctx->search_args, + iter_flags); while ((info = doveadm_mail_list_iter_next(iter)) != NULL) { str_truncate(str, 0); if (ctx->mutf7 || imap_utf7_to_utf8(info->name, str) < 0)