dovecot-2.1: doveadm expunge: Added -d parameter to delete mailb...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Apr 19 18:16:07 EEST 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/782570f644f7
changeset: 14428:782570f644f7
user: Timo Sirainen <tss at iki.fi>
date: Thu Apr 19 18:15:56 2012 +0300
description:
doveadm expunge: Added -d parameter to delete mailbox if it's empty after expunging.
diffstat:
src/doveadm/doveadm-mail-expunge.c | 64 ++++++++++++++++++++++++++++++++-----
src/doveadm/doveadm-mail-iter.c | 18 +++++++--
src/doveadm/doveadm-mail-iter.h | 2 +
3 files changed, 70 insertions(+), 14 deletions(-)
diffs (161 lines):
diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-expunge.c
--- a/src/doveadm/doveadm-mail-expunge.c Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-expunge.c Thu Apr 19 18:15:56 2012 +0300
@@ -9,16 +9,24 @@
#include "doveadm-mail-iter.h"
#include "doveadm-mail.h"
+struct expunge_cmd_context {
+ struct doveadm_mail_cmd_context ctx;
+ bool delete_empty_mailbox;
+};
+
static int
-cmd_expunge_box(struct doveadm_mail_cmd_context *ctx,
+cmd_expunge_box(struct doveadm_mail_cmd_context *_ctx,
const struct mailbox_info *info,
struct mail_search_args *search_args)
{
+ struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
struct doveadm_mail_iter *iter;
+ struct mailbox *box;
struct mailbox_transaction_context *trans;
struct mail *mail;
+ enum mail_error error;
- if (doveadm_mail_iter_init(ctx, info, search_args, 0, NULL,
+ if (doveadm_mail_iter_init(_ctx, info, search_args, 0, NULL,
&trans, &iter) < 0)
return -1;
@@ -29,7 +37,29 @@
}
mail_expunge(mail);
}
- return doveadm_mail_iter_deinit_sync(&iter);
+
+ if (doveadm_mail_iter_deinit_keep_box(&iter, &box) < 0) {
+ mailbox_free(&box);
+ return -1;
+ }
+ if (mailbox_sync(box, 0) < 0) {
+ doveadm_mail_failed_mailbox(_ctx, box);
+ mailbox_free(&box);
+ return -1;
+ }
+
+ if (ctx->delete_empty_mailbox) {
+ if (mailbox_delete_empty(box) < 0) {
+ (void)mailbox_get_last_error(box, &error);
+ if (error != MAIL_ERROR_EXISTS) {
+ doveadm_mail_failed_mailbox(_ctx, box);
+ mailbox_free(&box);
+ return -1;
+ }
+ }
+ }
+ mailbox_free(&box);
+ return 0;
}
static bool
@@ -208,16 +238,32 @@
expunge_search_args_check(ctx->search_args, "expunge");
}
+static bool cmd_expunge_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
+{
+ struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
+
+ switch (c) {
+ case 'd':
+ ctx->delete_empty_mailbox = TRUE;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
static struct doveadm_mail_cmd_context *cmd_expunge_alloc(void)
{
- struct doveadm_mail_cmd_context *ctx;
+ struct expunge_cmd_context *ctx;
- ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
- ctx->v.init = cmd_expunge_init;
- ctx->v.run = cmd_expunge_run;
- return ctx;
+ ctx = doveadm_mail_cmd_alloc(struct expunge_cmd_context);
+ ctx->ctx.getopt_args = "d";
+ ctx->ctx.v.parse_arg = cmd_expunge_parse_arg;
+ ctx->ctx.v.init = cmd_expunge_init;
+ ctx->ctx.v.run = cmd_expunge_run;
+ return &ctx->ctx;
}
struct doveadm_mail_cmd cmd_expunge = {
- cmd_expunge_alloc, "expunge", "<search query>"
+ cmd_expunge_alloc, "expunge", "[-d] <search query>"
};
diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-iter.c
--- a/src/doveadm/doveadm-mail-iter.c Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-iter.c Thu Apr 19 18:15:56 2012 +0300
@@ -83,7 +83,7 @@
static int
doveadm_mail_iter_deinit_full(struct doveadm_mail_iter **_iter,
- bool sync, bool commit)
+ bool sync, bool commit, bool keep_box)
{
struct doveadm_mail_iter *iter = *_iter;
int ret;
@@ -95,24 +95,32 @@
ret = mailbox_sync(iter->box, 0);
if (ret < 0)
doveadm_mail_failed_mailbox(iter->ctx, iter->box);
- mailbox_free(&iter->box);
+ if (!keep_box)
+ mailbox_free(&iter->box);
i_free(iter);
return ret;
}
int doveadm_mail_iter_deinit(struct doveadm_mail_iter **_iter)
{
- return doveadm_mail_iter_deinit_full(_iter, FALSE, TRUE);
+ return doveadm_mail_iter_deinit_full(_iter, FALSE, TRUE, FALSE);
}
int doveadm_mail_iter_deinit_sync(struct doveadm_mail_iter **_iter)
{
- return doveadm_mail_iter_deinit_full(_iter, TRUE, TRUE);
+ return doveadm_mail_iter_deinit_full(_iter, TRUE, TRUE, FALSE);
+}
+
+int doveadm_mail_iter_deinit_keep_box(struct doveadm_mail_iter **iter,
+ struct mailbox **box_r)
+{
+ *box_r = (*iter)->box;
+ return doveadm_mail_iter_deinit_full(iter, FALSE, TRUE, TRUE);
}
void doveadm_mail_iter_deinit_rollback(struct doveadm_mail_iter **_iter)
{
- (void)doveadm_mail_iter_deinit_full(_iter, FALSE, FALSE);
+ (void)doveadm_mail_iter_deinit_full(_iter, FALSE, FALSE, FALSE);
}
bool doveadm_mail_iter_next(struct doveadm_mail_iter *iter,
diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-iter.h
--- a/src/doveadm/doveadm-mail-iter.h Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-iter.h Thu Apr 19 18:15:56 2012 +0300
@@ -13,6 +13,8 @@
struct doveadm_mail_iter **iter_r);
int doveadm_mail_iter_deinit(struct doveadm_mail_iter **iter);
int doveadm_mail_iter_deinit_sync(struct doveadm_mail_iter **iter);
+int doveadm_mail_iter_deinit_keep_box(struct doveadm_mail_iter **iter,
+ struct mailbox **box_r);
void doveadm_mail_iter_deinit_rollback(struct doveadm_mail_iter **iter);
bool doveadm_mail_iter_next(struct doveadm_mail_iter *iter,
More information about the dovecot-cvs
mailing list