From 8ba2d883666677cf48f5525cfb99a1aa1b832537 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Mon, 4 May 2015 00:22:09 +0200
Subject: [PATCH] lib-sieve: util: program client: Fixed handling of connecting
 asynchronously.

---
 src/lib-sieve/util/program-client-remote.c | 2 +-
 src/lib-sieve/util/program-client.c        | 7 +++----
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/lib-sieve/util/program-client-remote.c b/src/lib-sieve/util/program-client-remote.c
index f548baf0a..3636f41a2 100644
--- a/src/lib-sieve/util/program-client-remote.c
+++ b/src/lib-sieve/util/program-client-remote.c
@@ -239,7 +239,7 @@ static int program_client_remote_connect(struct program_client *pclient)
 		!pclient->output_seekable ? -1 : fd );
 	pclient->fd_out = fd;
 	pclient->io = io_add(fd, IO_WRITE, program_client_remote_connected, pclient);
-	return 1;
+	return 0;
 }
 
 static int program_client_remote_close_output(struct program_client *pclient)
diff --git a/src/lib-sieve/util/program-client.c b/src/lib-sieve/util/program-client.c
index 87d083c5b..7fe0f93e5 100644
--- a/src/lib-sieve/util/program-client.c
+++ b/src/lib-sieve/util/program-client.c
@@ -490,13 +490,11 @@ int program_client_run(struct program_client *pclient)
 	pclient->exit_code = 0;
 	pclient->error = PROGRAM_CLIENT_ERROR_NONE;
 
-
 	pclient->ioloop = io_loop_create();
 
 	if ( program_client_connect(pclient) >= 0 ) {
 		/* run output */
-		ret = 1;		
-		if ( pclient->program_output != NULL &&
+		if ( ret > 0 && pclient->program_output != NULL &&
 			(ret=o_stream_flush(pclient->program_output)) == 0 ) {
 			o_stream_set_flush_callback
 				(pclient->program_output, program_client_program_output, pclient);
@@ -505,7 +503,8 @@ int program_client_run(struct program_client *pclient)
 		/* run i/o event loop */
 		if ( ret < 0 ) {
 			pclient->error = PROGRAM_CLIENT_ERROR_IO;
-		} else if ( ret == 0 || program_client_input_pending(pclient) ) {
+		} else if ( !pclient->disconnected &&
+			(ret == 0 || program_client_input_pending(pclient)) ) {
 			io_loop_run(pclient->ioloop);
 		}
 
-- 
GitLab