]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: If we can't open a mailbox that was added using a wildcard, just skip it.
authorTimo Sirainen <tss@iki.fi>
Sun, 17 May 2009 22:45:23 +0000 (18:45 -0400)
committerTimo Sirainen <tss@iki.fi>
Sun, 17 May 2009 22:45:23 +0000 (18:45 -0400)
--HG--
branch : HEAD

src/plugins/virtual/virtual-config.c
src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-storage.h

index ef6e8129698faab51d9bf0ecc64109c107c04dd2..6169e1a2e445dffc6d7f8eb582abbb5a8abecec5 100644 (file)
@@ -213,6 +213,7 @@ static void virtual_config_copy_expanded(struct virtual_parse_context *ctx,
        *bbox = *wbox;
        bbox->name = p_strdup(ctx->pool, name);
        bbox->glob = NULL;
+       bbox->wildcard = TRUE;
        mail_search_args_ref(bbox->search_args);
        array_append(&ctx->mbox->backend_boxes, &bbox, 1);
 }
index 5469db4aa35452d08034ab6ab668e8ffd6ad2285..c08698e0bf6a67d2e2b54d3a028707bf968d1835 100644 (file)
@@ -210,7 +210,7 @@ static int virtual_mailboxes_open(struct virtual_mailbox *mbox,
        open_flags |= MAILBOX_OPEN_KEEP_RECENT;
 
        bboxes = array_get(&mbox->backend_boxes, &count);
-       for (i = 0; i < count; i++) {
+       for (i = 0; i < count; ) {
                mailbox = bboxes[i]->name;
                ns = mail_namespace_find(user->namespaces, &mailbox);
                storage = ns->storage;
@@ -218,10 +218,19 @@ static int virtual_mailboxes_open(struct virtual_mailbox *mbox,
                                              NULL, open_flags);
 
                if (bboxes[i]->box == NULL) {
+                       str = mail_storage_get_last_error(storage, &error);
+                       if (bboxes[i]->wildcard &&
+                           (error == MAIL_ERROR_PERM ||
+                            error == MAIL_ERROR_NOTFOUND)) {
+                               /* this mailbox wasn't explicitly specified.
+                                  just skip it. */
+                               mail_search_args_unref(&bboxes[i]->search_args);
+                               array_delete(&mbox->backend_boxes, i, 1);
+                               bboxes = array_get(&mbox->backend_boxes, &count);
+                               continue;
+                       }
                        if (storage != mbox->ibox.box.storage) {
                                /* copy the error */
-                               str = mail_storage_get_last_error(storage,
-                                                                 &error);
                                mail_storage_set_error(mbox->ibox.box.storage,
                                                       error, str);
                        }
@@ -231,6 +240,7 @@ static int virtual_mailboxes_open(struct virtual_mailbox *mbox,
                i_array_init(&bboxes[i]->sync_pending_removes, 64);
                mail_search_args_init(bboxes[i]->search_args, bboxes[i]->box,
                                      FALSE, NULL);
+               i++;
        }
        if (i == count)
                return 0;
index 09a13a551c175ffe2b1b354721c4369f906dab1d..a725a601ad90a6bb541ad61af9ca2d6e2aa37e58 100644 (file)
@@ -90,6 +90,7 @@ struct virtual_backend_box {
        struct mail_namespace *ns;
 
        unsigned int sync_seen:1;
+       unsigned int wildcard:1;
 };
 ARRAY_DEFINE_TYPE(virtual_backend_box, struct virtual_backend_box *);