From: Stephan Bosch Date: Fri, 16 Feb 2018 22:40:29 +0000 (+0100) Subject: lib-smtp: client: Handle output stream errors in a separate function. X-Git-Tag: 2.3.1~131 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3a6c4f95af8b6d38e597a99d302f275cb86f8eef;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: Handle output stream errors in a separate function. --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index 765bcd38d7..2221f7de40 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -344,6 +344,31 @@ void smtp_client_connection_fail(struct smtp_client_connection *conn, smtp_client_connection_fail_reply(conn, &reply); } +void smtp_client_connection_handle_output_error( + struct smtp_client_connection *conn) +{ + struct ostream *output = conn->conn.output; + + if (output->stream_errno != EPIPE && + output->stream_errno != ECONNRESET) { + smtp_client_connection_error(conn, + "Connection lost: write(%s) failed: %s", + o_stream_get_name(conn->conn.output), + o_stream_get_error(conn->conn.output)); + smtp_client_connection_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_CONNECTION_LOST, + "Lost connection to remote server: " + "Write failure"); + } else { + smtp_client_connection_error(conn, + "Connection lost: Remote disconnected"); + smtp_client_connection_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_CONNECTION_LOST, + "Lost connection to remote server: " + "Remote closed connection unexpectedly"); + } +} + static void stmp_client_connection_ready(struct smtp_client_connection *conn, const struct smtp_reply *reply) { @@ -1071,16 +1096,8 @@ static int smtp_client_connection_output(struct smtp_client_connection *conn) timeout_reset(conn->to_connect); if ((ret=o_stream_flush(conn->conn.output)) <= 0) { - if (ret < 0) { - smtp_client_connection_error(conn, - "Connection lost: write(%s) failed: %s", - o_stream_get_name(conn->conn.output), - o_stream_get_error(conn->conn.output)); - smtp_client_connection_fail(conn, - SMTP_CLIENT_COMMAND_ERROR_CONNECTION_LOST, - "Lost connection to remote server " - "(write failure)"); - } + if (ret < 0) + smtp_client_connection_handle_output_error(conn); return ret; } diff --git a/src/lib-smtp/smtp-client-private.h b/src/lib-smtp/smtp-client-private.h index a6425b5b8c..603d614884 100644 --- a/src/lib-smtp/smtp-client-private.h +++ b/src/lib-smtp/smtp-client-private.h @@ -217,6 +217,8 @@ smpt_client_connection_label(struct smtp_client_connection *conn); void smtp_client_connection_fail(struct smtp_client_connection *conn, unsigned int status, const char *error); +void smtp_client_connection_handle_output_error( + struct smtp_client_connection *conn); void smtp_client_connection_trigger_output( struct smtp_client_connection *conn);