Mercurial > dovecot > core-2.2
diff src/lmtp/lmtp-proxy.c @ 10396:6ab1e2f4ca55 HEAD
lmtp: Error handling fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 23 Nov 2009 18:19:01 -0500 |
parents | c5c360a88067 |
children | 9500cfbe5dbf |
line wrap: on
line diff
--- a/src/lmtp/lmtp-proxy.c Mon Nov 23 17:39:18 2009 -0500 +++ b/src/lmtp/lmtp-proxy.c Mon Nov 23 18:19:01 2009 -0500 @@ -55,8 +55,6 @@ unsigned int finished:1; }; -static void lmtp_proxy_conn_deinit(struct lmtp_proxy_connection *conn, - const char *reason); static void lmtp_proxy_data_input(struct lmtp_proxy *proxy); struct lmtp_proxy * @@ -84,7 +82,7 @@ conns = array_get(&proxy->connections, &count); for (i = 0; i < count; i++) - lmtp_proxy_conn_deinit(conns[i], "451 4.3.0 Aborting"); + lmtp_client_fail(conns[i]->client, "451 4.3.0 Aborting"); } void lmtp_proxy_deinit(struct lmtp_proxy **_proxy) @@ -146,22 +144,12 @@ return conn; } -static void lmtp_proxy_conn_deinit(struct lmtp_proxy_connection *conn, - const char *reason) +static void lmtp_proxy_conn_close(struct lmtp_proxy_connection *conn) { - struct lmtp_proxy_recipient *rcpt; - - /* set failure replies to all recipients in this connection */ - array_foreach_modifiable(&conn->proxy->rcpt_to, rcpt) { - if (rcpt->conn == conn && !rcpt->rcpt_to_failed) - rcpt->reply = reason; - } - if (conn->client != NULL) lmtp_client_deinit(&conn->client); if (conn->data_input != NULL) i_stream_unref(&conn->data_input); - conn->failed = TRUE; } static bool lmtp_proxy_send_replies(struct lmtp_proxy *proxy) @@ -256,6 +244,10 @@ } i_assert(i != count); + if (!success && conn->rcpt_next_reply_low_idx == count && + lmtp_client_is_data_input_finished(conn->client)) + lmtp_proxy_conn_close(conn); + /* send replies only if we've already sent DATA. */ if (conn->proxy->data_input != NULL) lmtp_proxy_try_finish(conn->proxy); @@ -281,6 +273,11 @@ } } i_assert(i != count); + + if (conn->data_next_reply_low_idx == count && + lmtp_client_is_data_input_finished(conn->client)) + lmtp_proxy_conn_close(conn); + lmtp_proxy_try_finish(conn->proxy); } @@ -334,9 +331,9 @@ for (i = 0; i < count; i++) { (void)i_stream_get_data(conns[i]->data_input, &size); if (size == max_size) { - lmtp_proxy_conn_deinit(conns[i], - ERRSTR_TEMP_REMOTE_FAILURE - " (DATA output timeout)"); + lmtp_client_fail(conns[i]->client, + ERRSTR_TEMP_REMOTE_FAILURE + " (DATA output timeout)"); } } return TRUE;