dovecot-2.2: imap: Various fixes for handling expunges in mailbo...

dovecot at dovecot.org dovecot at dovecot.org
Tue Nov 6 22:15:58 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/5089affc8ae5
changeset: 15386:5089affc8ae5
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Nov 06 22:15:51 2012 +0200
description:
imap: Various fixes for handling expunges in mailbox sync.

diffstat:

 src/imap/imap-sync.c |  16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diffs (61 lines):

diff -r 47085487f3d8 -r 5089affc8ae5 src/imap/imap-sync.c
--- a/src/imap/imap-sync.c	Tue Nov 06 17:40:34 2012 +0200
+++ b/src/imap/imap-sync.c	Tue Nov 06 22:15:51 2012 +0200
@@ -296,7 +296,7 @@
 	client->highest_fetch_modseq = 0;
 }
 
-static int imap_sync_finish(struct imap_sync_context *ctx)
+static int imap_sync_finish(struct imap_sync_context *ctx, bool aborting)
 {
 	struct client *client = ctx->client;
 	int ret = ctx->failed ? -1 : 0;
@@ -327,7 +327,7 @@
 		client_disconnect_with_error(client,
 					     "Mailbox UIDVALIDITY changed");
 	}
-	if (!ctx->no_newmail) {
+	if (!ctx->no_newmail && !aborting) {
 		if (ctx->status.messages < ctx->messages_count)
 			i_panic("Message count decreased");
 		if (ctx->status.messages != ctx->messages_count &&
@@ -371,7 +371,7 @@
 {
 	int ret;
 
-	ret = imap_sync_finish(ctx);
+	ret = imap_sync_finish(ctx, TRUE);
 	imap_client_notify_finished(ctx->client);
 
 	if ((ctx->client->enabled_features & MAILBOX_FEATURE_QRESYNC) != 0)
@@ -506,14 +506,14 @@
 	for (; ctx->seq >= ctx->sync_rec.seq1; ctx->seq--) {
 		if (ret == 0) {
 			/* buffer full, continue later */
-			break;
+			return 0;
 		}
 
 		str_truncate(str, 0);
 		str_printfa(str, "* %u EXPUNGE", ctx->seq);
 		ret = client_send_line_next(ctx->client, str_c(str));
 	}
-	return ret;
+	return 1;
 }
 
 int imap_sync_more(struct imap_sync_context *ctx)
@@ -613,10 +613,10 @@
 
 		ctx->seq = 0;
 	}
-	if (array_is_created(&ctx->expunges))
-		imap_sync_vanished(ctx);
 	if (ret > 0) {
-		if (imap_sync_finish(ctx) < 0)
+		if (array_is_created(&ctx->expunges))
+			imap_sync_vanished(ctx);
+		if (imap_sync_finish(ctx, FALSE) < 0)
 			return -1;
 		return imap_sync_more(ctx);
 	}


More information about the dovecot-cvs mailing list