bool by_msgid;
};
-static int cmd_deduplicate_uidlist(struct mailbox *box, struct uidlist *uidlist)
+static int cmd_deduplicate_uidlist(struct doveadm_mail_cmd_context *_ctx,
+ struct mailbox *box, struct uidlist *uidlist)
{
struct mailbox_transaction_context *trans;
struct mail_search_context *search_ctx;
while (mailbox_search_next(search_ctx, &mail))
mail_expunge(mail);
- if (mailbox_search_deinit(&search_ctx) < 0)
+ if (mailbox_search_deinit(&search_ctx) < 0) {
+ doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
- if (mailbox_transaction_commit(&trans) < 0)
+ }
+ if (mailbox_transaction_commit(&trans) < 0) {
+ doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
+ }
return ret;
}
continue;
i_error("Couldn't lookup Message-ID: for UID=%u: %s",
mail->uid, errstr);
+ doveadm_mail_failed_error(_ctx, error);
ret = -1;
break;
}
continue;
i_error("Couldn't lookup GUID: for UID=%u: %s",
mail->uid, errstr);
+ doveadm_mail_failed_error(_ctx, error);
ret = -1;
break;
}
iter = hash_table_iterate_init(hash);
while (hash_table_iterate(iter, hash, &key, &value)) {
T_BEGIN {
- if (cmd_deduplicate_uidlist(box, value) < 0)
+ if (cmd_deduplicate_uidlist(_ctx, box, value) < 0)
ret = -1;
} T_END;
}
if (mailbox_open(box) < 0) {
i_error("Failed to open mailbox: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
mailbox_free(&box);
return -1;
}
if (ret < 0) {
i_error("Failed to set attribute: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
mailbox_transaction_rollback(&trans);
} else if (mailbox_transaction_commit(&trans) < 0) {
i_error("Failed to commit transaction: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
}
if (mailbox_open(box) < 0) {
i_error("Failed to open mailbox: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
mailbox_free(&box);
return -1;
}
if (ret < 0) {
i_error("Failed to get attribute: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
} else if (ret == 0) {
/* not found, print as empty */
doveadm_print("");
if (mailbox_open(box) < 0) {
i_error("Failed to open mailbox: %s",
mailbox_get_last_error(box, NULL));
+ doveadm_mail_failed_mailbox(_ctx, box);
mailbox_free(&box);
return -1;
}
if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_PRIVATE) {
- if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_PRIVATE) < 0)
+ if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_PRIVATE) < 0) {
+ doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
+ }
}
if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_SHARED) {
- if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_SHARED) < 0)
+ if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_SHARED) < 0) {
+ doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
+ }
}
mailbox_free(&box);
return ret;
doveadm_mail_failed_storage(ctx, mailbox_get_storage(box));
}
+void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
+ struct mailbox_list *list)
+{
+ enum mail_error error;
+
+ mailbox_list_get_last_error(list, &error);
+ doveadm_mail_failed_error(ctx, error);
+}
+
struct doveadm_mail_cmd_context *
doveadm_mail_cmd_alloc_size(size_t size)
{
if (mailbox_list_iter_deinit(&iter) < 0) {
i_error("Listing mailboxes failed: %s",
mailbox_list_get_last_error(user->namespaces->list, NULL));
+ doveadm_mail_failed_list(ctx, user->namespaces->list);
ret = -1;
}
return ret;
#include "mail-storage-service.h"
struct mailbox;
+struct mailbox_list;
struct mail_storage;
struct mail_user;
struct doveadm_mail_cmd_context;
struct mail_storage *storage);
void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
struct mailbox *box);
+void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
+ struct mailbox_list *list);
extern struct doveadm_mail_cmd cmd_expunge;
extern struct doveadm_mail_cmd cmd_search;
int doveadm_mailbox_list_iter_deinit(struct doveadm_mailbox_list_iter **_iter)
{
struct doveadm_mailbox_list_iter *iter = *_iter;
+ enum mail_error error;
int ret;
*_iter = NULL;
ret = 0;
else if ((ret = mailbox_list_iter_deinit(&iter->iter)) < 0) {
i_error("Listing mailboxes failed: %s",
- mailbox_list_get_last_error(iter->user->namespaces->list, NULL));
- doveadm_mail_failed_error(iter->ctx, MAIL_ERROR_TEMP);
+ mailbox_list_get_last_error(iter->user->namespaces->list, &error));
+ doveadm_mail_failed_error(iter->ctx, error);
}
array_free(&iter->patterns);
i_free(iter);