changeset 10286:353a30947b91 HEAD

lmtp client: More fixes to handling RCPT TO failures.
author Timo Sirainen <tss@iki.fi>
date Mon, 09 Nov 2009 20:03:42 -0500
parents aa8729e340ba
children 147627c8433a
files src/lib-lda/lmtp-client.c
diffstat 1 files changed, 11 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-lda/lmtp-client.c	Mon Nov 09 19:27:27 2009 -0500
+++ b/src/lib-lda/lmtp-client.c	Mon Nov 09 20:03:42 2009 -0500
@@ -183,31 +183,21 @@
 {
 	struct lmtp_rcpt *rcpt;
 	unsigned int i, count;
-	bool last = TRUE;
 
-	switch (client->protocol) {
-	case LMTP_CLIENT_PROTOCOL_SMTP:
-		i_assert(client->rcpt_next_data_idx == 0);
-
-		rcpt = array_get_modifiable(&client->recipients, &count);
-		for (i = 0; i < count; i++) {
-			rcpt[i].failed = line[0] != '2';
-			rcpt[i].data_callback(!rcpt[i].failed, line,
-					      rcpt[i].context);
+	rcpt = array_get_modifiable(&client->recipients, &count);
+	for (i = client->rcpt_next_data_idx; i < count; i++) {
+		if (rcpt[i].failed) {
+			/* already called rcpt_to_callback with failure */
+			continue;
 		}
-		client->rcpt_next_data_idx = count;
-		break;
-	case LMTP_CLIENT_PROTOCOL_LMTP:
-		rcpt = array_idx_modifiable(&client->recipients,
-					    client->rcpt_next_data_idx);
-		rcpt->failed = line[0] != '2';
-		last = ++client->rcpt_next_data_idx ==
-			array_count(&client->recipients);
 
-		rcpt->data_callback(!rcpt->failed, line, rcpt->context);
-		break;
+		rcpt[i].failed = line[0] != '2';
+		rcpt[i].data_callback(!rcpt[i].failed, line,
+				      rcpt[i].context);
+		if (client->protocol == LMTP_CLIENT_PROTOCOL_LMTP)
+			break;
 	}
-	return !last;
+	return i < count;
 }
 
 static void lmtp_client_send_data(struct lmtp_client *client)