summaryrefslogtreecommitdiffstats
path: root/src/lmtp/lmtp-recipient.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lmtp/lmtp-recipient.c')
-rw-r--r--src/lmtp/lmtp-recipient.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/lmtp/lmtp-recipient.c b/src/lmtp/lmtp-recipient.c
new file mode 100644
index 0000000..aaad29b
--- /dev/null
+++ b/src/lmtp/lmtp-recipient.c
@@ -0,0 +1,57 @@
+/* Copyright (c) 2018 Dovecot authors, see the included COPYING file */
+
+#include "lmtp-common.h"
+#include "array.h"
+#include "smtp-server.h"
+#include "lmtp-recipient.h"
+
+struct lmtp_recipient_module_register
+lmtp_recipient_module_register = { 0 };
+
+struct lmtp_recipient *
+lmtp_recipient_create(struct client *client,
+ struct smtp_server_transaction *trans,
+ struct smtp_server_recipient *rcpt)
+{
+ struct lmtp_recipient *lrcpt;
+
+ lrcpt = p_new(rcpt->pool, struct lmtp_recipient, 1);
+ lrcpt->rcpt = rcpt;
+ lrcpt->client = client;
+
+ rcpt->context = lrcpt;
+
+ p_array_init(&lrcpt->module_contexts, rcpt->pool, 5);
+
+ /* Use a unique session_id for each mail delivery. This is especially
+ important for stats process to not see duplicate sessions. */
+ if (client->state.session_id_seq++ == 0)
+ lrcpt->session_id = trans->id;
+ else {
+ lrcpt->session_id = p_strdup_printf(rcpt->pool, "%s:R%u",
+ trans->id, client->state.session_id_seq);
+ }
+ event_add_str(rcpt->event, "session", lrcpt->session_id);
+
+ return lrcpt;
+}
+
+struct lmtp_recipient *
+lmtp_recipient_find_duplicate(struct lmtp_recipient *lrcpt,
+ struct smtp_server_transaction *trans)
+{
+ struct smtp_server_recipient *drcpt;
+ struct lmtp_recipient *dup_lrcpt;
+
+ i_assert(lrcpt->rcpt != NULL);
+ drcpt = smtp_server_transaction_find_rcpt_duplicate(trans, lrcpt->rcpt);
+ if (drcpt == NULL)
+ return NULL;
+
+ dup_lrcpt = drcpt->context;
+ i_assert(dup_lrcpt->rcpt == drcpt);
+ i_assert(dup_lrcpt->type == lrcpt->type);
+
+ return dup_lrcpt;
+}
+