[dovecot-cvs] dovecot/src/imap cmd-idle.c,1.19,1.20
    cras at dovecot.org 
    cras at dovecot.org
       
    Tue Dec  6 16:32:52 EET 2005
    
    
  
Update of /var/lib/cvs/dovecot/src/imap
In directory talvi:/tmp/cvs-serv29473
Modified Files:
	cmd-idle.c 
Log Message:
If DONE was sent while output was still being sent to clients, we didn't
deinitialize syncing properly. That output mustn't get lost anyway, so
now DONE isn't accepted until all output is sent.
Index: cmd-idle.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/imap/cmd-idle.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- cmd-idle.c	7 Aug 2005 11:41:20 -0000	1.19
+++ cmd-idle.c	6 Dec 2005 14:32:50 -0000	1.20
@@ -34,6 +34,11 @@
 		ctx->to = NULL;
 	}
 
+	if (ctx->sync_ctx != NULL) {
+		/* we're here only in connection failure cases */
+		(void)imap_sync_deinit(ctx->sync_ctx);
+	}
+
 	o_stream_cork(client->output);
 
 	if (ctx->dummy_seq != 0) {
@@ -78,6 +83,14 @@
 		return;
 	}
 
+	if (ctx->sync_ctx != NULL) {
+		/* we're still sending output to client. wait until it's all
+		   sent so we don't lose any changes. */
+		io_remove(client->io);
+		client->io = NULL;
+		return;
+	}
+
 	while ((line = i_stream_next_line(client->input)) != NULL) {
 		if (client->input_skip_line)
 			client->input_skip_line = FALSE;
@@ -163,8 +176,14 @@
 		   client */
                 idle_callback(client->mailbox, client);
 	}
-
         client->output_pending = FALSE;
+
+	if (client->io == NULL) {
+		/* input is pending */
+		client->io = io_add(i_stream_get_fd(client->input),
+				    IO_READ, idle_client_input, ctx);
+		idle_client_input(ctx);
+	}
 	return FALSE;
 }
 
    
    
More information about the dovecot-cvs
mailing list