struct mail_user *rcpt_user;
};
-static void
-lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt);
-
/*
* LMTP local
*/
void lmtp_local_deinit(struct lmtp_local **_local)
{
struct lmtp_local *local = *_local;
- struct lmtp_local_recipient *const *llrcptp;
*_local = NULL;
- if (array_is_created(&local->rcpt_to)) {
- array_foreach_modifiable(&local->rcpt_to, llrcptp)
- lmtp_local_rcpt_deinit(*llrcptp);
+ if (array_is_created(&local->rcpt_to))
array_free(&local->rcpt_to);
- }
if (local->raw_mail != NULL) {
struct mailbox_transaction_context *raw_trans =
}
static void
-lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt)
+lmtp_local_rcpt_destroy(struct smtp_server_recipient *rcpt ATTR_UNUSED,
+ struct lmtp_local_recipient *llrcpt)
{
if (llrcpt->anvil_query != NULL)
anvil_client_query_abort(anvil, &llrcpt->anvil_query);
lmtp_local_rcpt_anvil_disconnect(llrcpt);
mail_storage_service_user_unref(&llrcpt->service_user);
-
- i_free(llrcpt->session_id);
- i_free(llrcpt->detail);
- i_free(llrcpt);
}
static void
struct lda_settings *lda_set =
mail_storage_service_user_get_set(llrcpt->service_user)[2];
- i_assert(rcpt_idx == 0 || llrcpt->rcpt.rcpt_cmd == NULL);
-
if (lda_set->quota_full_tempfail) {
smtp_server_reply_index(cmd, rcpt_idx, 452, "4.2.2", "<%s> %s",
smtp_address_encode(address), error);
* RCPT command
*/
-static void
-lmtp_local_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct lmtp_local_recipient *llrcpt)
-{
- /* failed in RCPT command; clean up early */
- lmtp_local_rcpt_deinit(llrcpt);
- return;
-}
-
static int
lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *llrcpt)
{
{
struct client *client = llrcpt->rcpt.client;
- smtp_server_command_remove_hook(
- llrcpt->rcpt.rcpt_cmd->cmd,
- SMTP_SERVER_COMMAND_HOOK_DESTROY,
- lmtp_local_rcpt_cmd_destroy);
-
lmtp_recipient_finish(&llrcpt->rcpt);
/* resolve duplicate recipient */
struct smtp_server_cmd_ctx *cmd = llrcpt->rcpt.rcpt_cmd;
int ret;
- if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0) {
- lmtp_local_rcpt_deinit(llrcpt);
+ if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0)
return FALSE;
- }
smtp_server_reply(cmd, 250, "2.1.5", "OK");
return TRUE;
if (client->local == NULL)
client->local = lmtp_local_init(client);
- llrcpt = i_new(struct lmtp_local_recipient, 1);
+ llrcpt = p_new(rcpt->pool, struct lmtp_local_recipient, 1);
lmtp_recipient_init(&llrcpt->rcpt, client,
LMTP_RECIPIENT_TYPE_LOCAL, cmd, rcpt);
- llrcpt->detail = i_strdup(detail);
+ llrcpt->detail = p_strdup(rcpt->pool, detail);
llrcpt->service_user = service_user;
- llrcpt->session_id = i_strdup(session_id);
-
- smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
- lmtp_local_rcpt_cmd_destroy, llrcpt);
+ llrcpt->session_id = p_strdup(rcpt->pool, session_id);
+ smtp_server_recipient_add_hook(
+ rcpt, SMTP_SERVER_RECIPIENT_HOOK_DESTROY,
+ lmtp_local_rcpt_destroy, llrcpt);
smtp_server_recipient_add_hook(
rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
lmtp_local_rcpt_approved, llrcpt);
return proxy;
}
-static void
-lmtp_proxy_recipient_deinit(struct lmtp_proxy_recipient *lprcpt)
-{
- i_free(lprcpt);
-}
-
static void
lmtp_proxy_connection_deinit(struct lmtp_proxy_connection *conn)
{
void lmtp_proxy_deinit(struct lmtp_proxy **_proxy)
{
struct lmtp_proxy *proxy = *_proxy;
- struct lmtp_proxy_recipient *const *lprcpts;
struct lmtp_proxy_connection *const *conns;
*_proxy = NULL;
- array_foreach(&proxy->rcpt_to, lprcpts)
- lmtp_proxy_recipient_deinit(*lprcpts);
-
array_foreach(&proxy->connections, conns)
lmtp_proxy_connection_deinit(*conns);
return TRUE;
}
-static void
-lmtp_proxy_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
- struct lmtp_proxy_recipient *lprcpt)
-{
- lmtp_proxy_recipient_deinit(lprcpt);
-}
-
static void
lmtp_proxy_rcpt_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED,
struct lmtp_proxy_recipient *lprcpt)
{
struct client *client = lprcpt->rcpt.client;
- if (lprcpt->rcpt.rcpt_cmd != NULL) {
- smtp_server_command_remove_hook(
- lprcpt->rcpt.rcpt_cmd->cmd,
- SMTP_SERVER_COMMAND_HOOK_DESTROY,
- lmtp_proxy_rcpt_cmd_destroy);
- }
-
lmtp_recipient_finish(&lprcpt->rcpt);
- /* add to local recipients */
+ /* add to proxy recipients */
array_append(&client->proxy->rcpt_to, &lprcpt, 1);
}
conn = lmtp_proxy_get_connection(client->proxy, &set);
pool_unref(&auth_pool);
- lprcpt = i_new(struct lmtp_proxy_recipient, 1);
+ lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1);
lmtp_recipient_init(&lprcpt->rcpt, client,
LMTP_RECIPIENT_TYPE_PROXY, cmd, rcpt);
lprcpt->rcpt.path = smtp_address_clone(rcpt->pool, address);
lprcpt->conn = conn;
- smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY,
- lmtp_proxy_rcpt_cmd_destroy, lprcpt);
-
smtp_server_recipient_add_hook(
rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
lmtp_proxy_rcpt_approved, lprcpt);