changeset 7434:4407b7265afd HEAD

Try to send tagged replies in the same order as the commands were received (fixes Apple Mail bug).
author Timo Sirainen <tss@iki.fi>
date Thu, 20 Mar 2008 16:55:44 +0200
parents 0ee365c21c16
children 6983dfc231d7
files src/imap/imap-sync.c
diffstat 1 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/imap-sync.c	Thu Mar 20 16:54:19 2008 +0200
+++ b/src/imap/imap-sync.c	Thu Mar 20 16:55:44 2008 +0200
@@ -210,7 +210,7 @@
 
 static bool cmd_sync_continue(struct client_command_context *sync_cmd)
 {
-	struct client_command_context *cmd, *next;
+	struct client_command_context *cmd, *prev;
 	struct client *client = sync_cmd->client;
 	struct imap_sync_context *ctx = sync_cmd->context;
 	int ret;
@@ -229,9 +229,13 @@
 	}
 	sync_cmd->context = NULL;
 
-	/* finish all commands that waited for this sync */
-	for (cmd = client->command_queue; cmd != NULL; cmd = next) {
-		next = cmd->next;
+	/* Finish all commands that waited for this sync. Go through the queue
+	   backwards, so that tagged replies are sent in the same order as
+	   they were received. This fixes problems with clients that rely on
+	   this (Apple Mail 3.2) */
+	for (cmd = client->command_queue; cmd->next != NULL; cmd = cmd->next) ;
+	for (; cmd != NULL; cmd = prev) {
+		prev = cmd->prev;
 
 		if (cmd->state == CLIENT_COMMAND_STATE_WAIT_SYNC &&
 		    cmd != sync_cmd &&
@@ -365,11 +369,15 @@
 
 static bool cmd_sync_drop_fast(struct client *client)
 {
-	struct client_command_context *cmd, *next;
+	struct client_command_context *cmd, *prev;
 	bool ret = FALSE;
 
-	for (cmd = client->command_queue; cmd != NULL; cmd = next) {
-		next = cmd->next;
+	if (client->command_queue == NULL)
+		return FALSE;
+
+	for (cmd = client->command_queue; cmd->next != NULL; cmd = cmd->next) ;
+	for (; cmd != NULL; cmd = prev) {
+		prev = cmd->next;
 
 		if (cmd->state == CLIENT_COMMAND_STATE_WAIT_SYNC &&
 		    (cmd->sync->flags & MAILBOX_SYNC_FLAG_FAST) != 0) {