} else {
smtp_command_parser_error(
parser, SMTP_COMMAND_PARSE_ERROR_BROKEN_STREAM,
- "Stream error: %s",
- i_stream_get_error(parser->input));
+ "%s", i_stream_get_disconnect_reason(parser->input));
}
}
return ret;
default:
smtp_command_parser_error(
parser, SMTP_COMMAND_PARSE_ERROR_BROKEN_STREAM,
- "Stream error while skipping command data: "
- "%s", i_stream_get_error(parser->data));
+ "%s", i_stream_get_disconnect_reason(parser->data));
}
return -1;
}
&auth_response, &error_code, &error)) <= 0) {
/* check for disconnect */
if (conn->conn.input->eof) {
- switch (conn->conn.input->stream_errno) {
- case 0:
- case EPIPE:
- case ECONNRESET:
- smtp_server_connection_close(&conn,
- "Remote closed connection unexpectedly during AUTH");
- break;
- default:
- e_error(conn->event,
- "Connection lost during AUTH: "
- "read(%s) failed: %s",
- i_stream_get_name(conn->conn.input),
- i_stream_get_error(conn->conn.input));
- smtp_server_connection_close(&conn,
- "Read failure");
- }
+ smtp_server_connection_close(&conn,
+ i_stream_get_disconnect_reason(conn->conn.input));
return;
}
/* handle syntax error */
struct smtp_server_command *command = cmd->cmd;
struct cmd_data_context *data_cmd = command->data;
struct istream *data_input = conn->state.data_input;
- unsigned int stream_errno = data_input->stream_errno;
+ const char *error;
conn->state.data_failed = TRUE;
return;
}
- if (stream_errno != EPIPE && stream_errno != ECONNRESET) {
- e_error(conn->event, "Connection lost during data transfer: "
- "read(%s) failed: %s",
- i_stream_get_name(data_input),
- i_stream_get_error(data_input));
- smtp_server_connection_close(&conn, "Read failure");
- } else {
- e_debug(conn->event, "Connection lost during data transfer: "
- "Remote disconnected");
- smtp_server_connection_close(&conn,
- "Remote closed connection unexpectedly");
- }
+ error = i_stream_get_disconnect_reason(data_input);
+ e_debug(conn->event, "Connection lost during data transfer: %s", error);
+ smtp_server_connection_close(&conn, error);
}
static int cmd_data_do_handle_input(struct smtp_server_cmd_ctx *cmd)
}
if (ret < 0 && conn->conn.input->eof) {
- int stream_errno = conn->conn.input->stream_errno;
- if (stream_errno != 0 && stream_errno != EPIPE &&
- stream_errno != ECONNRESET) {
- e_error(conn->event,
- "Connection lost: read(%s) failed: %s",
- i_stream_get_name(conn->conn.input),
- i_stream_get_error(conn->conn.input));
- smtp_server_connection_close(&conn,
- "Read failure");
+ const char *error =
+ i_stream_get_disconnect_reason(conn->conn.input);
+ e_debug(conn->event, "Remote closed connection: %s",
+ error);
+
+ if (conn->command_queue_head == NULL ||
+ conn->command_queue_head->state <
+ SMTP_SERVER_COMMAND_STATE_SUBMITTED_REPLY) {
+ /* No pending commands or unfinished
+ command; close */
+ smtp_server_connection_close(&conn, error);
} else {
- e_debug(conn->event,
- "Connection lost: Remote disconnected");
-
- if (conn->command_queue_head == NULL ||
- conn->command_queue_head->state <
- SMTP_SERVER_COMMAND_STATE_SUBMITTED_REPLY) {
- /* No pending commands or unfinished
- command; close */
- smtp_server_connection_close(&conn,
- "Remote closed connection");
- } else {
- /* A command is still processing;
- only drop input io for now */
- conn->input_broken = TRUE;
- smtp_server_connection_input_halt(conn);
- }
+ /* A command is still processing;
+ only drop input io for now */
+ conn->input_broken = TRUE;
+ smtp_server_connection_input_halt(conn);
}
return;
}
"Command data size exceeds absolute limit");
return;
case SMTP_COMMAND_PARSE_ERROR_BROKEN_STREAM:
- smtp_server_connection_close(&conn,
- "Command data ended prematurely");
+ smtp_server_connection_close(&conn, error);
return;
default:
i_unreached();
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) {
- e_error(conn->event, "Connection lost: write(%s) failed: %s",
- o_stream_get_name(output), o_stream_get_error(output));
- smtp_server_connection_close(&conn, "Write failure");
- } else {
- e_debug(conn->event, "Connection lost: Remote disconnected");
- smtp_server_connection_close(
- &conn, "Remote closed connection unexpectedly");
- }
+ smtp_server_connection_close(&conn,
+ o_stream_get_disconnect_reason(conn->conn.output));
}
static bool