dovecot-2.2: istream-metawrap: Support seeking if underlying str...

dovecot at dovecot.org dovecot at dovecot.org
Tue Feb 26 17:16:55 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/526cd348936a
changeset: 15978:526cd348936a
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Feb 26 17:16:33 2013 +0200
description:
istream-metawrap: Support seeking if underlying stream supports seeking

diffstat:

 src/lib-fs/istream-metawrap.c |  19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diffs (39 lines):

diff -r 38b9ea9fef2c -r 526cd348936a src/lib-fs/istream-metawrap.c
--- a/src/lib-fs/istream-metawrap.c	Tue Feb 26 17:16:18 2013 +0200
+++ b/src/lib-fs/istream-metawrap.c	Tue Feb 26 17:16:33 2013 +0200
@@ -62,6 +62,20 @@
 	return i_stream_read_copy_from_parent(&stream->istream);
 }
 
+static void
+i_stream_metawrap_seek(struct istream_private *stream,
+		       uoff_t v_offset, bool mark ATTR_UNUSED)
+{
+	struct metawrap_istream *mstream = (struct metawrap_istream *)stream;
+
+	/* support seeking only after reading the metadata */
+	i_assert(!mstream->in_metadata ||
+		 (mstream->start_offset == 0 && v_offset == 0));
+
+	stream->istream.v_offset = v_offset;
+	stream->skip = stream->pos = 0;
+}
+
 static int i_stream_metawrap_stat(struct istream_private *stream, bool exact)
 {
 	struct metawrap_istream *mstream = (struct metawrap_istream *)stream;
@@ -96,11 +110,12 @@
 	mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
 	mstream->istream.read = i_stream_metawrap_read;
-	mstream->istream.stat = i_stream_metawrap_stat;
+	mstream->istream.seek = i_stream_metawrap_seek;
+	mstream->istream.stat = input->seekable ? i_stream_metawrap_stat : NULL;
 
 	mstream->istream.istream.readable_fd = input->readable_fd;
 	mstream->istream.istream.blocking = input->blocking;
-	mstream->istream.istream.seekable = FALSE;
+	mstream->istream.istream.seekable = input->seekable;
 	mstream->in_metadata = TRUE;
 	mstream->callback = callback;
 	mstream->context = context;


More information about the dovecot-cvs mailing list