From b136a381ac64c99b7341830ae664ae70c726c08f Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Tue, 27 Feb 2018 21:58:17 +0100 Subject: [PATCH] lib-smtp: client: Add support for connecting from an explicit source IP. --- src/lib-smtp/smtp-client-connection.c | 20 ++++++++++++++------ src/lib-smtp/smtp-client.c | 1 + src/lib-smtp/smtp-client.h | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) 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; -- 2.47.3