dovecot-2.2: doveadm: Pass through the exit code from doveadm-se...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jun 13 04:35:25 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/63092465c522
changeset: 16505:63092465c522
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jun 13 04:35:06 2013 +0300
description:
doveadm: Pass through the exit code from doveadm-server to client.

diffstat:

 src/doveadm/client-connection.c   |   3 ++-
 src/doveadm/doveadm-mail-server.c |  17 +++++++++--------
 src/doveadm/dsync/doveadm-dsync.c |  23 +++++++++++------------
 src/doveadm/server-connection.c   |  28 +++++++++++++++-------------
 src/doveadm/server-connection.h   |   9 ++-------
 5 files changed, 39 insertions(+), 41 deletions(-)

diffs (192 lines):

diff -r d8fc9bba98ab -r 63092465c522 src/doveadm/client-connection.c
--- a/src/doveadm/client-connection.c	Thu Jun 13 04:33:41 2013 +0300
+++ b/src/doveadm/client-connection.c	Thu Jun 13 04:35:06 2013 +0300
@@ -127,7 +127,8 @@
 		o_stream_nsend_str(conn->output, "\n-NOUSER\n");
 	} else if (ctx->exit_code != 0) {
 		/* maybe not an error, but not a full success either */
-		o_stream_nsend(conn->output, "\n-\n", 3);
+		o_stream_nsend_str(conn->output,
+				   t_strdup_printf("\n-%u\n", ctx->exit_code));
 	} else {
 		o_stream_nsend(conn->output, "\n+\n", 3);
 	}
diff -r d8fc9bba98ab -r 63092465c522 src/doveadm/doveadm-mail-server.c
--- a/src/doveadm/doveadm-mail-server.c	Thu Jun 13 04:33:41 2013 +0300
+++ b/src/doveadm/doveadm-mail-server.c	Thu Jun 13 04:35:06 2013 +0300
@@ -81,7 +81,7 @@
 	return FALSE;
 }
 
-static void doveadm_cmd_callback(enum server_cmd_reply reply, void *context)
+static void doveadm_cmd_callback(int exit_code, void *context)
 {
 	struct doveadm_mail_server_cmd *servercmd = context;
 	struct doveadm_server *server =
@@ -91,21 +91,22 @@
 	i_free(servercmd->username);
 	i_free(servercmd);
 
-	switch (reply) {
-	case SERVER_CMD_REPLY_INTERNAL_FAILURE:
+	switch (exit_code) {
+	case 0:
+		break;
+	case SERVER_EXIT_CODE_DISCONNECTED:
 		i_error("%s: Internal failure for %s", server->name, username);
 		internal_failure = TRUE;
 		master_service_stop(master_service);
 		return;
-	case SERVER_CMD_REPLY_UNKNOWN_USER:
+	case EX_NOUSER:
 		i_error("%s: No such user: %s", server->name, username);
 		if (cmd_ctx->exit_code == 0)
 			cmd_ctx->exit_code = EX_NOUSER;
 		break;
-	case SERVER_CMD_REPLY_FAIL:
-		doveadm_mail_failed_error(cmd_ctx, MAIL_ERROR_TEMP);
-		break;
-	case SERVER_CMD_REPLY_OK:
+	default:
+		if (cmd_ctx->exit_code == 0 || exit_code == EX_TEMPFAIL)
+			cmd_ctx->exit_code = exit_code;
 		break;
 	}
 
diff -r d8fc9bba98ab -r 63092465c522 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Thu Jun 13 04:33:41 2013 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Thu Jun 13 04:35:06 2013 +0300
@@ -615,27 +615,26 @@
 	return ret;
 }
 
-static void dsync_connected_callback(enum server_cmd_reply reply, void *context)
+static void dsync_connected_callback(int exit_code, void *context)
 {
 	struct dsync_cmd_context *ctx = context;
 
-	switch (reply) {
-	case SERVER_CMD_REPLY_UNKNOWN_USER:
-		ctx->error = "Unknown user in remote";
-		ctx->ctx.exit_code = EX_NOUSER;
-		break;
-	case SERVER_CMD_REPLY_FAIL:
-		ctx->error = "Failed to start dsync-server command";
-		break;
-	case SERVER_CMD_REPLY_OK:
+	ctx->ctx.exit_code = exit_code;
+	switch (exit_code) {
+	case 0:
 		server_connection_extract(ctx->tcp_conn, &ctx->input,
 					  &ctx->output, &ctx->ssl_iostream);
 		break;
-	case SERVER_CMD_REPLY_INTERNAL_FAILURE:
+	case SERVER_EXIT_CODE_DISCONNECTED:
 		ctx->error = "Disconnected from remote";
 		break;
+	case EX_NOUSER:
+		ctx->error = "Unknown user in remote";
+		break;
 	default:
-		i_unreached();
+		ctx->error = p_strdup_printf(ctx->ctx.pool,
+			"Failed to start dsync-server command: %u", exit_code);
+		break;
 	}
 	io_loop_stop(current_ioloop);
 }
diff -r d8fc9bba98ab -r 63092465c522 src/doveadm/server-connection.c
--- a/src/doveadm/server-connection.c	Thu Jun 13 04:33:41 2013 +0300
+++ b/src/doveadm/server-connection.c	Thu Jun 13 04:35:06 2013 +0300
@@ -19,6 +19,7 @@
 #include "doveadm-settings.h"
 #include "server-connection.h"
 
+#include <sysexits.h>
 #include <unistd.h>
 
 #define MAX_INBUF_SIZE (1024*32)
@@ -78,13 +79,12 @@
 }
 
 static void
-server_connection_callback(struct server_connection *conn,
-			   enum server_cmd_reply reply)
+server_connection_callback(struct server_connection *conn, int exit_code)
 {
 	server_cmd_callback_t *callback = conn->callback;
 
 	conn->callback = NULL;
-	callback(reply, conn->context);
+	callback(exit_code, conn->context);
 }
 
 static void stream_data(string_t *str, const unsigned char *data, size_t size)
@@ -203,7 +203,7 @@
 	const unsigned char *data;
 	size_t size;
 	const char *line;
-	enum server_cmd_reply reply;
+	int exit_code;
 
 	if (!conn->handshaked) {
 		if ((line = i_stream_read_next_line(conn->input)) == NULL) {
@@ -266,12 +266,16 @@
 		if (line == NULL)
 			return;
 		if (line[0] == '+')
-			server_connection_callback(conn, SERVER_CMD_REPLY_OK);
+			server_connection_callback(conn, 0);
 		else if (line[0] == '-') {
-			reply = strcmp(line+1, "NOUSER") == 0 ?
-				SERVER_CMD_REPLY_UNKNOWN_USER :
-				SERVER_CMD_REPLY_FAIL;
-			server_connection_callback(conn, reply);
+			line++;
+			if (strcmp(line, "NOUSER") == 0)
+				exit_code = EX_NOUSER;
+			else if (str_to_int(line, &exit_code) < 0) {
+				/* old doveadm-server */
+				exit_code = EX_TEMPFAIL;
+			}
+			server_connection_callback(conn, exit_code);
 		} else {
 			i_error("doveadm server sent broken input "
 				"(expected cmd reply): %s", line);
@@ -413,10 +417,8 @@
 		}
 	}
 
-	if (conn->callback != NULL) {
-		server_connection_callback(conn,
-					   SERVER_CMD_REPLY_INTERNAL_FAILURE);
-	}
+	if (conn->callback != NULL)
+		server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED);
 	if (printing_conn == conn)
 		print_connection_released();
 
diff -r d8fc9bba98ab -r 63092465c522 src/doveadm/server-connection.h
--- a/src/doveadm/server-connection.h	Thu Jun 13 04:33:41 2013 +0300
+++ b/src/doveadm/server-connection.h	Thu Jun 13 04:35:06 2013 +0300
@@ -1,18 +1,13 @@
 #ifndef SERVER_CONNECTION_H
 #define SERVER_CONNECTION_H
 
-enum server_cmd_reply {
-	SERVER_CMD_REPLY_INTERNAL_FAILURE,
-	SERVER_CMD_REPLY_UNKNOWN_USER,
-	SERVER_CMD_REPLY_FAIL,
-	SERVER_CMD_REPLY_OK
-};
+#define SERVER_EXIT_CODE_DISCONNECTED 1000
 
 struct doveadm_server;
 struct server_connection;
 struct ssl_iostream;
 
-typedef void server_cmd_callback_t(enum server_cmd_reply reply, void *context);
+typedef void server_cmd_callback_t(int exit_code, void *context);
 
 int server_connection_create(struct doveadm_server *server,
 			     struct server_connection **conn_r);


More information about the dovecot-cvs mailing list