From 95a89681405e7e77b99b1dc1d3a96e66fd7f7a50 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 7 Oct 2018 17:47:29 +0200 Subject: [PATCH] submission: Start using the new lib-smtp/server recipient pool. --- src/submission/submission-backend-relay.c | 9 +++--- src/submission/submission-backend.c | 4 +-- src/submission/submission-backend.h | 5 +-- src/submission/submission-client.c | 10 +----- src/submission/submission-client.h | 3 +- src/submission/submission-commands.c | 31 +++---------------- src/submission/submission-commands.h | 3 +- src/submission/submission-recipient.c | 37 +++++++++++------------ src/submission/submission-recipient.h | 9 ++---- 9 files changed, 38 insertions(+), 73 deletions(-) diff --git a/src/submission/submission-backend-relay.c b/src/submission/submission-backend-relay.c index 48a6d60e71..0832ba7a8a 100644 --- a/src/submission/submission-backend-relay.c +++ b/src/submission/submission-backend-relay.c @@ -10,6 +10,7 @@ #include "smtp-client-transaction.h" #include "smtp-client-command.h" +#include "submission-recipient.h" #include "submission-backend-relay.h" struct submission_backend_relay { @@ -425,9 +426,9 @@ backend_relay_cmd_mail(struct submission_backend *_backend, struct relay_cmd_rcpt_context { struct submission_backend_relay *backend; + struct submission_recipient *rcpt; struct smtp_server_cmd_ctx *cmd; - struct smtp_server_recipient *rcpt; struct smtp_client_transaction_rcpt *relay_rcpt; }; @@ -476,7 +477,7 @@ relay_cmd_rcpt_callback(const struct smtp_reply *relay_reply, static int backend_relay_cmd_rcpt(struct submission_backend *_backend, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_recipient *rcpt) + struct submission_recipient *srcpt) { struct submission_backend_relay *backend = (struct submission_backend_relay *)_backend; @@ -486,7 +487,7 @@ backend_relay_cmd_rcpt(struct submission_backend *_backend, rcpt_cmd = p_new(cmd->pool, struct relay_cmd_rcpt_context, 1); rcpt_cmd->backend = backend; rcpt_cmd->cmd = cmd; - rcpt_cmd->rcpt = rcpt; + rcpt_cmd->rcpt = srcpt; smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED, relay_cmd_rcpt_replied, rcpt_cmd); @@ -496,7 +497,7 @@ backend_relay_cmd_rcpt(struct submission_backend *_backend, backend->conn, backend_relay_trans_finished, backend); } rcpt_cmd->relay_rcpt = smtp_client_transaction_add_rcpt( - backend->trans, rcpt->path, &rcpt->params, + backend->trans, srcpt->rcpt->path, &srcpt->rcpt->params, relay_cmd_rcpt_callback, relay_cmd_rcpt_data_callback, rcpt_cmd); return 0; diff --git a/src/submission/submission-backend.c b/src/submission/submission-backend.c index 0878428b51..12ec70130b 100644 --- a/src/submission/submission-backend.c +++ b/src/submission/submission-backend.c @@ -177,14 +177,14 @@ int submission_backend_cmd_mail(struct submission_backend *backend, int submission_backend_cmd_rcpt(struct submission_backend *backend, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_recipient *rcpt) + struct submission_recipient *srcpt) { if (backend->v.cmd_rcpt == NULL) { /* backend is not interested, respond right away */ return 1; } - return backend->v.cmd_rcpt(backend, cmd, rcpt); + return backend->v.cmd_rcpt(backend, cmd, srcpt); } int submission_backend_cmd_rset(struct submission_backend *backend, diff --git a/src/submission/submission-backend.h b/src/submission/submission-backend.h index 8e2bc315eb..e3a97bbc01 100644 --- a/src/submission/submission-backend.h +++ b/src/submission/submission-backend.h @@ -1,6 +1,7 @@ #ifndef SUBMISSION_BACKEND_H #define SUBMISSION_BACKEND_H +struct submission_recipient; struct submission_backend; struct submission_backend_vfuncs { @@ -27,7 +28,7 @@ struct submission_backend_vfuncs { struct smtp_server_cmd_mail *data); int (*cmd_rcpt)(struct submission_backend *backend, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_recipient *rcpt); + struct submission_recipient *srcpt); int (*cmd_rset)(struct submission_backend *backend, struct smtp_server_cmd_ctx *cmd); int (*cmd_data)(struct submission_backend *backend, @@ -92,7 +93,7 @@ int submission_backend_cmd_mail(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_recipient *rcpt); + struct submission_recipient *srcpt); int submission_backend_cmd_rset(struct submission_backend *backend, struct smtp_server_cmd_ctx *cmd); int submission_backends_cmd_data(struct client *client, diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index ae67fc600b..4777e760a3 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -358,10 +358,6 @@ static void client_default_trans_free(struct client *client, struct smtp_server_transaction *trans) { - struct submission_recipient **rcptp; - - array_foreach_modifiable(&client->rcpt_to, rcptp) - submission_recipient_destroy(rcptp); array_clear(&client->rcpt_to); submission_backends_trans_free(client, trans); @@ -442,7 +438,6 @@ void client_disconnect(struct client *client, const char *enh_code, const char *reason) { struct smtp_server_connection *conn; - struct submission_recipient **rcptp; if (client->disconnected) return; @@ -451,11 +446,8 @@ void client_disconnect(struct client *client, const char *enh_code, timeout_remove(&client->to_quit); submission_backends_destroy_all(client); - if (array_is_created(&client->rcpt_to)) { - array_foreach_modifiable(&client->rcpt_to, rcptp) - submission_recipient_destroy(rcptp); + if (array_is_created(&client->rcpt_to)) array_clear(&client->rcpt_to); - } if (client->conn != NULL) { const struct smtp_server_stats *stats = diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 2968043549..722177a001 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -37,9 +37,8 @@ struct submission_client_vfuncs { int (*cmd_mail)(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_mail *data); int (*cmd_rcpt)(struct client *client, - struct submission_recipient *srcpt, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_recipient *rcpt); + struct submission_recipient *srcpt); int (*cmd_rset)(struct client *client, struct smtp_server_cmd_ctx *cmd); int (*cmd_data)(struct client *client, struct smtp_server_cmd_ctx *cmd, diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index f44a99223c..5c248a5347 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -144,43 +144,20 @@ int client_default_cmd_mail(struct client *client, * RCPT command */ -static void -cmd_rcpt_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, - struct submission_recipient *srcpt) -{ - submission_recipient_destroy(&srcpt); -} - -static void -cmd_rcpt_approved(struct smtp_server_recipient *rcpt, - struct submission_recipient *srcpt) -{ - submission_recipient_finished(srcpt, rcpt, rcpt->index); -} - int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_recipient *rcpt) { struct client *client = conn_ctx; struct submission_recipient *srcpt; - srcpt = submission_recipient_create(client, rcpt->path); - - smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY, - cmd_rcpt_destroy, srcpt); - - smtp_server_recipient_add_hook( - rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED, - cmd_rcpt_approved, srcpt); - rcpt->context = srcpt; + srcpt = submission_recipient_create(client, rcpt); - return client->v.cmd_rcpt(client, srcpt, cmd, rcpt); + return client->v.cmd_rcpt(client, cmd, srcpt); } int client_default_cmd_rcpt(struct client *client ATTR_UNUSED, - struct submission_recipient *srcpt, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_recipient *rcpt) + struct submission_recipient *srcpt) { struct smtp_server_transaction *trans; @@ -188,7 +165,7 @@ int client_default_cmd_rcpt(struct client *client ATTR_UNUSED, if (trans != NULL) submission_backend_trans_start(srcpt->backend, trans); - return submission_backend_cmd_rcpt(srcpt->backend, cmd, rcpt); + return submission_backend_cmd_rcpt(srcpt->backend, cmd, srcpt); } /* diff --git a/src/submission/submission-commands.h b/src/submission/submission-commands.h index 875ca3e2a9..3fa25cc282 100644 --- a/src/submission/submission-commands.h +++ b/src/submission/submission-commands.h @@ -34,9 +34,8 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, 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_recipient *rcpt); + struct submission_recipient *srcpt); /* * RSET command diff --git a/src/submission/submission-recipient.c b/src/submission/submission-recipient.c index 7bad96b5bb..80bb98a001 100644 --- a/src/submission/submission-recipient.c +++ b/src/submission/submission-recipient.c @@ -8,35 +8,34 @@ struct submission_recipient_module_register submission_recipient_module_register = { 0 }; +static void +submission_recipient_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED, + struct submission_recipient *srcpt); + struct submission_recipient * -submission_recipient_create(struct client *client, struct smtp_address *path) +submission_recipient_create(struct client *client, + struct smtp_server_recipient *rcpt) { struct submission_recipient *srcpt; - pool_t pool; - pool = pool_alloconly_create("submission recipient", 512); - srcpt = p_new(pool, struct submission_recipient, 1); - srcpt->pool = pool; + srcpt = p_new(rcpt->pool, struct submission_recipient, 1); + srcpt->rcpt = rcpt; srcpt->backend = client->state.backend; - srcpt->path = path; - - p_array_init(&srcpt->module_contexts, srcpt->pool, 5); - return srcpt; -} + rcpt->context = srcpt; -void submission_recipient_destroy(struct submission_recipient **_srcpt) -{ - struct submission_recipient *srcpt = *_srcpt; + p_array_init(&srcpt->module_contexts, rcpt->pool, 5); - *_srcpt = NULL; + smtp_server_recipient_add_hook( + rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED, + submission_recipient_approved, srcpt); - pool_unref(&srcpt->pool); + return srcpt; } -void submission_recipient_finished(struct submission_recipient *srcpt, - struct smtp_server_recipient *rcpt, - unsigned int index) +static void +submission_recipient_approved(struct smtp_server_recipient *rcpt, + struct submission_recipient *srcpt) { struct submission_backend *backend = srcpt->backend; struct client *client = backend->client; @@ -44,7 +43,7 @@ void submission_recipient_finished(struct submission_recipient *srcpt, bool backend_found = FALSE; srcpt->path = rcpt->path; - srcpt->index = index; + srcpt->index = rcpt->index; array_append(&client->rcpt_to, &srcpt, 1); diff --git a/src/submission/submission-recipient.h b/src/submission/submission-recipient.h index 1431470412..58add1d183 100644 --- a/src/submission/submission-recipient.h +++ b/src/submission/submission-recipient.h @@ -5,7 +5,7 @@ struct submission_backend; struct client; struct submission_recipient { - pool_t pool; + struct smtp_server_recipient *rcpt; struct submission_backend *backend; @@ -27,10 +27,7 @@ extern struct submission_recipient_module_register submission_recipient_module_register; struct submission_recipient * -submission_recipient_create(struct client *client, struct smtp_address *path); -void submission_recipient_destroy(struct submission_recipient **_srcpt); -void submission_recipient_finished(struct submission_recipient *srcpt, - struct smtp_server_recipient *rcpt, - unsigned int index); +submission_recipient_create(struct client *client, + struct smtp_server_recipient *rcpt); #endif -- 2.47.3