From: Stephan Bosch Date: Tue, 27 Feb 2018 20:58:17 +0000 (+0100) Subject: lib-smtp: client: Add support for connecting from an explicit source IP. X-Git-Tag: 2.3.9~2215 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b136a381ac64c99b7341830ae664ae70c726c08f;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: Add support for connecting from an explicit source IP. --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index 8de8ffc4db..677bdf1b28 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -1404,19 +1404,25 @@ smtp_client_connection_do_connect(struct smtp_client_connection *conn) static void smtp_client_connection_connect_next_ip(struct smtp_client_connection *conn) { - const struct ip_addr *ip; + const struct ip_addr *ip, *my_ip = &conn->set.my_ip; timeout_remove(&conn->to_connect); conn->prev_connect_idx = (conn->prev_connect_idx+1) % conn->ips_count; ip = &conn->ips[conn->prev_connect_idx]; - smtp_client_connection_debug(conn, - "Connecting to %s:%u", - net_ip2addr(ip), conn->port); + if (my_ip->family != 0) { + smtp_client_connection_debug(conn, + "Connecting to %s:%u (from %s)", + net_ip2addr(ip), conn->port, net_ip2addr(my_ip)); + } else { + smtp_client_connection_debug(conn, + "Connecting to %s:%u", + net_ip2addr(ip), conn->port); + } - connection_init_client_ip - (conn->client->conn_list, &conn->conn, ip, conn->port); + connection_init_client_ip_from(conn->client->conn_list, + &conn->conn, ip, conn->port, my_ip); smtp_client_connection_do_connect(conn); } @@ -1623,6 +1629,8 @@ smtp_client_connection_create(struct smtp_client *client, conn->set = client->set; if (set != NULL) { + if (set->my_ip.family != 0) + conn->set.my_ip = set->my_ip; if (set->my_hostname != NULL && *set->my_hostname != '\0') conn->set.my_hostname = p_strdup(pool, set->my_hostname); diff --git a/src/lib-smtp/smtp-client.c b/src/lib-smtp/smtp-client.c index 4f92e395a9..c5f5fe3937 100644 --- a/src/lib-smtp/smtp-client.c +++ b/src/lib-smtp/smtp-client.c @@ -31,6 +31,7 @@ struct smtp_client *smtp_client_init(const struct smtp_client_settings *set) client = p_new(pool, struct smtp_client, 1); client->pool = pool; + client->set.my_ip = set->my_ip; client->set.my_hostname = p_strdup(pool, set->my_hostname); client->set.dns_client = set->dns_client; client->set.dns_client_socket_path = diff --git a/src/lib-smtp/smtp-client.h b/src/lib-smtp/smtp-client.h index cbc9ddfc24..3aaa39be0a 100644 --- a/src/lib-smtp/smtp-client.h +++ b/src/lib-smtp/smtp-client.h @@ -38,6 +38,7 @@ enum smtp_client_command_error { }; struct smtp_client_settings { + struct ip_addr my_ip; const char *my_hostname; const char *temp_path_prefix;