dovecot-2.0: doveadm fetch: Write output using formatter. Use pa...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 21 23:47:23 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/bc03e6443ca7
changeset: 11605:bc03e6443ca7
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 21 21:47:14 2010 +0100
description:
doveadm fetch: Write output using formatter. Use pager as default.

diffstat:

 src/doveadm/doveadm-mail-fetch.c |  169 +++++++++++++++---------------------------
 1 files changed, 60 insertions(+), 109 deletions(-)

diffs (truncated from 432 to 300 lines):

diff -r c4e906be2ca3 -r bc03e6443ca7 src/doveadm/doveadm-mail-fetch.c
--- a/src/doveadm/doveadm-mail-fetch.c	Mon Jun 21 21:46:20 2010 +0100
+++ b/src/doveadm/doveadm-mail-fetch.c	Mon Jun 21 21:47:14 2010 +0100
@@ -4,8 +4,6 @@
 #include "array.h"
 #include "istream.h"
 #include "ostream.h"
-#include "base64.h"
-#include "randgen.h"
 #include "str.h"
 #include "message-size.h"
 #include "imap-utf7.h"
@@ -14,6 +12,7 @@
 #include "mail-storage.h"
 #include "mail-search.h"
 #include "mail-namespace.h"
+#include "doveadm-print.h"
 #include "doveadm-mail.h"
 #include "doveadm-mail-list-iter.h"
 #include "doveadm-mail-iter.h"
@@ -31,8 +30,6 @@
 	enum mail_fetch_field wanted_fields;
 
 	const struct fetch_field *cur_field;
-	string_t *hdr;
-	const char *prefix;
 
 	bool print_field_prefix;
 };
@@ -45,23 +42,23 @@
 
 static int fetch_user(struct fetch_cmd_context *ctx)
 {
-	str_append(ctx->hdr, ctx->ctx.cur_mail_user->username);
+	doveadm_print(ctx->ctx.cur_mail_user->username);
 	return 0;
 }
 
 static int fetch_mailbox(struct fetch_cmd_context *ctx)
 {
 	const char *value;
-	unsigned int len;
+	string_t *str = t_str_new(128);
 
 	if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, &value) < 0)
 		return -1;
 
-	len = str_len(ctx->hdr);
-	if (imap_utf7_to_utf8(value, ctx->hdr) < 0) {
+	if (imap_utf7_to_utf8(value, str) == 0)
+		doveadm_print(str_c(str));
+	else {
 		/* not a valid mUTF-7 name, fallback to showing it as-is */
-		str_truncate(ctx->hdr, len);
-		str_append(ctx->hdr, value);
+		doveadm_print(value);
 	}
 	return 0;
 }
@@ -72,19 +69,19 @@
 
 	if (mailbox_get_guid(ctx->mail->box, guid) < 0)
 		return -1;
-	str_append(ctx->hdr, mail_guid_128_to_string(guid));
+	doveadm_print(mail_guid_128_to_string(guid));
 	return 0;
 }
 
 static int fetch_seq(struct fetch_cmd_context *ctx)
 {
-	str_printfa(ctx->hdr, "%u", ctx->mail->seq);
+	doveadm_print_num(ctx->mail->seq);
 	return 0;
 }
 
 static int fetch_uid(struct fetch_cmd_context *ctx)
 {
-	str_printfa(ctx->hdr, "%u", ctx->mail->seq);
+	doveadm_print_num(ctx->mail->seq);
 	return 0;
 }
 
@@ -94,72 +91,65 @@
 
 	if (mail_get_special(ctx->mail, MAIL_FETCH_GUID, &value) < 0)
 		return -1;
-	str_append(ctx->hdr, value);
+	doveadm_print(value);
 	return 0;
 }
 
 static int fetch_flags(struct fetch_cmd_context *ctx)
 {
-	imap_write_flags(ctx->hdr, mail_get_flags(ctx->mail),
+	string_t *str = t_str_new(64);
+
+	imap_write_flags(str, mail_get_flags(ctx->mail),
 			 mail_get_keywords(ctx->mail));
+	doveadm_print(str_c(str));
 	return 0;
 }
 
-static void flush_hdr(struct fetch_cmd_context *ctx)
-{
-	o_stream_send(ctx->output, str_data(ctx->hdr), str_len(ctx->hdr));
-	str_truncate(ctx->hdr, 0);
-}
-
 static int fetch_hdr(struct fetch_cmd_context *ctx)
 {
 	struct istream *input;
 	struct message_size hdr_size;
+	const unsigned char *data;
+	size_t size;
 	int ret = 0;
 
 	if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0)
 		return -1;
 
-	if (ctx->print_field_prefix)
-		str_append_c(ctx->hdr, '\n');
-	flush_hdr(ctx);
 	input = i_stream_create_limit(input, hdr_size.physical_size);
 	while (!i_stream_is_eof(input)) {
-		if (o_stream_send_istream(ctx->output, input) <= 0)
-			i_fatal("write(stdout) failed: %m");
+		if (i_stream_read_data(input, &data, &size, 0) == -1)
+			break;
+		if (size == 0)
+			break;
+		doveadm_print_stream(data, size);
+		i_stream_skip(input, size);
 	}
 	if (input->stream_errno != 0) {
 		i_error("read() failed: %m");
 		ret = -1;
 	}
 	i_stream_unref(&input);
-	o_stream_flush(ctx->output);
+	doveadm_print_stream(NULL, 0);
 	return ret;
 }
 
 static int fetch_hdr_field(struct fetch_cmd_context *ctx)
 {
 	const char *const *value;
+	string_t *str = t_str_new(256);
 	bool add_lf = FALSE;
 
 	if (mail_get_headers(ctx->mail, ctx->cur_field->name, &value) < 0)
 		return -1;
 
-	if (*value == NULL) {
-		/* no value */
-		if (ctx->print_field_prefix)
-			str_printfa(ctx->hdr, "hdr.%s: ", ctx->cur_field->name);
-		return 0;
-	}
-
 	for (; *value != NULL; value++) {
 		if (add_lf)
-			str_append_c(ctx->hdr, '\n');
-		if (ctx->print_field_prefix)
-			str_printfa(ctx->hdr, "hdr.%s: ", ctx->cur_field->name);
-		str_append(ctx->hdr, *value);
+			str_append_c(str, '\n');
+		str_append(str, *value);
 		add_lf = TRUE;
 	}
+	doveadm_print(str_c(str));
 	return 0;
 }
 
@@ -167,47 +157,53 @@
 {
 	struct istream *input;
 	struct message_size hdr_size;
+	const unsigned char *data;
+	size_t size;
 	int ret = 0;
 
 	if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0)
 		return -1;
 
-	if (ctx->print_field_prefix)
-		str_append_c(ctx->hdr, '\n');
-	flush_hdr(ctx);
 	i_stream_skip(input, hdr_size.physical_size);
 	while (!i_stream_is_eof(input)) {
-		if (o_stream_send_istream(ctx->output, input) <= 0)
-			i_fatal("write(stdout) failed: %m");
+		if (i_stream_read_data(input, &data, &size, 0) == -1)
+			break;
+		if (size == 0)
+			break;
+		doveadm_print_stream(data, size);
+		i_stream_skip(input, size);
 	}
 	if (input->stream_errno != 0) {
 		i_error("read() failed: %m");
 		ret = -1;
 	}
-	o_stream_flush(ctx->output);
+	doveadm_print_stream(NULL, 0);
 	return ret;
 }
 
 static int fetch_text(struct fetch_cmd_context *ctx)
 {
 	struct istream *input;
+	const unsigned char *data;
+	size_t size;
 	int ret = 0;
 
 	if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0)
 		return -1;
 
-	if (ctx->print_field_prefix)
-		str_append_c(ctx->hdr, '\n');
-	flush_hdr(ctx);
 	while (!i_stream_is_eof(input)) {
-		if (o_stream_send_istream(ctx->output, input) <= 0)
-			i_fatal("write(stdout) failed: %m");
+		if (i_stream_read_data(input, &data, &size, 0) == -1)
+			break;
+		if (size == 0)
+			break;
+		doveadm_print_stream(data, size);
+		i_stream_skip(input, size);
 	}
 	if (input->stream_errno != 0) {
 		i_error("read() failed: %m");
 		ret = -1;
 	}
-	o_stream_flush(ctx->output);
+	doveadm_print_stream(NULL, 0);
 	return ret;
 }
 
@@ -217,7 +213,7 @@
 
 	if (mail_get_physical_size(ctx->mail, &size) < 0)
 		return -1;
-	str_printfa(ctx->hdr, "%"PRIuUOFF_T, size);
+	doveadm_print_num(size);
 	return 0;
 }
 
@@ -227,7 +223,7 @@
 
 	if (mail_get_virtual_size(ctx->mail, &size) < 0)
 		return -1;
-	str_printfa(ctx->hdr, "%"PRIuUOFF_T, size);
+	doveadm_print_num(size);
 	return 0;
 }
 
@@ -237,7 +233,7 @@
 
 	if (mail_get_received_date(ctx->mail, &t) < 0)
 		return -1;
-	str_printfa(ctx->hdr, "%s", unixdate2str(t));
+	doveadm_print(unixdate2str(t));
 	return 0;
 }
 
@@ -252,8 +248,8 @@
 
 	chr = tz < 0 ? '-' : '+';
 	if (tz < 0) tz = -tz;
-	str_printfa(ctx->hdr, "%s (%c%02u%02u)", unixdate2str(t),
-		    chr, tz/60, tz%60);
+	doveadm_print(t_strdup_printf("%s (%c%02u%02u)", unixdate2str(t),
+				      chr, tz/60, tz%60));
 	return 0;
 }
 
@@ -263,7 +259,7 @@
 
 	if (mail_get_save_date(ctx->mail, &t) < 0)
 		return -1;
-	str_printfa(ctx->hdr, "%s", unixdate2str(t));
+	doveadm_print(unixdate2str(t));
 	return 0;
 }
 
@@ -273,7 +269,7 @@
 
 	if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_ENVELOPE, &value) < 0)
 		return -1;
-	str_append(ctx->hdr, value);
+	doveadm_print(value);
 	return 0;
 }
 
@@ -283,7 +279,7 @@
 
 	if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODY, &value) < 0)
 		return -1;
-	str_append(ctx->hdr, value);


More information about the dovecot-cvs mailing list