]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: Start using the new lib-smtp/server recipient pool.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 7 Oct 2018 15:47:29 +0000 (17:47 +0200)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 11 Oct 2018 12:57:36 +0000 (14:57 +0200)
src/submission/submission-backend-relay.c
src/submission/submission-backend.c
src/submission/submission-backend.h
src/submission/submission-client.c
src/submission/submission-client.h
src/submission/submission-commands.c
src/submission/submission-commands.h
src/submission/submission-recipient.c
src/submission/submission-recipient.h

index 48a6d60e719469ece920100e076a62911da9bd49..0832ba7a8a908e5959e0a96c05993d47e79f9b08 100644 (file)
@@ -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;
index 0878428b51ef759bd420a4b807a938c8340e99bf..12ec70130b60154976a820be70de031b4615b1eb 100644 (file)
@@ -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,
index 8e2bc315eb093c061cc767a36115d1b3f2dff976..e3a97bbc010538911d661a9ab402eedcb7ce3400 100644 (file)
@@ -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,
index ae67fc600b0d96824a1a13b008b56f301cc5db1a..4777e760a3bc84919d62d78b014edde7e76026e7 100644 (file)
@@ -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 =
index 2968043549cd8c2c329f254f5e80c544d51a87ff..722177a00198595e43cbd1eabd771ca7c49a4a8d 100644 (file)
@@ -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,
index f44a99223c73dd5fd94428371005aebe2bb420ad..5c248a534715f9f46d2ebed32c3f10dc6988aa5e 100644 (file)
@@ -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);
 }
 
 /*
index 875ca3e2a925d6f9d393ed180be58bc6c5f28461..3fa25cc28283b174f50d141da4261e096496c60a 100644 (file)
@@ -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
index 7bad96b5bb1189a7fbf53c17d9c13fcdb0028b5d..80bb98a001105c748bb81a02daa80c6adf6df921 100644 (file)
@@ -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);
 
index 14314704122e4fce9abaa75640b45ba58d865dae..58add1d183cdf8b2e661c4edc35c7fd37c6a6322 100644 (file)
@@ -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