dovecot-2.1: doveadm: Handle -NOUSER replies from doveadm-server.

dovecot at dovecot.org dovecot at dovecot.org
Wed Mar 7 11:29:54 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/9d47d53650be
changeset: 14263:9d47d53650be
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Mar 07 11:29:42 2012 +0200
description:
doveadm: Handle -NOUSER replies from doveadm-server.

diffstat:

 src/doveadm/doveadm-mail-server.c |  16 ++++++++++++----
 src/doveadm/server-connection.c   |  16 ++++++++++------
 src/doveadm/server-connection.h   |   1 +
 3 files changed, 23 insertions(+), 10 deletions(-)

diffs (78 lines):

diff -r e540405902f1 -r 9d47d53650be src/doveadm/doveadm-mail-server.c
--- a/src/doveadm/doveadm-mail-server.c	Wed Mar 07 11:23:03 2012 +0200
+++ b/src/doveadm/doveadm-mail-server.c	Wed Mar 07 11:29:42 2012 +0200
@@ -83,15 +83,23 @@
 	struct server_connection *conn = context;
 	struct doveadm_server *server;
 
-	if (reply == SERVER_CMD_REPLY_INTERNAL_FAILURE) {
+	switch (reply) {
+	case SERVER_CMD_REPLY_INTERNAL_FAILURE:
 		internal_failure = TRUE;
 		master_service_stop(master_service);
 		return;
+	case SERVER_CMD_REPLY_UNKNOWN_USER:
+		i_error("No such user");
+		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:
+		break;
 	}
 
-	if (reply != SERVER_CMD_REPLY_OK)
-		doveadm_mail_failed_error(cmd_ctx, MAIL_ERROR_TEMP);
-
 	server = server_connection_get_server(conn);
 	if (array_count(&server->queue) > 0) {
 		char *const *usernamep = array_idx(&server->queue, 0);
diff -r e540405902f1 -r 9d47d53650be src/doveadm/server-connection.c
--- a/src/doveadm/server-connection.c	Wed Mar 07 11:23:03 2012 +0200
+++ b/src/doveadm/server-connection.c	Wed Mar 07 11:29:42 2012 +0200
@@ -197,6 +197,7 @@
 	const unsigned char *data;
 	size_t size;
 	const char *line;
+	enum server_cmd_reply reply;
 
 	if (!conn->handshaked) {
 		if ((line = i_stream_read_next_line(conn->input)) == NULL) {
@@ -254,15 +255,18 @@
 		if (conn->state != SERVER_REPLY_STATE_RET)
 			break;
 		/* fall through */
-		data = i_stream_get_data(conn->input, &size);
 	case SERVER_REPLY_STATE_RET:
-		if (size < 2)
+		line = i_stream_next_line(conn->input);
+		if (line == NULL)
 			return;
-		if (data[0] == '+' && data[1] == '\n')
+		if (line[0] == '+')
 			server_connection_callback(conn, SERVER_CMD_REPLY_OK);
-		else if (data[0] == '-' && data[1] == '\n')
-			server_connection_callback(conn, SERVER_CMD_REPLY_FAIL);
-		else
+		else if (line[0] == '-') {
+			reply = strcmp(line+1, "NOUSER") == 0 ?
+				SERVER_CMD_REPLY_UNKNOWN_USER :
+				SERVER_CMD_REPLY_FAIL;
+			server_connection_callback(conn, reply);
+		} else
 			i_error("doveadm server sent broken input");
 		/* we're finished, close the connection */
 		server_connection_destroy(&conn);
diff -r e540405902f1 -r 9d47d53650be src/doveadm/server-connection.h
--- a/src/doveadm/server-connection.h	Wed Mar 07 11:23:03 2012 +0200
+++ b/src/doveadm/server-connection.h	Wed Mar 07 11:29:42 2012 +0200
@@ -3,6 +3,7 @@
 
 enum server_cmd_reply {
 	SERVER_CMD_REPLY_INTERNAL_FAILURE,
+	SERVER_CMD_REPLY_UNKNOWN_USER,
 	SERVER_CMD_REPLY_FAIL,
 	SERVER_CMD_REPLY_OK
 };


More information about the dovecot-cvs mailing list