From: Timo Sirainen Date: Wed, 7 Mar 2012 09:29:42 +0000 (+0200) Subject: doveadm: Handle -NOUSER replies from doveadm-server. X-Git-Tag: 2.1.2~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d359c1719bf6ff228a96c66d27f5cfa239cb31d;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Handle -NOUSER replies from doveadm-server. --- diff --git a/src/doveadm/doveadm-mail-server.c b/src/doveadm/doveadm-mail-server.c index b44d859212..782e7acf6a 100644 --- a/src/doveadm/doveadm-mail-server.c +++ b/src/doveadm/doveadm-mail-server.c @@ -83,14 +83,22 @@ static void doveadm_cmd_callback(enum server_cmd_reply reply, void *context) 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; - } - - if (reply != SERVER_CMD_REPLY_OK) + 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; + } server = server_connection_get_server(conn); if (array_count(&server->queue) > 0) { diff --git a/src/doveadm/server-connection.c b/src/doveadm/server-connection.c index d0863df58f..15deb245cb 100644 --- a/src/doveadm/server-connection.c +++ b/src/doveadm/server-connection.c @@ -197,6 +197,7 @@ static void server_connection_input(struct server_connection *conn) 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 @@ static void server_connection_input(struct server_connection *conn) 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 --git a/src/doveadm/server-connection.h b/src/doveadm/server-connection.h index 4e00a367c3..9d36f6ac30 100644 --- a/src/doveadm/server-connection.h +++ b/src/doveadm/server-connection.h @@ -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 };