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