From: Stephan Bosch Date: Mon, 27 Aug 2018 23:58:58 +0000 (+0200) Subject: submission: Split the DATA command into a generic part and a part related to relaying... X-Git-Tag: 2.3.5~260 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d574b79d23956906806a69b20ec25e46268f10a4;p=thirdparty%2Fdovecot%2Fcore.git submission: Split the DATA command into a generic part and a part related to relaying to an MTA. --- diff --git a/src/submission/cmd-data.c b/src/submission/cmd-data.c index ad24407c5d..de0b8c65ea 100644 --- a/src/submission/cmd-data.c +++ b/src/submission/cmd-data.c @@ -64,11 +64,28 @@ static void cmd_data_proxy_cb(const struct smtp_reply *proxy_reply, smtp_server_reply_forward(cmd, &reply); } +int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input) +{ + struct cmd_data_context *data_ctx; + + /* start relaying to relay server */ + data_ctx = p_new(trans->pool, struct cmd_data_context, 1); + data_ctx->client = client; + data_ctx->cmd = cmd; + data_ctx->trans = trans; + trans->context = (void*)data_ctx; + + data_ctx->cmd_proxied = smtp_client_command_data_submit( + client->proxy_conn, 0, data_input, cmd_data_proxy_cb, data_ctx); + return 0; +} + int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_transaction *trans) { struct client *client = conn_ctx; - struct cmd_data_context *data_ctx = trans->context; struct istream *data_input = client->state.data_input; struct istream *inputs[3]; string_t *added_headers; @@ -105,36 +122,25 @@ int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, inputs[1] = data_input; inputs[2] = NULL; - data_ctx->cmd = cmd; - data_input = i_stream_create_concat(inputs); i_stream_unref(&inputs[0]); i_stream_unref(&inputs[1]); - /* start proxying to relay server */ + ret = cmd_data_relay(client, cmd, trans, data_input); - data_ctx->cmd_proxied = smtp_client_command_data_submit( - client->proxy_conn, 0, data_input, - cmd_data_proxy_cb, data_ctx); i_stream_unref(&data_input); - return 0; + return ret; } int cmd_data_begin(void *conn_ctx, struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, - struct smtp_server_transaction *trans, + struct smtp_server_transaction *trans ATTR_UNUSED, struct istream *data_input) { struct client *client = conn_ctx; - struct cmd_data_context *data_ctx; struct istream *inputs[2]; string_t *path; - data_ctx = p_new(trans->pool, struct cmd_data_context, 1); - data_ctx->client = client; - data_ctx->trans = trans; - trans->context = (void*)data_ctx; - inputs[0] = data_input; inputs[1] = NULL; diff --git a/src/submission/submission-commands.h b/src/submission/submission-commands.h index dadb923eeb..85d4384e12 100644 --- a/src/submission/submission-commands.h +++ b/src/submission/submission-commands.h @@ -11,6 +11,9 @@ int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, int cmd_rcpt_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_rcpt *data); int cmd_rset_relay(struct client *client, struct smtp_server_cmd_ctx *cmd); +int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input); void submission_helo_reply_submit(struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data);