From: Timo Sirainen Date: Sun, 17 May 2009 22:45:23 +0000 (-0400) Subject: virtual: If we can't open a mailbox that was added using a wildcard, just skip it. X-Git-Tag: 2.0.alpha1~736 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7f3b826a89bcb7a72759912e99f574b28309fe1b;p=thirdparty%2Fdovecot%2Fcore.git virtual: If we can't open a mailbox that was added using a wildcard, just skip it. --HG-- branch : HEAD --- diff --git a/src/plugins/virtual/virtual-config.c b/src/plugins/virtual/virtual-config.c index ef6e812969..6169e1a2e4 100644 --- a/src/plugins/virtual/virtual-config.c +++ b/src/plugins/virtual/virtual-config.c @@ -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); } diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index 5469db4aa3..c08698e0bf 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -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; diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 09a13a551c..a725a601ad 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -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 *);