From 0e0fe9bed9a2be8760acf93abc6e16758195ef38 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 16 May 2016 20:12:40 +0300 Subject: [PATCH] imap: Code cleanup - use istream-sized for GETMETADATA reply This avoids doing the same work explicitly. --- src/imap/cmd-getmetadata.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/imap/cmd-getmetadata.c b/src/imap/cmd-getmetadata.c index 03187813ff..891e08f04b 100644 --- a/src/imap/cmd-getmetadata.c +++ b/src/imap/cmd-getmetadata.c @@ -3,6 +3,7 @@ #include "imap-common.h" #include "str.h" #include "istream.h" +#include "istream-sized.h" #include "ostream.h" #include "mailbox-list-iter.h" #include "imap-utf7.h" @@ -22,7 +23,6 @@ struct imap_getmetadata_context { unsigned int depth; struct istream *cur_stream; - uoff_t cur_stream_size; struct imap_metadata_iter *iter; string_t *iter_entry_prefix; @@ -203,20 +203,24 @@ static void cmd_getmetadata_send_entry(struct imap_getmetadata_context *ctx, str_printfa(str, " ~{%"PRIuUOFF_T"}\r\n", value_len); o_stream_nsend(client->output, str_data(str), str_len(str)); - i_assert(value.value_stream->v_offset == 0); - ctx->cur_stream_size = value_len; - ctx->cur_stream = value.value_stream; + ctx->cur_stream = i_stream_create_sized(value.value_stream, value_len); + i_stream_unref(&value.value_stream); } } static bool cmd_getmetadata_stream_continue(struct imap_getmetadata_context *ctx) { + int ret; + o_stream_set_max_buffer_size(ctx->cmd->client->output, 0); - (void)o_stream_send_istream(ctx->cmd->client->output, ctx->cur_stream); + ret = o_stream_send_istream(ctx->cmd->client->output, ctx->cur_stream); o_stream_set_max_buffer_size(ctx->cmd->client->output, (size_t)-1); - if (ctx->cur_stream->stream_errno != 0) { + if (ret > 0) { + /* finished */ + return TRUE; + } else if (ret < 0) { i_error("read(%s) failed: %s", i_stream_get_name(ctx->cur_stream), i_stream_get_error(ctx->cur_stream)); @@ -224,18 +228,6 @@ cmd_getmetadata_stream_continue(struct imap_getmetadata_context *ctx) "Internal GETMETADATA failure"); return TRUE; } - if (ctx->cur_stream->v_offset == ctx->cur_stream_size) { - /* finished */ - return TRUE; - } - if (!i_stream_have_bytes_left(ctx->cur_stream)) { - /* Input stream gave less data than expected */ - i_error("read(%s): GETMETADATA stream had less data than expected", - i_stream_get_name(ctx->cur_stream)); - client_disconnect(ctx->cmd->client, - "Internal GETMETADATA failure"); - return TRUE; - } o_stream_set_flush_pending(ctx->cmd->client->output, TRUE); return FALSE; } -- 2.47.3