#include "smtp-client-transaction.h"
#include "smtp-client-command.h"
+#include "submission-recipient.h"
#include "submission-backend-relay.h"
struct submission_backend_relay {
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;
};
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;
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);
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;
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,
#ifndef SUBMISSION_BACKEND_H
#define SUBMISSION_BACKEND_H
+struct submission_recipient;
struct submission_backend;
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,
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,
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);
const char *reason)
{
struct smtp_server_connection *conn;
- struct submission_recipient **rcptp;
if (client->disconnected)
return;
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 =
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,
* 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;
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);
}
/*
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
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;
bool backend_found = FALSE;
srcpt->path = rcpt->path;
- srcpt->index = index;
+ srcpt->index = rcpt->index;
array_append(&client->rcpt_to, &srcpt, 1);
struct client;
struct submission_recipient {
- pool_t pool;
+ struct smtp_server_recipient *rcpt;
struct submission_backend *backend;
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