to = timeout_add_short(10, test_server_continue, &fuzz_ctx);
smtp_server = smtp_server_init(&smtp_server_set);
- conn = smtp_server_connection_create(smtp_server, fuzz_ctx.fd, fuzz_ctx.fd, NULL, 0,
+ conn = smtp_server_connection_create(smtp_server, fuzz_ctx.fd, fuzz_ctx.fd, NULL, 0, NULL, 0,
FALSE, NULL, &server_callbacks, &fuzz_ctx);
smtp_server_connection_start(conn);
struct smtp_server_connection *
smtp_server_connection_create(
struct smtp_server *server, int fd_in, int fd_out,
+ const struct ip_addr *local_ip, in_port_t local_port,
const struct ip_addr *remote_ip, in_port_t remote_port,
bool ssl_start, const struct smtp_server_settings *set,
const struct smtp_server_callbacks *callbacks, void *context)
conn->conn.event_parent = conn_event;
connection_init_server_ip(server->conn_list, &conn->conn, NULL,
fd_in, fd_out, remote_ip, remote_port);
+ if (local_ip != NULL && local_ip->family != 0)
+ conn->conn.local_ip = *local_ip;
+ conn->conn.local_port = local_port;
conn->event = conn->conn.event;
smtp_server_connection_update_event(conn);
event_unref(&conn_event);
smtp_server_connection_create_from_streams(
struct smtp_server *server,
struct istream *input, struct ostream *output,
+ const struct ip_addr *local_ip, in_port_t local_port,
const struct ip_addr *remote_ip, in_port_t remote_port,
const struct smtp_server_settings *set,
const struct smtp_server_callbacks *callbacks, void *context)
conn = smtp_server_connection_alloc(server, set, fd_in, fd_out,
callbacks, context);
+ if (local_ip != NULL && local_ip->family != 0)
+ conn->conn.local_ip = *local_ip;
+ conn->conn.local_port = local_port;
if (remote_ip != NULL && remote_ip->family != 0)
conn->conn.remote_ip = *remote_ip;
if (remote_port != 0)
struct smtp_server_connection *
smtp_server_connection_create(
struct smtp_server *server, int fd_in, int fd_out,
+ const struct ip_addr *local_ip, in_port_t local_port,
const struct ip_addr *remote_ip, in_port_t remote_port, bool ssl_start,
const struct smtp_server_settings *set,
const struct smtp_server_callbacks *callbacks, void *context)
smtp_server_connection_create_from_streams(
struct smtp_server *server,
struct istream *input, struct ostream *output,
+ const struct ip_addr *local_ip, in_port_t local_port,
const struct ip_addr *remote_ip, in_port_t remote_port,
const struct smtp_server_settings *set,
const struct smtp_server_callbacks *callbacks, void *context)
client->pool = pool;
client->smtp_conn = smtp_server_connection_create(
- smtp_server, fd, fd, NULL, 0,
+ smtp_server, fd, fd, NULL, 0, NULL, 0,
(tset.ssl_mode == TEST_SSL_MODE_IMMEDIATE),
NULL, &server_callbacks, client);
smtp_server_connection_start(client->smtp_conn);
if (server_io_buffer_size == 0) {
conn = smtp_server_connection_create(
- smtp_server, fd, fd, NULL, 0, (test_ssl_host != NULL),
+ smtp_server, fd, fd, NULL, 0, NULL, 0,
+ (test_ssl_host != NULL),
NULL, &server_callbacks, sconn);
} else {
struct istream *input;
o_stream_set_no_error_handling(output, TRUE);
conn = smtp_server_connection_create_from_streams(
- smtp_server, input, output, NULL, 0, NULL,
+ smtp_server, input, output, NULL, 0, NULL, 0, NULL,
&server_callbacks, sconn);
i_stream_unref(&input);
}
client->conn = smtp_server_connection_create(
- lmtp_server, fd_in, fd_out,
+ lmtp_server, fd_in, fd_out, &conn->local_ip, conn->local_port,
&conn->remote_ip, conn->remote_port, conn->ssl,
&lmtp_set, &lmtp_callbacks, client);
if (smtp_server_connection_is_trusted(client->conn)) {
subm_client->conn = smtp_server_connection_create_from_streams(
smtp_server, client->input, client->output,
+ &client->real_local_ip, client->real_local_port,
&client->real_remote_ip, client->real_remote_port,
&smtp_set, &smtp_callbacks, subm_client);
return 0;
p_array_init(&client->module_contexts, client->pool, 5);
conn = client->conn = smtp_server_connection_create(smtp_server,
- fd_in, fd_out, user->conn.remote_ip, user->conn.remote_port,
+ fd_in, fd_out, user->conn.local_ip, user->conn.local_port,
+ user->conn.remote_ip, user->conn.remote_port,
FALSE, &smtp_set, &smtp_callbacks, client);
smtp_server_connection_set_proxy_data(conn, proxy_data);
smtp_server_connection_login(conn, client->user->username, helo,