dovecot-2.2: lib: When destroying istream-sized stream, it seeks...

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 28 12:01:34 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/ea56193d05b3
changeset: 19238:ea56193d05b3
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Sep 28 14:41:15 2015 +0300
description:
lib: When destroying istream-sized stream, it seeks the parent input at the end offset.
This is also how istream-limit works.

diffstat:

 src/lib/istream-sized.c |  16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diffs (33 lines):

diff -r cfee3a8b35ec -r ea56193d05b3 src/lib/istream-sized.c
--- a/src/lib/istream-sized.c	Mon Sep 28 14:34:05 2015 +0300
+++ b/src/lib/istream-sized.c	Mon Sep 28 14:41:15 2015 +0300
@@ -11,6 +11,21 @@
 	bool failed;
 };
 
+static void i_stream_sized_destroy(struct iostream_private *stream)
+{
+	struct sized_istream *sstream = (struct sized_istream *)stream;
+	uoff_t v_offset;
+
+	v_offset = sstream->istream.parent_start_offset +
+		sstream->istream.istream.v_offset;
+	if (sstream->istream.parent->seekable ||
+	    v_offset > sstream->istream.parent->v_offset) {
+		/* get to same position in parent stream */
+		i_stream_seek(sstream->istream.parent, v_offset);
+	}
+	i_stream_unref(&sstream->istream.parent);
+}
+
 static ssize_t i_stream_sized_read(struct istream_private *stream)
 {
 	struct sized_istream *sstream =
@@ -116,6 +131,7 @@
 	sstream->size = size;
 	sstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
+	sstream->istream.iostream.destroy = i_stream_sized_destroy;
 	sstream->istream.read = i_stream_sized_read;
 	sstream->istream.stat = i_stream_sized_stat;
 


More information about the dovecot-cvs mailing list