dovecot-2.1: doveadm fetch: hdr.*.address and hdr.*.address_name...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jan 26 21:26:26 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/a6a787f0aba1
changeset: 14001:a6a787f0aba1
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jan 26 21:25:39 2012 +0200
description:
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.

diffstat:

 src/doveadm/doveadm-mail-fetch.c |  36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diffs (70 lines):

diff -r 2418871d09f5 -r a6a787f0aba1 src/doveadm/doveadm-mail-fetch.c
--- a/src/doveadm/doveadm-mail-fetch.c	Thu Jan 26 20:46:44 2012 +0200
+++ b/src/doveadm/doveadm-mail-fetch.c	Thu Jan 26 21:25:39 2012 +0200
@@ -5,6 +5,7 @@
 #include "istream.h"
 #include "ostream.h"
 #include "str.h"
+#include "message-address.h"
 #include "message-size.h"
 #include "message-parser.h"
 #include "message-decoder.h"
@@ -130,11 +131,15 @@
 
 static int fetch_hdr_field(struct fetch_cmd_context *ctx)
 {
-	const char *const *value;
+	const char *const *value, *filter, *name = ctx->cur_field->name;
 	string_t *str = t_str_new(256);
 	bool add_lf = FALSE;
 
-	if (mail_get_headers(ctx->mail, ctx->cur_field->name, &value) < 0)
+	filter = strchr(name, '.');
+	if (filter != NULL)
+		name = t_strdup_until(name, filter++);
+
+	if (mail_get_headers(ctx->mail, name, &value) < 0)
 		return -1;
 
 	for (; *value != NULL; value++) {
@@ -143,6 +148,32 @@
 		str_append(str, *value);
 		add_lf = TRUE;
 	}
+
+	if (filter == NULL) {
+		/* print the header as-is */
+	} else if (strcmp(filter, "address") == 0 ||
+		   strcmp(filter, "address_name") == 0) {
+		struct message_address *addr;
+
+		addr = message_address_parse(pool_datastack_create(),
+					     str_data(str), str_len(str), -1U,
+					     FALSE);
+		str_truncate(str, 0);
+		add_lf = FALSE;
+		for (; addr != NULL; addr = addr->next) {
+			if (add_lf)
+				str_append_c(str, '\n');
+			if (strcmp(filter, "address") == 0) {
+				str_printfa(str, "%s@%s",
+					    addr->mailbox, addr->domain);
+			} else {
+				str_append(str, addr->name);
+			}
+			add_lf = TRUE;
+		}
+	} else {
+		i_fatal("Unknown header filter: %s", filter);
+	}
 	doveadm_print(str_c(str));
 	return 0;
 }
@@ -413,6 +444,7 @@
 			name += 4;
 			hdr_field.name = name;
 			array_append(&ctx->fields, &hdr_field, 1);
+			name = t_strcut(name, '.');
 			array_append(&ctx->header_fields, &name, 1);
 		} else {
 			field = fetch_field_find(name);


More information about the dovecot-cvs mailing list