From 1e3de3981ee5b13f59d84c6f9cd3722ae3084852 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Fri, 16 Feb 2018 10:11:01 +0100 Subject: [PATCH] lib-smtp: server: Handle output stream errors in a separate function. --- src/lib-smtp/smtp-server-connection.c | 39 ++++++++++++++++----------- src/lib-smtp/smtp-server-private.h | 3 +++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index eeeecddb1e..6db65a51d5 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -592,6 +592,27 @@ bool smtp_server_connection_pending_command_data( * Command reply handling */ +void smtp_server_connection_handle_output_error( + struct smtp_server_connection *conn) +{ + struct ostream *output = conn->conn.output; + + if (output->stream_errno != EPIPE && + output->stream_errno != ECONNRESET) { + smtp_server_connection_error(conn, + "Connection lost: write(%s) failed: %s", + o_stream_get_name(output), + o_stream_get_error(output)); + smtp_server_connection_close(&conn, + "Write failure"); + } else { + smtp_server_connection_debug(conn, + "Connection lost: Remote disconnected"); + smtp_server_connection_close(&conn, + "Remote closed connection unexpectedly"); + } +} + static bool smtp_server_connection_next_reply(struct smtp_server_connection *conn) { @@ -688,22 +709,8 @@ int smtp_server_connection_flush(struct smtp_server_connection *conn) int ret; if ((ret = o_stream_flush(output)) <= 0) { - if (ret < 0) { - if (output->stream_errno != EPIPE && - output->stream_errno != ECONNRESET) { - smtp_server_connection_error(conn, - "Connection lost: write(%s) failed: %s", - o_stream_get_name(output), - o_stream_get_error(output)); - smtp_server_connection_close(&conn, - "Write failure"); - } else { - smtp_server_connection_debug(conn, - "Connection lost: Remote disconnected"); - smtp_server_connection_close(&conn, - "Remote closed connection unexpectedly"); - } - } + if (ret < 0) + smtp_server_connection_handle_output_error(conn); return ret; } return 1; diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index bd41896825..8aa5044e4e 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -296,6 +296,9 @@ void smtp_server_connection_error(struct smtp_server_connection *conn, struct connection_list *smtp_server_connection_list_init(void); void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn); + +void smtp_server_connection_handle_output_error( + struct smtp_server_connection *conn); void smtp_server_connection_trigger_output(struct smtp_server_connection *conn); bool smtp_server_connection_pending_payload(struct smtp_server_connection *conn);