dovecot-2.0: IMAP: Make sure pending syncs are done before a mai...

dovecot at dovecot.org dovecot at dovecot.org
Mon May 25 01:09:57 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/2b95ca15f514
changeset: 9357:2b95ca15f514
user:      Timo Sirainen <tss at iki.fi>
date:      Sun May 24 18:08:58 2009 -0400
description:
IMAP: Make sure pending syncs are done before a mailbox-changing command is run.

diffstat:

1 file changed, 7 insertions(+), 3 deletions(-)
src/imap/imap-client.c |   10 +++++++---

diffs (46 lines):

diff -r e448f770039f -r 2b95ca15f514 src/imap/imap-client.c
--- a/src/imap/imap-client.c	Sat May 23 15:02:30 2009 -0400
+++ b/src/imap/imap-client.c	Sun May 24 18:08:58 2009 -0400
@@ -394,13 +394,14 @@ bool client_read_string_args(struct clie
 
 static struct client_command_context *
 client_command_find_with_flags(struct client_command_context *new_cmd,
-			       enum command_flags flags)
+			       enum command_flags flags,
+			       enum client_command_state max_state)
 {
 	struct client_command_context *cmd;
 
 	cmd = new_cmd->client->command_queue;
 	for (; cmd != NULL; cmd = cmd->next) {
-		if (cmd->state < CLIENT_COMMAND_STATE_WAIT_SYNC &&
+		if (cmd->state <= max_state &&
 		    cmd != new_cmd && (cmd->cmd_flags & flags) != 0)
 			return cmd;
 	}
@@ -410,6 +411,8 @@ static bool client_command_check_ambigui
 static bool client_command_check_ambiguity(struct client_command_context *cmd)
 {
 	enum command_flags flags;
+	enum client_command_state max_state =
+		CLIENT_COMMAND_STATE_WAIT_UNAMBIGUITY;
 	bool broken_client = FALSE;
 
 	if ((cmd->cmd_flags & COMMAND_FLAG_BREAKS_MAILBOX) ==
@@ -417,6 +420,7 @@ static bool client_command_check_ambigui
 		/* there must be no other command running that uses the
 		   selected mailbox */
 		flags = COMMAND_FLAG_USES_MAILBOX;
+		max_state = CLIENT_COMMAND_STATE_DONE;
 	} else if ((cmd->cmd_flags & COMMAND_FLAG_USES_SEQS) != 0) {
 		/* no existing command must be breaking sequences */
 		flags = COMMAND_FLAG_BREAKS_SEQS;
@@ -428,7 +432,7 @@ static bool client_command_check_ambigui
 		return FALSE;
 	}
 
-	if (client_command_find_with_flags(cmd, flags) == NULL) {
+	if (client_command_find_with_flags(cmd, flags, max_state) == NULL) {
 		if (cmd->client->syncing) {
 			/* don't do anything until syncing is finished */
 			return TRUE;


More information about the dovecot-cvs mailing list