dovecot-2.2: virtual plugin: Handle physical mailbox deletion wh...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Aug 12 16:26:12 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/0ff4dde5490a
changeset: 17710:0ff4dde5490a
user: Timo Sirainen <tss at iki.fi>
date: Tue Aug 12 19:24:10 2014 +0300
description:
virtual plugin: Handle physical mailbox deletion while virtual mailbox is open.
diffstat:
src/plugins/virtual/virtual-sync.c | 24 ++++++++++++++++++++++--
1 files changed, 22 insertions(+), 2 deletions(-)
diffs (41 lines):
diff -r 8948c0d91369 -r 0ff4dde5490a src/plugins/virtual/virtual-sync.c
--- a/src/plugins/virtual/virtual-sync.c Tue Aug 12 19:12:04 2014 +0300
+++ b/src/plugins/virtual/virtual-sync.c Tue Aug 12 19:24:10 2014 +0300
@@ -1061,6 +1061,21 @@
ctx->ext_header_changed = TRUE;
}
+static void virtual_sync_backend_box_deleted(struct virtual_sync_context *ctx,
+ struct virtual_backend_box *bbox)
+{
+ ARRAY_TYPE(seq_range) removed_uids;
+ const struct virtual_backend_uidmap *uidmap;
+
+ /* delay its full removal until the next time we open the virtual
+ mailbox. for now just treat it as if it was empty. */
+
+ t_array_init(&removed_uids, 128);
+ array_foreach(&bbox->uids, uidmap)
+ seq_range_array_add(&removed_uids, uidmap->real_uid);
+ virtual_sync_mailbox_box_remove(ctx, bbox, &removed_uids);
+}
+
static int virtual_sync_backend_box(struct virtual_sync_context *ctx,
struct virtual_backend_box *bbox)
{
@@ -1102,8 +1117,13 @@
&status);
if (!bbox_index_opened && bbox->box->opened)
virtual_backend_box_opened(ctx->mbox, bbox);
- if (ret < 0)
- return -1;
+ if (ret < 0) {
+ if (mailbox_get_last_mail_error(bbox->box) != MAIL_ERROR_NOTFOUND)
+ return -1;
+ /* mailbox was deleted */
+ virtual_sync_backend_box_deleted(ctx, bbox);
+ return 0;
+ }
if (status.uidvalidity == bbox->sync_uid_validity &&
status.uidnext == bbox->sync_next_uid &&
status.highest_modseq == bbox->sync_highest_modseq) {
More information about the dovecot-cvs
mailing list