dovecot-2.1: doveadm force-resync: Support wildcards in mailbox ...

dovecot at dovecot.org dovecot at dovecot.org
Thu Feb 9 04:26:49 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/e004b6a89869
changeset: 14092:e004b6a89869
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Feb 09 04:26:12 2012 +0200
description:
doveadm force-resync: Support wildcards in mailbox names.

diffstat:

 src/doveadm/doveadm-mail.c |  81 +++++++++++++++++++++++++++------------------
 1 files changed, 49 insertions(+), 32 deletions(-)

diffs (113 lines):

diff -r f2d5a1efdda2 -r e004b6a89869 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Thu Feb 09 04:13:28 2012 +0200
+++ b/src/doveadm/doveadm-mail.c	Thu Feb 09 04:26:12 2012 +0200
@@ -135,52 +135,69 @@
 	return sargs;
 }
 
-struct force_resync_cmd_context {
-	struct doveadm_mail_cmd_context ctx;
-	const char *mailbox;
-};
+static int cmd_force_resync_box(const struct mailbox_info *info)
+{
+	struct mailbox *box;
+	int ret = 0;
+
+	box = mailbox_alloc(info->ns->list, info->name,
+			    MAILBOX_FLAG_IGNORE_ACLS);
+	if (mailbox_open(box) < 0) {
+		i_error("Opening mailbox %s failed: %s", info->name,
+			mailbox_get_last_error(box, NULL));
+		ret = -1;
+	} else if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
+				MAILBOX_SYNC_FLAG_FIX_INCONSISTENT) < 0) {
+		i_error("Forcing a resync on mailbox %s failed: %s",
+			info->name, mailbox_get_last_error(box, NULL));
+		ret = -1;
+	}
+	mailbox_free(&box);
+	return ret;
+}
 
 static void cmd_force_resync_run(struct doveadm_mail_cmd_context *_ctx,
 				 struct mail_user *user)
 {
-	struct force_resync_cmd_context *ctx =
-		(struct force_resync_cmd_context *)_ctx;
-	struct mailbox *box;
+	const enum mailbox_list_iter_flags iter_flags =
+		MAILBOX_LIST_ITER_RAW_LIST |
+		MAILBOX_LIST_ITER_NO_AUTO_BOXES |
+		MAILBOX_LIST_ITER_RETURN_NO_FLAGS |
+		MAILBOX_LIST_ITER_STAR_WITHIN_NS;
+	const enum namespace_type ns_mask =
+		NAMESPACE_PRIVATE | NAMESPACE_SHARED | NAMESPACE_PUBLIC;
+	struct mailbox_list_iterate_context *iter;
+	const struct mailbox_info *info;
 
-	if (doveadm_mailbox_find_and_open(user, ctx->mailbox, &box) < 0) {
-		_ctx->failed = TRUE;
-		return;
+	iter = mailbox_list_iter_init_namespaces(user->namespaces, _ctx->args,
+						 ns_mask, iter_flags);
+	while ((info = mailbox_list_iter_next(iter)) != NULL) {
+		if ((info->flags & (MAILBOX_NOSELECT |
+				    MAILBOX_NONEXISTENT)) == 0) T_BEGIN {
+			if (cmd_force_resync_box(info) < 0)
+				_ctx->failed = TRUE;
+		} T_END;
 	}
-	if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
-			 MAILBOX_SYNC_FLAG_FIX_INCONSISTENT) < 0) {
-		i_error("Forcing a resync on mailbox %s failed: %s",
-			ctx->mailbox, mailbox_get_last_error(box, NULL));
-		_ctx->failed = TRUE;
-	}
-	mailbox_free(&box);
+	if (mailbox_list_iter_deinit(&iter) < 0)
+		i_error("Listing mailboxes failed");
 }
 
-static void cmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx,
-				  const char *const args[])
+static void
+cmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
+		      const char *const args[])
 {
-	struct force_resync_cmd_context *ctx =
-		(struct force_resync_cmd_context *)_ctx;
-	const char *mailbox = args[0];
-
-	if (mailbox == NULL || args[1] != NULL)
+	if (args[0] == NULL)
 		doveadm_mail_help_name("force-resync");
-
-	ctx->mailbox = p_strdup(ctx->ctx.pool, mailbox);
 }
 
 static struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
 {
-	struct force_resync_cmd_context *ctx;
+	struct doveadm_mail_cmd_context *ctx;
 
-	ctx = doveadm_mail_cmd_alloc(struct force_resync_cmd_context);
-	ctx->ctx.v.init = cmd_force_resync_init;
-	ctx->ctx.v.run = cmd_force_resync_run;
-	return &ctx->ctx;
+	ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
+	ctx->v.init = cmd_force_resync_init;
+	ctx->v.run = cmd_force_resync_run;
+	return ctx;
 }
 
 static int
@@ -565,7 +582,7 @@
 }
 
 static struct doveadm_mail_cmd cmd_force_resync = {
-	cmd_force_resync_alloc, "force-resync", "<mailbox>"
+	cmd_force_resync_alloc, "force-resync", "<mailbox mask>"
 };
 static struct doveadm_mail_cmd cmd_purge = {
 	cmd_purge_alloc, "purge", NULL


More information about the dovecot-cvs mailing list