dovecot-2.1: doveadm mailbox delete: Added -r parameter to recur...

dovecot at dovecot.org dovecot at dovecot.org
Sun Feb 12 04:01:40 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/4bc781a27f54
changeset: 14117:4bc781a27f54
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Feb 12 04:01:34 2012 +0200
description:
doveadm mailbox delete: Added -r parameter to recursively delete mailboxes.

diffstat:

 src/doveadm/doveadm-mail-mailbox.c |  82 ++++++++++++++++++++++++++++++++-----
 1 files changed, 70 insertions(+), 12 deletions(-)

diffs (130 lines):

diff -r 711c122aa253 -r 4bc781a27f54 src/doveadm/doveadm-mail-mailbox.c
--- a/src/doveadm/doveadm-mail-mailbox.c	Sun Feb 12 03:51:21 2012 +0200
+++ b/src/doveadm/doveadm-mail-mailbox.c	Sun Feb 12 04:01:34 2012 +0200
@@ -24,6 +24,12 @@
 	ARRAY_TYPE(const_string) mailboxes;
 };
 
+struct delete_cmd_context {
+	struct doveadm_mailbox_cmd_context ctx;
+	ARRAY_TYPE(const_string) mailboxes;
+	bool recursive;
+};
+
 struct rename_cmd_context {
 	struct doveadm_mailbox_cmd_context ctx;
 	const char *oldname, *newname;
@@ -239,17 +245,59 @@
 	return &ctx->ctx.ctx;
 }
 
+static int i_strcmp_reverse_p(const void *p1, const void *p2)
+{
+	const char *const *s1 = p1, *const *s2 = p2;
+
+	return -strcmp(*s1, *s2);
+}
+
+static void
+get_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
+		    const char *name)
+{
+	struct mailbox_list_iterate_context *iter;
+	struct mail_namespace *ns;
+	const struct mailbox_info *info;
+	const char *pattern, *child_name;
+
+	ns = mail_namespace_find(user->namespaces, name);
+	if (ns == NULL)
+		return;
+
+	pattern = t_strdup_printf("%s%c*", name, mail_namespace_get_sep(ns));
+	iter = mailbox_list_iter_init(ns->list, pattern,
+				      MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
+	while ((info = mailbox_list_iter_next(iter)) != NULL) {
+		child_name = t_strdup(info->name);
+		array_append(mailboxes, &child_name, 1);
+	}
+	(void)mailbox_list_iter_deinit(&iter);
+}
+
 static void
 cmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
 		       struct mail_user *user)
 {
-	struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
+	struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
 	struct mail_namespace *ns;
 	struct mailbox *box;
 	struct mail_storage *storage;
 	const char *const *namep;
+	ARRAY_TYPE(const_string) recursive_mailboxes;
+	const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
 
-	array_foreach(&ctx->mailboxes, namep) {
+	if (ctx->recursive) {
+		t_array_init(&recursive_mailboxes, 32);
+		array_foreach(&ctx->mailboxes, namep) {
+			get_child_mailboxes(user, &recursive_mailboxes, *namep);
+			array_append(&recursive_mailboxes, namep, 1);
+		}
+		array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
+		mailboxes = &recursive_mailboxes;
+	}
+
+	array_foreach(mailboxes, namep) {
 		const char *name = *namep;
 
 		ns = mail_namespace_find(user->namespaces, name);
@@ -272,17 +320,10 @@
 	}
 }
 
-static int i_strcmp_reverse_p(const void *p1, const void *p2)
-{
-	const char *const *s1 = p1, *const *s2 = p2;
-
-	return -strcmp(*s1, *s2);
-}
-
 static void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
 				    const char *const args[])
 {
-	struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
+	struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
 	const char *name;
 	unsigned int i;
 
@@ -297,13 +338,30 @@
 	array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
 }
 
+static bool
+cmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
+{
+	struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
+
+	switch (c) {
+	case 'r':
+		ctx->recursive = TRUE;
+		break;
+	default:
+		return FALSE;
+	}
+	return TRUE;
+}
+
 static struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
 {
-	struct mailbox_cmd_context *ctx;
+	struct delete_cmd_context *ctx;
 
-	ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
+	ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
 	ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
 	ctx->ctx.ctx.v.run = cmd_mailbox_delete_run;
+	ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
+	ctx->ctx.ctx.getopt_args = "r";
 	p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
 	return &ctx->ctx.ctx;
 }


More information about the dovecot-cvs mailing list