]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Ignore non-selectable mailboxes for most commands.
authorTimo Sirainen <tss@iki.fi>
Mon, 21 Jun 2010 14:46:21 +0000 (15:46 +0100)
committerTimo Sirainen <tss@iki.fi>
Mon, 21 Jun 2010 14:46:21 +0000 (15:46 +0100)
--HG--
branch : HEAD

src/doveadm/doveadm-mail-list-iter.c
src/doveadm/doveadm-mail-list-iter.h
src/doveadm/doveadm-mail-mailbox.c

index 76e6ccce365675f63ea4c0d06c428fbe9fdf5c0f..c3d07a9561d1e98f12edd70a9b6d12711ccc2a63 100644 (file)
@@ -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. */
index 1d3da5504c2a34d432e0d95ae40daf8ced6eee41..7358963d8a1ae8ea62f5355d02821dec73ac2e3e 100644 (file)
@@ -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 *
index aea9c5a68a671686e4907ad047b1234ca3651c69..cf3a6af3b70a972cfedb130d3820443b879a2d6a 100644 (file)
@@ -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)