]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-connection - Try all IPs when connecting to remote host
authorAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 20 Apr 2020 11:57:07 +0000 (14:57 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Fri, 24 Apr 2020 11:51:31 +0000 (11:51 +0000)
src/lib-smtp/smtp-client-connection.c

index a8782b3bb26c3e64c3ca85a6cb6c15dfd2650863..a49e9376d94c112be5d726f2a81c75be7ce716e9 100644 (file)
@@ -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)
 {