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