#include "smtp-server-private.h"
-static void
-smtp_server_recipient_call_hooks(struct smtp_server_recipient *rcpt,
+static bool
+smtp_server_recipient_call_hooks(struct smtp_server_recipient **_rcpt,
enum smtp_server_recipient_hook_type type);
struct smtp_server_recipient *
return TRUE;
prcpt->destroying = TRUE;
- smtp_server_recipient_call_hooks(
- rcpt, SMTP_SERVER_RECIPIENT_HOOK_DESTROY);
+ if (!smtp_server_recipient_call_hooks(
+ &rcpt, SMTP_SERVER_RECIPIENT_HOOK_DESTROY))
+ i_unreached();
pool_unref(&rcpt->pool);
return FALSE;
smtp_server_recipient_unref(_rcpt);
}
-void smtp_server_recipient_approved(struct smtp_server_recipient *rcpt)
+bool smtp_server_recipient_approved(struct smtp_server_recipient **_rcpt)
{
+ struct smtp_server_recipient *rcpt = *_rcpt;
struct smtp_server_transaction *trans = rcpt->conn->state.trans;
i_assert(trans != NULL);
rcpt->cmd = NULL;
smtp_server_transaction_add_rcpt(trans, rcpt);
- smtp_server_recipient_call_hooks(
- rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED);
+ return smtp_server_recipient_call_hooks(
+ _rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED);
}
void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
i_assert(found);
}
-static void
-smtp_server_recipient_call_hooks(struct smtp_server_recipient *rcpt,
+static bool
+smtp_server_recipient_call_hooks(struct smtp_server_recipient **_rcpt,
enum smtp_server_recipient_hook_type type)
{
+ struct smtp_server_recipient *rcpt = *_rcpt;
struct smtp_server_recipient_private *prcpt =
(struct smtp_server_recipient_private *)rcpt;
struct smtp_server_recipient_hook *hook;
+ if (type != SMTP_SERVER_RECIPIENT_HOOK_DESTROY)
+ smtp_server_recipient_ref(rcpt);
+
hook = prcpt->hooks_head;
while (hook != NULL) {
struct smtp_server_recipient_hook *hook_next = hook->next;
hook = hook_next;
}
+
+ if (type != SMTP_SERVER_RECIPIENT_HOOK_DESTROY) {
+ if (!smtp_server_recipient_unref(&rcpt)) {
+ *_rcpt = NULL;
+ return FALSE;
+ }
+ }
+ return TRUE;
}