Before, it first allocated stuff on the command pool, which gets freed when the RCPT
command finishes. Allocating the recipient data on its own pool from the start
considerably simplifies the code and prevents very nasty bugs.
/* RCPT command */
+struct smtp_server_cmd_rcpt {
+ struct smtp_server_recipient *rcpt;
+};
+
+static void
+cmd_rcpt_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
+ struct smtp_server_cmd_rcpt *data)
+{
+ smtp_server_recipient_destroy(&data->rcpt);
+}
+
static bool
cmd_rcpt_check_state(struct smtp_server_cmd_ctx *cmd)
{
{
struct smtp_server_connection *conn = cmd->conn;
struct smtp_server_command *command = cmd->cmd;
- struct smtp_server_transaction *trans = conn->state.trans;
- struct smtp_server_recipient *rcpt;
+ struct smtp_server_recipient *rcpt = data->rcpt;
i_assert(conn->state.pending_rcpt_cmds > 0);
conn->state.pending_rcpt_cmds--;
}
/* success */
- rcpt = smtp_server_recipient_create(conn, data->path);
- smtp_params_rcpt_copy(rcpt->pool, &rcpt->params, &data->params);
- rcpt->context = data->trans_context;
-
+ data->rcpt = NULL; /* clear to prevent destruction */
smtp_server_recipient_approved(rcpt);
-
- if (data->hook_finished != NULL) {
- data->hook_finished(cmd, trans, rcpt,
- array_count(&trans->rcpt_to) - 1);
- data->hook_finished = NULL;
- }
}
static void
const struct smtp_server_callbacks *callbacks = conn->callbacks;
struct smtp_server_command *command = cmd->cmd;
struct smtp_server_cmd_rcpt *rcpt_data;
+ struct smtp_server_recipient *rcpt;
enum smtp_address_parse_flags path_parse_flags;
const char *const *param_extensions = NULL;
struct smtp_address *path;
return;
}
+ rcpt = smtp_server_recipient_create(conn, path);
+
rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1);
+ rcpt_data->rcpt = rcpt;
/* [SP Rcpt-parameters] */
if (array_is_created(&conn->rcpt_param_extensions))
param_extensions = array_idx(&conn->rcpt_param_extensions, 0);
- if (smtp_params_rcpt_parse(cmd->pool, params, caps, param_extensions,
- &rcpt_data->params, &pperror, &error) < 0) {
+ if (smtp_params_rcpt_parse(rcpt->pool, params, caps, param_extensions,
+ &rcpt->params, &pperror, &error) < 0) {
switch (pperror) {
case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
smtp_server_reply(cmd,
return;
}
- rcpt_data->path = smtp_address_clone(cmd->pool, path);
-
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_NEXT,
cmd_rcpt_recheck, rcpt_data);
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED,
cmd_rcpt_completed, rcpt_data);
-
+ smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_DESTROY,
+ cmd_rcpt_destroy, rcpt_data);
+
conn->state.pending_rcpt_cmds++;
smtp_server_command_ref(command);
i_assert(callbacks != NULL && callbacks->conn_cmd_rcpt != NULL);
- if ((ret=callbacks->conn_cmd_rcpt(conn->context,
- cmd, rcpt_data)) <= 0) {
+ if ((ret=callbacks->conn_cmd_rcpt(conn->context, cmd, rcpt)) <= 0) {
i_assert(ret == 0 || smtp_server_command_is_replied(command));
/* command is waiting for external event or it failed */
smtp_server_command_unref(&command);
struct timeval timestamp;
};
-struct smtp_server_cmd_rcpt {
- struct smtp_address *path;
- struct smtp_params_rcpt params;
-
- /* called once the recipient is definitively added to the transaction */
- void (*hook_finished)(struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_transaction *trans,
- struct smtp_server_recipient *rcpt,
- unsigned int index);
-
- void *trans_context;
-};
-
struct smtp_server_cmd_auth {
const char *sasl_mech;
const char *initial_response;
/* RCPT */
int (*conn_cmd_rcpt)(void *conn_ctx,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
/* RSET */
int (*conn_cmd_rset)(void *conn_ctx,
struct smtp_server_cmd_ctx *cmd);
static int
test_server_conn_cmd_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (debug) {
i_debug("test server: RCPT TO:%s",
- smtp_address_encode(data->path));
+ smtp_address_encode(rcpt->path));
}
return 1;
static int
test_server_hanging_command_payload_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (debug) {
i_debug("RCPT TO:%s",
- smtp_address_encode(data->path));
+ smtp_address_encode(rcpt->path));
}
return 1;
static int
test_server_bad_command_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
return 1;
}
static int
test_server_long_command_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
return 1;
}
static int
test_server_big_data_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (debug) {
i_debug("RCPT TO:%s",
- smtp_address_encode(data->path));
+ smtp_address_encode(rcpt->path));
}
return 1;
}
static int
test_server_bad_ehlo_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
return 1;
}
static int
test_server_bad_mail_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
test_assert(FALSE);
return 1;
static int
test_server_bad_rcpt_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
return 1;
}
static int
test_server_mail_workarounds_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
test_assert(FALSE);
return 1;
static int
test_server_rcpt_workarounds_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
return 1;
}
static int
test_server_too_many_recipients_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (debug) {
i_debug("RCPT TO:%s",
- smtp_address_encode(data->path));
+ smtp_address_encode(rcpt->path));
}
return 1;
}
static int
test_server_data_no_mail_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
/* not supposed to get here */
i_assert(FALSE);
static int
test_server_data_no_rcpt_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data ATTR_UNUSED)
+ struct smtp_server_recipient *rcpt ATTR_UNUSED)
{
/* not supposed to get here */
i_assert(FALSE);
static int
test_server_data_binarymime_rcpt(void *conn_ctx ATTR_UNUSED,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (debug) {
i_debug("RCPT TO:%s",
- smtp_address_encode(data->path));
+ smtp_address_encode(rcpt->path));
}
return 1;
}
*/
int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
struct client *client = (struct client *)conn_ctx;
const char *username, *detail;
smtp_address_detail_parse_temp(
client->unexpanded_lda_set->recipient_delimiter,
- data->path, &username, &delim, &detail);
+ rcpt->path, &username, &delim, &detail);
if (client->lmtp_set->lmtp_proxy) {
/* proxied? */
- if ((ret=lmtp_proxy_rcpt(client, cmd, data,
+ if ((ret=lmtp_proxy_rcpt(client, cmd, rcpt,
username, detail, delim)) != 0)
return (ret < 0 ? -1 : 0);
/* no */
}
/* local delivery */
- return lmtp_local_rcpt(client, cmd, data, username, detail);
+ return lmtp_local_rcpt(client, cmd, rcpt, username, detail);
}
/*
int cmd_mail(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
struct smtp_server_cmd_mail *data);
int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
struct smtp_server_transaction *trans);
int cmd_data_begin(void *conn_ctx, struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct client *client,
enum lmtp_recipient_type type,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
lrcpt->client = client;
lrcpt->type = type;
lrcpt->rcpt_cmd = cmd;
- lrcpt->path = data->path;
+ lrcpt->rcpt = rcpt;
+ lrcpt->path = rcpt->path;
}
-void lmtp_recipient_finish(struct lmtp_recipient *lrcpt,
- struct smtp_server_recipient *rcpt,
- unsigned int index)
+void lmtp_recipient_finish(struct lmtp_recipient *lrcpt)
{
- rcpt->context = lrcpt;
-
- lrcpt->path = rcpt->path;
- lrcpt->rcpt = rcpt;
- lrcpt->index = index;
+ lrcpt->index = lrcpt->rcpt->index;
lrcpt->rcpt_cmd = NULL;
}
struct client *client,
enum lmtp_recipient_type type,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
-void lmtp_recipient_finish(struct lmtp_recipient *lrcpt,
- struct smtp_server_recipient *rcpt,
- unsigned int index);
+void lmtp_recipient_finish(struct lmtp_recipient *lrcpt);
struct lmtp_recipient *
lmtp_recipient_find_duplicate(struct lmtp_recipient *lrcpt,
return ret;
}
-static void lmtp_local_rcpt_finished(
- struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_transaction *trans,
- struct smtp_server_recipient *rcpt,
- unsigned int index)
+static void
+lmtp_local_rcpt_approved(struct smtp_server_recipient *rcpt,
+ struct lmtp_local_recipient *llrcpt)
{
- struct lmtp_local_recipient *llrcpt = rcpt->context;
struct client *client = llrcpt->rcpt.client;
smtp_server_command_remove_hook(
SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_local_rcpt_cmd_destroy);
- if (!smtp_server_command_replied_success(cmd->cmd)) {
- /* failed in RCPT command; clean up early */
- lmtp_local_rcpt_deinit(llrcpt);
- return;
- }
-
- lmtp_recipient_finish(&llrcpt->rcpt, rcpt, index);
+ lmtp_recipient_finish(&llrcpt->rcpt);
/* resolve duplicate recipient */
llrcpt->duplicate = (struct lmtp_local_recipient *)
- lmtp_recipient_find_duplicate(&llrcpt->rcpt, trans);
+ lmtp_recipient_find_duplicate(&llrcpt->rcpt, rcpt->trans);
i_assert(llrcpt->duplicate == NULL ||
llrcpt->duplicate->duplicate == NULL);
int lmtp_local_rcpt(struct client *client,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data,
+ struct smtp_server_recipient *rcpt,
const char *username, const char *detail)
{
struct smtp_server_connection *conn = cmd->conn;
- const struct smtp_address *address = data->path;
+ const struct smtp_address *address = rcpt->path;
struct smtp_server_transaction *trans;
struct lmtp_local_recipient *llrcpt;
struct mail_storage_service_input input;
llrcpt = i_new(struct lmtp_local_recipient, 1);
lmtp_recipient_init(&llrcpt->rcpt, client,
- LMTP_RECIPIENT_TYPE_LOCAL, cmd, data);
+ LMTP_RECIPIENT_TYPE_LOCAL, cmd, rcpt);
llrcpt->detail = i_strdup(detail);
llrcpt->service_user = service_user;
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_local_rcpt_cmd_destroy, llrcpt);
- data->trans_context = llrcpt;
- data->hook_finished = lmtp_local_rcpt_finished;
+ smtp_server_recipient_add_hook(
+ rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
+ lmtp_local_rcpt_approved, llrcpt);
+ rcpt->context = llrcpt;
if (client->lmtp_set->lmtp_user_concurrency_limit == 0) {
(void)lmtp_local_rcpt_anvil_finish(llrcpt);
int lmtp_local_rcpt(struct client *client,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data,
+ struct smtp_server_recipient *rcpt,
const char *username, const char *detail);
void lmtp_local_add_headers(struct lmtp_local *local,
}
static void
-lmtp_proxy_rcpt_finished(struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_transaction *trans ATTR_UNUSED,
- struct smtp_server_recipient *rcpt,
- unsigned int index)
+lmtp_proxy_rcpt_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED,
+ struct lmtp_proxy_recipient *lprcpt)
{
- struct lmtp_proxy_recipient *lprcpt = rcpt->context;
struct client *client = lprcpt->rcpt.client;
if (lprcpt->rcpt.rcpt_cmd != NULL) {
lmtp_proxy_rcpt_cmd_destroy);
}
- if (!smtp_server_command_replied_success(cmd->cmd)) {
- /* failed in RCPT command; clean up early */
- lmtp_proxy_recipient_deinit(lprcpt);
- return;
- }
-
- lmtp_recipient_finish(&lprcpt->rcpt, rcpt, index);
+ lmtp_recipient_finish(&lprcpt->rcpt);
/* add to local recipients */
array_append(&client->proxy->rcpt_to, &lprcpt, 1);
int lmtp_proxy_rcpt(struct client *client,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data,
+ struct smtp_server_recipient *rcpt,
const char *username, const char *detail,
char delim)
{
struct lmtp_proxy_connection *conn;
struct lmtp_proxy_recipient *lprcpt;
struct smtp_server_transaction *trans;
- struct smtp_address *address = data->path;
+ struct smtp_address *address = rcpt->path;
struct auth_user_info info;
struct mail_storage_service_input input;
const char *const *fields, *errstr, *orig_username = username;
if (client->proxy == NULL)
client->proxy = lmtp_proxy_init(client, trans);
- data->path = smtp_address_clone(cmd->pool, address);
-
conn = lmtp_proxy_get_connection(client->proxy, &set);
pool_unref(&auth_pool);
lprcpt = i_new(struct lmtp_proxy_recipient, 1);
lmtp_recipient_init(&lprcpt->rcpt, client,
- LMTP_RECIPIENT_TYPE_PROXY, cmd, data);
-
+ LMTP_RECIPIENT_TYPE_PROXY, cmd, rcpt);
+ lprcpt->rcpt.path = smtp_address_clone(rcpt->pool, address);
lprcpt->conn = conn;
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
lmtp_proxy_rcpt_cmd_destroy, lprcpt);
- data->trans_context = lprcpt;
- data->hook_finished = lmtp_proxy_rcpt_finished;
+ smtp_server_recipient_add_hook(
+ rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
+ lmtp_proxy_rcpt_approved, lprcpt);
+ rcpt->context = lprcpt;
smtp_client_transaction_add_rcpt(conn->lmtp_trans,
- address, &data->params,
+ address, &rcpt->params,
lmtp_proxy_rcpt_cb, lmtp_proxy_data_cb, lprcpt);
return 1;
}
struct lmtp_proxy *proxy = conn->proxy;
struct smtp_server_cmd_ctx *cmd = proxy->pending_data_cmd;
struct smtp_server_transaction *trans = proxy->trans;
- struct smtp_address *address = lprcpt->rcpt.rcpt->path;
+ struct smtp_address *address = lprcpt->rcpt.path;
const struct smtp_client_transaction_times *times =
smtp_client_transaction_get_times(conn->lmtp_trans);
unsigned int rcpt_index = lprcpt->rcpt.index;
int lmtp_proxy_rcpt(struct client *client,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data,
+ struct smtp_server_recipient *rcpt,
const char *username, const char *detail, char delim);
void lmtp_proxy_data(struct client *client,
struct submission_backend_relay *backend;
struct smtp_server_cmd_ctx *cmd;
- struct smtp_server_cmd_rcpt *data;
+ struct smtp_server_recipient *rcpt;
struct smtp_client_transaction_rcpt *relay_rcpt;
};
static int
backend_relay_cmd_rcpt(struct submission_backend *_backend,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
struct submission_backend_relay *backend =
(struct submission_backend_relay *)_backend;
rcpt_cmd = p_new(cmd->pool, struct relay_cmd_rcpt_context, 1);
rcpt_cmd->backend = backend;
rcpt_cmd->cmd = cmd;
- rcpt_cmd->data = data;
+ rcpt_cmd->rcpt = rcpt;
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED,
relay_cmd_rcpt_replied, rcpt_cmd);
backend->conn, backend_relay_trans_finished, backend);
}
rcpt_cmd->relay_rcpt = smtp_client_transaction_add_rcpt(
- backend->trans, data->path, &data->params,
+ backend->trans, rcpt->path, &rcpt->params,
relay_cmd_rcpt_callback, relay_cmd_rcpt_data_callback,
rcpt_cmd);
return 0;
int submission_backend_cmd_rcpt(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
if (backend->v.cmd_rcpt == NULL) {
/* backend is not interested, respond right away */
return 1;
}
- return backend->v.cmd_rcpt(backend, cmd, data);
+ return backend->v.cmd_rcpt(backend, cmd, rcpt);
}
int submission_backend_cmd_rset(struct submission_backend *backend,
struct smtp_server_cmd_mail *data);
int (*cmd_rcpt)(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
int (*cmd_rset)(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd);
int (*cmd_data)(struct submission_backend *backend,
struct smtp_server_cmd_mail *data);
int submission_backend_cmd_rcpt(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
int submission_backend_cmd_rset(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd);
int submission_backends_cmd_data(struct client *client,
int (*cmd_rcpt)(struct client *client,
struct submission_recipient *srcpt,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
int (*cmd_rset)(struct client *client, struct smtp_server_cmd_ctx *cmd);
int (*cmd_data)(struct client *client,
struct smtp_server_cmd_ctx *cmd,
}
static void
-submission_rcpt_finished(struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_transaction *trans ATTR_UNUSED,
- struct smtp_server_recipient *rcpt,
- unsigned int index)
+cmd_rcpt_approved(struct smtp_server_recipient *rcpt,
+ struct submission_recipient *srcpt)
{
- struct submission_recipient *srcpt = rcpt->context;
-
- smtp_server_command_remove_hook(cmd->cmd,
- SMTP_SERVER_COMMAND_HOOK_DESTROY,
- cmd_rcpt_destroy);
-
- submission_recipient_finished(srcpt, rcpt, index);
+ submission_recipient_finished(srcpt, rcpt, rcpt->index);
}
int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
struct client *client = conn_ctx;
struct submission_recipient *srcpt;
- srcpt = submission_recipient_create(client, data->path);
+ srcpt = submission_recipient_create(client, rcpt->path);
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
cmd_rcpt_destroy, srcpt);
- data->trans_context = srcpt;
- data->hook_finished = submission_rcpt_finished;
+ smtp_server_recipient_add_hook(
+ rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
+ cmd_rcpt_approved, srcpt);
+ rcpt->context = srcpt;
- return client->v.cmd_rcpt(client, srcpt, cmd, data);
+ return client->v.cmd_rcpt(client, srcpt, cmd, rcpt);
}
int client_default_cmd_rcpt(struct client *client ATTR_UNUSED,
struct submission_recipient *srcpt,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data)
+ struct smtp_server_recipient *rcpt)
{
struct smtp_server_transaction *trans;
if (trans != NULL)
submission_backend_trans_start(srcpt->backend, trans);
- return submission_backend_cmd_rcpt(srcpt->backend, cmd, data);
+ return submission_backend_cmd_rcpt(srcpt->backend, cmd, rcpt);
}
/*
*/
int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
int client_default_cmd_rcpt(struct client *client ATTR_UNUSED,
struct submission_recipient *srcpt,
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_rcpt *data);
+ struct smtp_server_recipient *rcpt);
/*
* RSET command