From: Aki Tuomi Date: Mon, 20 Apr 2020 11:57:07 +0000 (+0300) Subject: lib-smtp: smtp-client-connection - Try all IPs when connecting to remote host X-Git-Tag: 2.3.11.2~180 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=666a8303e4f34eb5d7e1f4452f307be5098c851e;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-client-connection - Try all IPs when connecting to remote host --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index a8782b3bb2..a49e9376d9 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -39,6 +39,10 @@ static void smtp_client_connection_established(struct smtp_client_connection *conn); static void smtp_client_connection_start_transaction(struct smtp_client_connection *conn); +static void +smtp_client_connection_connect_next_ip(struct smtp_client_connection *conn); +static bool +smtp_client_connection_last_ip(struct smtp_client_connection *conn); /* * Capabilities @@ -281,6 +285,14 @@ void smtp_client_connection_fail(struct smtp_client_connection *conn, struct smtp_reply reply; const char *text_lines[] = {error, NULL}; + if (status == SMTP_CLIENT_COMMAND_ERROR_CONNECT_FAILED && + !smtp_client_connection_last_ip(conn)) { + i_assert(conn->to_connect == NULL); + conn->to_connect = timeout_add_short(0, smtp_client_connection_connect_next_ip, + conn); + return; + } + i_zero(&reply); reply.status = status; reply.text_lines = text_lines; @@ -1488,6 +1500,13 @@ smtp_client_connection_do_connect(struct smtp_client_connection *conn) } } +static bool +smtp_client_connection_last_ip(struct smtp_client_connection *conn) +{ + i_assert(conn->prev_connect_idx < conn->ips_count); + return (conn->prev_connect_idx + 1) % conn->ips_count == 0; +} + static void smtp_client_connection_connect_next_ip(struct smtp_client_connection *conn) {