diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 5c555a0ca9..47c3355395 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -569,7 +569,7 @@ static int imapc_list_refresh(struct imapc_mailbox_list *list) mailbox_tree_deinit(&list->mailboxes); list->mailboxes = mailbox_tree_init(mail_namespace_get_sep(list->list.ns)); mailbox_tree_set_parents_nonexistent(list->mailboxes); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); if ((list->list.ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) { /* INBOX always exists in IMAP server. since this namespace is @@ -803,7 +803,7 @@ imapc_list_subscriptions_refresh(struct mailbox_list *_src_list, pattern = t_strdup_printf("%s*", src_list->set->imapc_list_prefix); imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE); imapc_command_sendf(cmd, "LSUB \"\" %s", pattern); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); if (ctx.ret < 0) return -1; @@ -830,7 +830,7 @@ static int imapc_list_set_subscribed(struct mailbox_list *_list, imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE); imapc_command_sendf(cmd, set ? "SUBSCRIBE %s" : "UNSUBSCRIBE %s", imapc_list_to_remote(list, name)); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); return ctx.ret; } @@ -858,13 +858,13 @@ imapc_list_delete_mailbox(struct mailbox_list *_list, const char *name) imapc_command_sendf(cmd, "UNSELECT"); else imapc_command_sendf(cmd, "SELECT \"~~~\""); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); } cmd = imapc_list_simple_context_init(&ctx, list); imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE); imapc_command_sendf(cmd, "DELETE %s", imapc_list_to_remote(list, name)); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); if (fs_list != NULL && ctx.ret == 0) { name = imapc_list_get_fs_name(list, name); @@ -913,7 +913,7 @@ imapc_list_rename_mailbox(struct mailbox_list *oldlist, const char *oldname, imapc_command_sendf(cmd, "RENAME %s %s", imapc_list_to_remote(list, oldname), imapc_list_to_remote(list, newname)); - imapc_simple_run(&ctx); + imapc_simple_run(&ctx, &cmd); if (ctx.ret == 0 && fs_list != NULL && oldlist == newlist) { oldname = imapc_list_get_fs_name(list, oldname); newname = imapc_list_get_fs_name(list, newname); diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 7b4a5c9f30..81da123053 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -117,12 +117,15 @@ void imapc_simple_context_init(struct imapc_simple_context *sctx, sctx->ret = -2; } -void imapc_simple_run(struct imapc_simple_context *sctx) +void imapc_simple_run(struct imapc_simple_context *sctx, + struct imapc_command **cmd) { if (imapc_storage_client_handle_auth_failure(sctx->client)) { + imapc_command_abort(cmd); imapc_client_logout(sctx->client->client); sctx->ret = -1; } + *cmd = NULL; while (sctx->ret == -2) imapc_client_run(sctx->client->client); } @@ -179,7 +182,7 @@ void imapc_mailbox_noop(struct imapc_mailbox *mbox) cmd = imapc_client_mailbox_cmd(mbox->client_box, imapc_simple_callback, &sctx); imapc_command_send(cmd, "NOOP"); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); } static void @@ -835,7 +838,7 @@ imapc_mailbox_create(struct mailbox *box, cmd = imapc_client_cmd(mbox->storage->client->client, imapc_simple_callback, &sctx); imapc_command_sendf(cmd, "CREATE %s", name); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); return sctx.ret; } @@ -1005,7 +1008,7 @@ static int imapc_mailbox_run_status(struct mailbox *box, imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE); imapc_command_sendf(cmd, "STATUS %s (%1s)", imapc_mailbox_get_remote_name(mbox), str_c(str)+1); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); mbox->storage->cur_status_box = NULL; mbox->storage->cur_status = NULL; return sctx.ret; @@ -1065,7 +1068,7 @@ static int imapc_mailbox_get_namespaces(struct imapc_mailbox *mbox) imapc_simple_callback, &sctx); imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_RETRIABLE); imapc_command_send(cmd, "NAMESPACE"); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); if (sctx.ret < 0) return -1; diff --git a/src/lib-storage/index/imapc/imapc-storage.h b/src/lib-storage/index/imapc/imapc-storage.h index d23a90b2d4..10d1ea4e2a 100644 --- a/src/lib-storage/index/imapc/imapc-storage.h +++ b/src/lib-storage/index/imapc/imapc-storage.h @@ -188,7 +188,8 @@ void imapc_copy_error_from_reply(struct imapc_storage *storage, const struct imapc_command_reply *reply); void imapc_simple_context_init(struct imapc_simple_context *sctx, struct imapc_storage_client *client); -void imapc_simple_run(struct imapc_simple_context *sctx); +void imapc_simple_run(struct imapc_simple_context *sctx, + struct imapc_command **cmd); void imapc_simple_callback(const struct imapc_command_reply *reply, void *context); int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox, diff --git a/src/plugins/quota/quota-imapc.c b/src/plugins/quota/quota-imapc.c index 59a11726b2..f75fa09cd9 100644 --- a/src/plugins/quota/quota-imapc.c +++ b/src/plugins/quota/quota-imapc.c @@ -310,7 +310,7 @@ static int imapc_quota_refresh_mailbox(struct imapc_quota_root *root, cmd = imapc_client_cmd(root->client->client, imapc_simple_callback, &sctx); imapc_command_sendf(cmd, "GETQUOTAROOT %s", root->box_name); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); /* if there are multiple quota roots, use the first one returned by the QUOTAROOT */ @@ -342,7 +342,7 @@ static int imapc_quota_refresh_root(struct imapc_quota_root *root, cmd = imapc_client_cmd(root->client->client, imapc_simple_callback, &sctx); imapc_command_sendf(cmd, "GETQUOTA %s", root->root_name); - imapc_simple_run(&sctx); + imapc_simple_run(&sctx, &cmd); /* there shouldn't be more than one QUOTA reply, but ignore anyway anything we didn't expect. */