/* execute hooks */
if (!smtp_server_command_call_hooks(
- &cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY))
+ &cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY, TRUE))
i_unreached();
smtp_server_reply_free(cmd);
}
bool smtp_server_command_call_hooks(struct smtp_server_command **_cmd,
- enum smtp_server_command_hook_type type)
+ enum smtp_server_command_hook_type type,
+ bool remove)
{
struct smtp_server_command *cmd = *_cmd;
struct smtp_server_command_hook *hook;
struct smtp_server_command_hook *hook_next = hook->next;
if (hook->type == type) {
- DLLIST2_REMOVE(&cmd->hooks_head, &cmd->hooks_tail,
- hook);
+ if (remove) {
+ DLLIST2_REMOVE(&cmd->hooks_head,
+ &cmd->hooks_tail, hook);
+ }
hook->func(&cmd->context, hook->context);
}
e_debug(cmd->context.event, "Next to reply");
return smtp_server_command_call_hooks(
- _cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
+ _cmd, SMTP_SERVER_COMMAND_HOOK_NEXT, TRUE);
}
static bool
e_debug(cmd->context.event, "Replied");
return smtp_server_command_call_hooks(
- _cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED);
+ _cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED, TRUE);
}
bool smtp_server_command_completed(struct smtp_server_command **_cmd)
e_debug(cmd->context.event, "Completed");
return smtp_server_command_call_hooks(
- _cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED);
+ _cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED, TRUE);
}
static bool
void smtp_server_command_abort(struct smtp_server_command **_cmd);
bool smtp_server_command_call_hooks(struct smtp_server_command **_cmd,
- enum smtp_server_command_hook_type type);
+ enum smtp_server_command_hook_type type,
+ bool remove);
void smtp_server_command_remove_hooks(struct smtp_server_command *cmd,
enum smtp_server_command_hook_type type);