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;