$(smtp_server_cmds) \
smtp-server-reply.c \
smtp-server-command.c \
+ smtp-server-recipient.c \
smtp-server-transaction.c \
smtp-server-connection.c \
smtp-server.c \
}
/* success */
- rcpt = smtp_server_transaction_add_rcpt(trans, data->path,
- &data->params);
+ rcpt = smtp_server_recipient_create(conn, data->path);
+ smtp_params_rcpt_copy(rcpt->pool, &rcpt->params, &data->params);
rcpt->context = data->trans_context;
+ smtp_server_recipient_approved(rcpt);
+
if (data->hook_finished != NULL) {
data->hook_finished(cmd, trans, rcpt,
array_count(&trans->rcpt_to) - 1);
void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn,
const struct smtp_proxy_data *proxy_data);
+/*
+ * Recipient
+ */
+
+struct smtp_server_recipient *
+smtp_server_recipient_create(struct smtp_server_connection *conn,
+ const struct smtp_address *rcpt_to);
+void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt);
+
+void smtp_server_recipient_approved(struct smtp_server_recipient *rcpt);
+
/*
* Transaction
*/
const struct timeval *timestamp);
void smtp_server_transaction_free(struct smtp_server_transaction **_trans);
-struct smtp_server_recipient *
-smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
- const struct smtp_address *rcpt_to,
- const struct smtp_params_rcpt *params);
+void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
+ struct smtp_server_recipient *rcpt);
bool smtp_server_transaction_has_rcpt(struct smtp_server_transaction *trans);
unsigned int
smtp_server_transaction_rcpt_count(struct smtp_server_transaction *trans);
--- /dev/null
+/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "smtp-address.h"
+
+#include "smtp-server-private.h"
+
+struct smtp_server_recipient *
+smtp_server_recipient_create(struct smtp_server_connection *conn,
+ const struct smtp_address *rcpt_to)
+{
+ struct smtp_server_recipient *rcpt;
+ pool_t pool;
+
+ pool = pool_alloconly_create("smtp server recipient", 512);
+ rcpt = p_new(pool, struct smtp_server_recipient, 1);
+ rcpt->pool = pool;
+ rcpt->conn = conn;
+ rcpt->path = smtp_address_clone(pool, rcpt_to);
+
+ return rcpt;
+}
+
+void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt)
+{
+ struct smtp_server_recipient *rcpt = *_rcpt;
+
+ *_rcpt = NULL;
+
+ if (rcpt == NULL)
+ return;
+
+ pool_unref(&rcpt->pool);
+}
+
+void smtp_server_recipient_approved(struct smtp_server_recipient *rcpt)
+{
+ struct smtp_server_transaction *trans = rcpt->conn->state.trans;
+
+ i_assert(trans != NULL);
+
+ smtp_server_transaction_add_rcpt(trans, rcpt);
+}
void smtp_server_transaction_free(struct smtp_server_transaction **_trans)
{
struct smtp_server_transaction *trans = *_trans;
+ struct smtp_server_recipient **rcptp;
+
+ if (array_is_created(&trans->rcpt_to)) {
+ array_foreach_modifiable(&trans->rcpt_to, rcptp)
+ smtp_server_recipient_destroy(rcptp);
+ }
pool_unref(&trans->pool);
*_trans = NULL;
return NULL;
}
-struct smtp_server_recipient *
-smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
- const struct smtp_address *rcpt_to,
- const struct smtp_params_rcpt *params)
+void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
+ struct smtp_server_recipient *rcpt)
{
- struct smtp_server_recipient *rcpt;
-
- rcpt = p_new(trans->pool, struct smtp_server_recipient, 1);
- rcpt->path = smtp_address_clone(trans->pool, rcpt_to);
- smtp_params_rcpt_copy(trans->pool, &rcpt->params, params);
-
if (!array_is_created(&trans->rcpt_to))
p_array_init(&trans->rcpt_to, trans->pool, 8);
- array_append(&trans->rcpt_to, &rcpt, 1);
+ rcpt->trans = trans;
- return rcpt;
+ array_append(&trans->rcpt_to, &rcpt, 1);
}
bool smtp_server_transaction_has_rcpt(struct smtp_server_transaction *trans)
};
/*
- * Transaction
+ * Recipient
*/
struct smtp_server_recipient {
+ pool_t pool;
+ struct smtp_server_connection *conn;
+ struct smtp_server_transaction *trans;
+
struct smtp_address *path;
struct smtp_params_rcpt params;
};
ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *);
+/*
+ * Transaction
+ */
+
struct smtp_server_transaction {
pool_t pool;
struct smtp_server_connection *conn;