dovecot-2.2: doveadm: Added "flags" command to modify messages' ...

dovecot at dovecot.org dovecot at dovecot.org
Tue Jun 18 15:15:07 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/5e51c5545029
changeset: 16534:5e51c5545029
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jun 18 15:14:42 2013 +0300
description:
doveadm: Added "flags" command to modify messages' flags.

diffstat:

 src/doveadm/Makefile.am          |    1 +
 src/doveadm/doveadm-mail-flags.c |  143 +++++++++++++++++++++++++++++++++++++++
 src/doveadm/doveadm-mail.c       |    3 +
 src/doveadm/doveadm-mail.h       |    3 +
 4 files changed, 150 insertions(+), 0 deletions(-)

diffs (184 lines):

diff -r 3056feb418b1 -r 5e51c5545029 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am	Tue Jun 18 13:00:23 2013 +0300
+++ b/src/doveadm/Makefile.am	Tue Jun 18 15:14:42 2013 +0300
@@ -64,6 +64,7 @@
 	doveadm-mail-batch.c \
 	doveadm-mail-expunge.c \
 	doveadm-mail-fetch.c \
+	doveadm-mail-flags.c \
 	doveadm-mail-import.c \
 	doveadm-mail-index.c \
 	doveadm-mail-iter.c \
diff -r 3056feb418b1 -r 5e51c5545029 src/doveadm/doveadm-mail-flags.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-mail-flags.c	Tue Jun 18 15:14:42 2013 +0300
@@ -0,0 +1,143 @@
+/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "imap-util.h"
+#include "mail-storage.h"
+#include "doveadm-mailbox-list-iter.h"
+#include "doveadm-mail-iter.h"
+#include "doveadm-mail.h"
+
+#include <stdio.h>
+
+struct flags_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+	enum modify_type modify_type;
+	enum mail_flags flags;
+	const char *const *keywords;
+};
+
+static int
+cmd_flags_run_box(struct flags_cmd_context *ctx,
+		  const struct mailbox_info *info)
+{
+	struct doveadm_mail_iter *iter;
+	struct mailbox *box;
+	struct mail *mail;
+	struct mail_keywords *kw = NULL;
+
+	if (doveadm_mail_iter_init(&ctx->ctx, info, ctx->ctx.search_args,
+				   0, NULL, &iter) < 0)
+		return -1;
+	box = doveadm_mail_iter_get_mailbox(iter);
+
+	if (ctx->keywords != NULL) {
+		if (mailbox_keywords_create(box, ctx->keywords, &kw) < 0) {
+			i_error("Invalid keywords: %s",
+				mailbox_get_last_error(box, NULL));
+			(void)doveadm_mail_iter_deinit(&iter);
+			ctx->ctx.exit_code = DOVEADM_EX_NOTPOSSIBLE;
+			return -1;
+		}
+	}
+
+	while (doveadm_mail_iter_next(iter, &mail)) {
+		mail_update_flags(mail, ctx->modify_type, ctx->flags);
+		if (kw != NULL)
+			mail_update_keywords(mail, ctx->modify_type, kw);
+	}
+	if (kw != NULL)
+		mailbox_keywords_unref(&kw);
+	return doveadm_mail_iter_deinit(&iter);
+}
+
+static int
+cmd_flags_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
+{
+	struct flags_cmd_context *ctx = (struct flags_cmd_context *)_ctx;
+	const enum mailbox_list_iter_flags iter_flags =
+		MAILBOX_LIST_ITER_NO_AUTO_BOXES |
+		MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
+	struct doveadm_mailbox_list_iter *iter;
+	const struct mailbox_info *info;
+	int ret = 0;
+
+	iter = doveadm_mailbox_list_iter_init(_ctx, user, _ctx->search_args,
+					      iter_flags);
+	while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) T_BEGIN {
+		if (cmd_flags_run_box(ctx, info) < 0)
+			ret = -1;
+	} T_END;
+	if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
+		ret = -1;
+	return ret;
+}
+
+static void cmd_flags_init(struct doveadm_mail_cmd_context *_ctx,
+			   const char *const args[])
+{
+	struct flags_cmd_context *ctx = (struct flags_cmd_context *)_ctx;
+	const char *const *tmp;
+	enum mail_flags flag;
+	ARRAY_TYPE(const_string) keywords;
+
+	if (args[0] == NULL || args[1] == NULL)
+		doveadm_mail_help_name("flags");
+
+	p_array_init(&keywords, _ctx->pool, 8);
+	for (tmp = t_strsplit(args[0], " "); *tmp != NULL; tmp++) {
+		const char *str = *tmp;
+
+		if (str[0] == '\\') {
+			flag = imap_parse_system_flag(str);
+			if (flag == 0)
+				i_fatal("Invalid system flag: %s", str);
+			ctx->flags |= flag;
+		} else {
+			str = p_strdup(_ctx->pool, str);
+			array_append(&keywords, &str, 1);
+		}
+	}
+	if (array_count(&keywords) > 0 || ctx->modify_type == MODIFY_REPLACE) {
+		array_append_zero(&keywords);
+		ctx->keywords = array_idx(&keywords, 0);
+	}
+
+	_ctx->search_args = doveadm_mail_build_search_args(args+1);
+}
+
+static struct doveadm_mail_cmd_context *
+cmd_flag_alloc(enum modify_type modify_type)
+{
+	struct flags_cmd_context *ctx;
+
+	ctx = doveadm_mail_cmd_alloc(struct flags_cmd_context);
+	ctx->modify_type = modify_type;
+	ctx->ctx.v.init = cmd_flags_init;
+	ctx->ctx.v.run = cmd_flags_run;
+	return &ctx->ctx;
+}
+
+static struct doveadm_mail_cmd_context *cmd_flags_add_alloc(void)
+{
+	return cmd_flag_alloc(MODIFY_ADD);
+}
+
+static struct doveadm_mail_cmd_context *cmd_flags_remove_alloc(void)
+{
+	return cmd_flag_alloc(MODIFY_REMOVE);
+}
+
+static struct doveadm_mail_cmd_context *cmd_flags_replace_alloc(void)
+{
+	return cmd_flag_alloc(MODIFY_REPLACE);
+}
+
+struct doveadm_mail_cmd cmd_flags_add = {
+	cmd_flags_add_alloc, "flags add", "<flags> <search query>"
+};
+struct doveadm_mail_cmd cmd_flags_remove = {
+	cmd_flags_remove_alloc, "flags remove", "<flags> <search query>"
+};
+struct doveadm_mail_cmd cmd_flags_replace = {
+	cmd_flags_replace_alloc, "flags replace", "<flags> <search query>"
+};
diff -r 3056feb418b1 -r 5e51c5545029 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Tue Jun 18 13:00:23 2013 +0300
+++ b/src/doveadm/doveadm-mail.c	Tue Jun 18 15:14:42 2013 +0300
@@ -692,6 +692,9 @@
 	&cmd_expunge,
 	&cmd_search,
 	&cmd_fetch,
+	&cmd_flags_add,
+	&cmd_flags_remove,
+	&cmd_flags_replace,
 	&cmd_import,
 	&cmd_index,
 	&cmd_altmove,
diff -r 3056feb418b1 -r 5e51c5545029 src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h	Tue Jun 18 13:00:23 2013 +0300
+++ b/src/doveadm/doveadm-mail.h	Tue Jun 18 15:14:42 2013 +0300
@@ -138,6 +138,9 @@
 extern struct doveadm_mail_cmd cmd_expunge;
 extern struct doveadm_mail_cmd cmd_search;
 extern struct doveadm_mail_cmd cmd_fetch;
+extern struct doveadm_mail_cmd cmd_flags_add;
+extern struct doveadm_mail_cmd cmd_flags_remove;
+extern struct doveadm_mail_cmd cmd_flags_replace;
 extern struct doveadm_mail_cmd cmd_import;
 extern struct doveadm_mail_cmd cmd_index;
 extern struct doveadm_mail_cmd cmd_altmove;


More information about the dovecot-cvs mailing list