Skip to content

Commit

Permalink
lib: connection: Added support for connecting from an explicit source…
Browse files Browse the repository at this point in the history
… IP.
  • Loading branch information
stephanbosch committed Feb 27, 2018
1 parent d4d69bc commit 54c6a81
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
26 changes: 20 additions & 6 deletions src/lib/connection.c
Expand Up @@ -244,9 +244,10 @@ void connection_init_server(struct connection_list *list,
connection_init_streams(conn);
}

void connection_init_client_ip(struct connection_list *list,
struct connection *conn,
const struct ip_addr *ip, in_port_t port)
void connection_init_client_ip_from(struct connection_list *list,
struct connection *conn,
const struct ip_addr *ip, in_port_t port,
const struct ip_addr *my_ip)
{
i_assert(list->set.client);

Expand All @@ -257,6 +258,18 @@ void connection_init_client_ip(struct connection_list *list,

conn->ip = *ip;
conn->port = port;

if (my_ip != NULL)
conn->my_ip = *my_ip;
else
i_zero(&conn->my_ip);
}

void connection_init_client_ip(struct connection_list *list,
struct connection *conn,
const struct ip_addr *ip, in_port_t port)
{
connection_init_client_ip_from(list, conn, ip, port, NULL);
}

void connection_init_client_unix(struct connection_list *list,
Expand Down Expand Up @@ -323,9 +336,10 @@ int connection_client_connect(struct connection *conn)
i_assert(conn->list->set.client);
i_assert(conn->fd_in == -1);

if (conn->port != 0)
fd = net_connect_ip(&conn->ip, conn->port, NULL);
else if (conn->list->set.unix_client_connect_msecs == 0)
if (conn->port != 0) {
fd = net_connect_ip(&conn->ip, conn->port,
(conn->my_ip.family != 0 ? &conn->my_ip : NULL));
} else if (conn->list->set.unix_client_connect_msecs == 0)
fd = net_connect_unix(conn->name);
else
fd = net_connect_unix_with_retries(conn->name, conn->list->set.unix_client_connect_msecs);
Expand Down
6 changes: 5 additions & 1 deletion src/lib/connection.h
Expand Up @@ -92,7 +92,7 @@ struct connection {
struct timeval connect_finished;

/* for IP client: */
struct ip_addr ip;
struct ip_addr ip, my_ip;
in_port_t port;

/* received minor version */
Expand Down Expand Up @@ -121,6 +121,10 @@ void connection_init_server(struct connection_list *list,
void connection_init_client_ip(struct connection_list *list,
struct connection *conn,
const struct ip_addr *ip, in_port_t port);
void connection_init_client_ip_from(struct connection_list *list,
struct connection *conn,
const struct ip_addr *ip, in_port_t port,
const struct ip_addr *my_ip) ATTR_NULL(5);
void connection_init_client_unix(struct connection_list *list,
struct connection *conn, const char *path);
void connection_init_from_streams(struct connection_list *list,
Expand Down

0 comments on commit 54c6a81

Please sign in to comment.