if (client_open_save_dest_box(cmd, mailbox, &ctx->box) < 0)
ctx->failed = TRUE;
else {
- event_add_str(cmd->event, "mailbox",
+ event_add_str(cmd->global_event, "mailbox",
mailbox_get_vname(ctx->box));
ctx->t = mailbox_transaction_begin(ctx->box,
MAILBOX_TRANSACTION_FLAG_EXTERNAL |
}
box = mailbox_alloc(ns->list, mailbox, 0);
- event_add_str(cmd->event, "mailbox", mailbox_get_vname(box));
+ event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box));
mailbox_set_reason(box, "CREATE");
if (mailbox_create(box, NULL, directory) < 0)
client_send_box_error(cmd, box);
return TRUE;
box = mailbox_alloc(ns->list, name, 0);
- event_add_str(cmd->event, "mailbox", mailbox_get_vname(box));
+ event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box));
mailbox_set_reason(box, "DELETE");
if (mailbox_is_any_inbox(box)) {
/* IMAP protocol allows this, but I think it's safer to
struct mail_namespace *ns, const char *mailbox)
{
ctx->box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_READONLY);
- event_add_str(ctx->cmd->event, "mailbox", mailbox_get_vname(ctx->box));
+ event_add_str(ctx->cmd->global_event, "mailbox",
+ mailbox_get_vname(ctx->box));
mailbox_set_reason(ctx->box, "GETMETADATA");
enum mailbox_existence existence;
new_box = mailbox_alloc(new_ns->list, newname, 0);
mailbox_set_reason(old_box, "RENAME from");
mailbox_set_reason(new_box, "RENAME to");
- event_add_str(cmd->event, "old_mailbox", mailbox_get_vname(old_box));
- event_add_str(cmd->event, "new_mailbox", mailbox_get_vname(new_box));
+ event_add_str(cmd->global_event, "old_mailbox",
+ mailbox_get_vname(old_box));
+ event_add_str(cmd->global_event, "new_mailbox",
+ mailbox_get_vname(new_box));
if (mailbox_rename(old_box, new_box) < 0)
client_send_box_error(cmd, old_box);
else
/* open mailbox */
box = mailbox_alloc(ns->list, mailbox, flags);
- event_add_str(cmd->event, "mailbox", mailbox_get_vname(box));
+ event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box));
mailbox_set_reason(box, "RESETKEY");
if (mailbox_open(box) < 0) {
client_send_box_error(cmd, box);
else
flags |= MAILBOX_FLAG_DROP_RECENT;
ctx->box = mailbox_alloc(ctx->ns->list, mailbox, flags);
- event_add_str(ctx->cmd->event, "mailbox", mailbox_get_vname(ctx->box));
+ event_add_str(ctx->cmd->global_event, "mailbox",
+ mailbox_get_vname(ctx->box));
mailbox_set_reason(ctx->box, readonly ? "EXAMINE" : "SELECT");
if (mailbox_open(ctx->box) < 0) {
client_send_box_error(ctx->cmd, ctx->box);
return TRUE;
}
}
- event_add_str(ctx->cmd->event, "mailbox", mailbox_get_vname(ctx->box));
+ event_add_str(ctx->cmd->global_event, "mailbox",
+ mailbox_get_vname(ctx->box));
ctx->trans = imap_metadata_transaction_begin(ctx->box);
return cmd_setmetadata_start(ctx);
}
if (ns == NULL)
return TRUE;
- event_add_str(cmd->event, "mailbox", mailbox);
+ event_add_str(cmd->global_event, "mailbox", mailbox);
selected_mailbox = client->mailbox != NULL &&
mailbox_equals(client->mailbox, ns, mailbox);
if (imap_status_get(cmd, ns, mailbox, &items, &result) < 0) {
return TRUE;
box = mailbox_alloc(ns->list, mailbox, 0);
- event_add_str(cmd->event, "mailbox", mailbox_get_vname(box));
+ event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box));
mailbox_set_reason(box, subscribe ? "SUBSCRIBE" : "UNSUBSCRIBE");
if (subscribe) {
if (!subscribe_is_valid_name(cmd, box)) {
cmd = p_new(client->command_pool, struct client_command_context, 1);
cmd->client = client;
cmd->pool = client->command_pool;
- cmd->event = event_create(client->event);
+ cmd->global_event = event_create(client->event);
+ cmd->event = event_create(cmd->global_event);
cmd->stats.start_time = ioloop_timeval;
cmd->stats.last_run_timeval = ioloop_timeval;
cmd->stats.start_ioloop_wait_usecs =
e_debug(cmd->event, "Command finished: %s %s", cmd->name,
cmd->human_args != NULL ? cmd->human_args : "");
event_unref(&cmd->event);
+ event_unref(&cmd->global_event);
if (cmd->parser != NULL) {
if (client->free_parser == NULL) {
cmd->func = command->func;
cmd->cmd_flags = command->flags;
/* valid command - overwrite the "unknown" string set earlier */
+ event_add_str(cmd->global_event, "cmd_name", command->name);
+ event_strlist_append(cmd->global_event, "reason_code",
+ event_reason_code_prefix("imap", "cmd_", command->name));
event_add_str(cmd->event, "cmd_name", command->name);
if (client_command_is_ambiguous(cmd)) {
/* do nothing until existing commands are finished */
struct client_command_context *prev, *next;
struct client *client;
struct event *event;
+ /* global_event is pushed to the global event stack while the command
+ is running. It has only the minimal fields that are actually wanted
+ to be in all the events while it's being run. */
+ struct event *global_event;
pool_t pool;
/* IMAP command tag */
bool client_verify_open_mailbox(struct client_command_context *cmd)
{
if (cmd->client->mailbox != NULL) {
- event_add_str(cmd->event, "mailbox",
+ event_add_str(cmd->global_event, "mailbox",
mailbox_get_vname(cmd->client->mailbox));
return TRUE;
} else {
io_loop_time_refresh();
command_stats_start(cmd);
- event_push_global(cmd->event);
+ event_push_global(cmd->global_event);
cmd->executing = TRUE;
array_foreach(&command_hooks, hook)
hook->pre(cmd);
array_foreach(&command_hooks, hook)
hook->post(cmd);
cmd->executing = FALSE;
- event_pop_global(cmd->event);
+ event_pop_global(cmd->global_event);
if (cmd->state == CLIENT_COMMAND_STATE_DONE)
finished = TRUE;