}
/* execute hooks */
- smtp_server_command_call_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY);
+ if (!smtp_server_command_call_hooks(
+ &cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY))
+ i_unreached();
smtp_server_reply_free(cmd);
pool_unref(&cmd->context.pool);
i_assert(found);
}
-void smtp_server_command_call_hooks(struct smtp_server_command *cmd,
+bool smtp_server_command_call_hooks(struct smtp_server_command **_cmd,
enum smtp_server_command_hook_type type)
{
+ struct smtp_server_command *cmd = *_cmd;
struct smtp_server_command_hook *hook;
+ if (type != SMTP_SERVER_COMMAND_HOOK_DESTROY)
+ smtp_server_command_ref(cmd);
+
hook = cmd->hooks_head;
while (hook != NULL) {
struct smtp_server_command_hook *hook_next = hook->next;
hook = hook_next;
}
+
+ if (type != SMTP_SERVER_COMMAND_HOOK_DESTROY) {
+ if (!smtp_server_command_unref(&cmd)) {
+ *_cmd = NULL;
+ return FALSE;
+ }
+ }
+ return TRUE;
}
void smtp_server_command_remove_hooks(struct smtp_server_command *cmd,
{
smtp_server_command_debug(&cmd->context, "Next to reply");
- smtp_server_command_call_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
+ smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
}
static void
smtp_server_command_debug(&cmd->context, "Replied");
- smtp_server_command_call_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED);
+ smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED);
}
void smtp_server_command_completed(struct smtp_server_command *cmd)
smtp_server_command_debug(&cmd->context, "Completed");
- smtp_server_command_call_hooks(cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED);
+ smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED);
}
void smtp_server_command_submit_reply(struct smtp_server_command *cmd)
bool smtp_server_command_unref(struct smtp_server_command **_cmd);
void smtp_server_command_abort(struct smtp_server_command **_cmd);
-void smtp_server_command_call_hooks(struct smtp_server_command *cmd,
+bool smtp_server_command_call_hooks(struct smtp_server_command **_cmd,
enum smtp_server_command_hook_type type);
void smtp_server_command_remove_hooks(struct smtp_server_command *cmd,
enum smtp_server_command_hook_type type);