Allows associating context with recipients in future changes.
submission_SOURCES = \
main.c \
submission-backend-relay.c \
+ submission-recipient.c \
submission-client.c \
submission-commands.c \
submission-settings.c
submission-backend.h \
submission-backend-relay.h \
submission-commands.h \
+ submission-recipient.h \
submission-client.h \
submission-settings.h
#include "imap-urlauth.h"
#include "submission-backend-relay.h"
+#include "submission-recipient.h"
#include "submission-commands.h"
#include "submission-settings.h"
client->set = set;
client->session_id = i_strdup(session_id);
+ i_array_init(&client->rcpt_to, 8);
+
i_zero(&smtp_set);
smtp_set.hostname = set->hostname;
smtp_set.login_greeting = set->login_greeting;
client_disconnect(client, prefix, reason);
+ array_free(&client->rcpt_to);
+
submission_client_count--;
DLLIST_REMOVE(&submission_clients, client);
struct smtp_server_transaction *trans ATTR_UNUSED)
{
struct client *client = context;
+ struct submission_recipient **rcptp;
+
+ array_foreach_modifiable(&client->rcpt_to, rcptp)
+ submission_recipient_destroy(rcptp);
+ array_clear(&client->rcpt_to);
client_state_reset(client);
}
const char *reason)
{
struct smtp_server_connection *conn;
+ struct submission_recipient **rcptp;
if (client->disconnected)
return;
timeout_remove(&client->to_quit);
client_proxy_destroy(client);
+ if (array_is_created(&client->rcpt_to)) {
+ array_foreach_modifiable(&client->rcpt_to, rcptp)
+ submission_recipient_destroy(rcptp);
+ array_clear(&client->rcpt_to);
+ }
+
if (client->conn != NULL) {
const struct smtp_server_stats *stats =
smtp_server_connection_get_stats(client->conn);
struct smtp_reply;
+struct submission_recipient;
struct client;
struct client_state {
struct smtp_server_connection *conn;
enum smtp_server_state last_state;
struct client_state state;
+ ARRAY(struct submission_recipient *) rcpt_to;
struct mail_storage_service_user *service_user;
struct mail_user *user;
#include "smtp-client.h"
#include "smtp-client-connection.h"
+#include "submission-recipient.h"
#include "submission-commands.h"
#include "submission-backend-relay.h"
* RCPT command
*/
+static void
+cmd_rcpt_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
+ struct submission_recipient *rcpt)
+{
+ submission_recipient_destroy(&rcpt);
+}
+
+static void
+submission_rcpt_finished(struct smtp_server_cmd_ctx *cmd,
+ struct smtp_server_transaction *trans ATTR_UNUSED,
+ struct smtp_server_recipient *trcpt,
+ unsigned int index)
+{
+ struct submission_recipient *rcpt = trcpt->context;
+
+ smtp_server_command_remove_hook(cmd->cmd,
+ SMTP_SERVER_COMMAND_HOOK_DESTROY,
+ cmd_rcpt_destroy);
+
+ submission_recipient_finished(rcpt, trcpt, index);
+}
+
int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
struct smtp_server_cmd_rcpt *data)
{
struct client *client = conn_ctx;
+ struct submission_recipient *rcpt;
+
+ rcpt = submission_recipient_create(client, data->path);
+
+ smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
+ cmd_rcpt_destroy, rcpt);
+
+ data->trans_context = rcpt;
+ data->hook_finished = submission_rcpt_finished;
return cmd_rcpt_relay(client, cmd, data);
}
--- /dev/null
+/* Copyright (c) 2018 Dovecot authors, see the included COPYING file */
+
+#include "submission-common.h"
+
+#include "submission-recipient.h"
+
+struct submission_recipient *
+submission_recipient_create(struct client *client, struct smtp_address *path)
+{
+ struct submission_recipient *rcpt;
+
+ rcpt = i_new(struct submission_recipient, 1);
+ rcpt->client = client;
+ rcpt->path = path;
+
+ return rcpt;
+}
+
+void submission_recipient_destroy(struct submission_recipient **_rcpt)
+{
+ struct submission_recipient *rcpt = *_rcpt;
+
+ *_rcpt = NULL;
+
+ i_free(rcpt);
+}
+
+void submission_recipient_finished(struct submission_recipient *rcpt,
+ struct smtp_server_recipient *trcpt,
+ unsigned int index)
+{
+ struct client *client = rcpt->client;
+
+ rcpt->path = trcpt->path;
+ rcpt->index = index;
+
+ array_append(&client->rcpt_to, &rcpt, 1);
+}
--- /dev/null
+#ifndef SUBMISSION_RECIPIENT_H
+#define SUBMISSION_RECIPIENT_H
+
+struct client;
+
+struct submission_recipient {
+ struct client *client;
+
+ struct smtp_address *path;
+ unsigned int index;
+};
+
+struct submission_recipient *
+submission_recipient_create(struct client *client, struct smtp_address *path);
+void submission_recipient_destroy(struct submission_recipient **_rcpt);
+void submission_recipient_finished(struct submission_recipient *rcpt,
+ struct smtp_server_recipient *trcpt,
+ unsigned int index);
+
+#endif