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