dovecot-2.2: lib-fs: istream-metawrap is a bit more flexible now...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Feb 3 21:53:48 EET 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/30922a3668a9
changeset: 15717:30922a3668a9
user: Timo Sirainen <tss at iki.fi>
date: Sun Feb 03 21:48:58 2013 +0200
description:
lib-fs: istream-metawrap is a bit more flexible now, allowing stat()ing and reading from fd
diffstat:
src/lib-fs/istream-metawrap.c | 30 +++++++++++++++++++++++++++++-
1 files changed, 29 insertions(+), 1 deletions(-)
diffs (61 lines):
diff -r f4d33f3c1ab9 -r 30922a3668a9 src/lib-fs/istream-metawrap.c
--- a/src/lib-fs/istream-metawrap.c Sat Feb 02 22:21:36 2013 +0200
+++ b/src/lib-fs/istream-metawrap.c Sun Feb 03 21:48:58 2013 +0200
@@ -34,6 +34,7 @@
mstream->istream.istream.eof = TRUE;
return -1;
}
+ i_assert(!mstream->istream.parent->blocking);
return 0;
}
@@ -51,12 +52,38 @@
mstream->start_offset = stream->parent->v_offset;
if (ret <= 0)
return ret;
+ /* this stream is kind of silently skipping over the metadata */
+ stream->abs_start_offset += mstream->start_offset;
mstream->in_metadata = FALSE;
}
/* after metadata header it's all just passthrough */
return i_stream_read_copy_from_parent(&stream->istream);
}
+static int i_stream_metawrap_stat(struct istream_private *stream, bool exact)
+{
+ struct metawrap_istream *mstream = (struct metawrap_istream *)stream;
+ const struct stat *st;
+ int ret;
+
+ if (i_stream_stat(stream->parent, exact, &st) < 0)
+ return -1;
+ stream->statbuf = *st;
+
+ if (mstream->in_metadata) {
+ ret = i_stream_read(&stream->istream);
+ if (ret < 0)
+ return -1;
+ if (ret == 0) {
+ stream->statbuf.st_size = -1;
+ return 0;
+ }
+ }
+ i_assert((uoff_t)stream->statbuf.st_size >= mstream->start_offset);
+ stream->statbuf.st_size -= mstream->start_offset;
+ return 0;
+}
+
struct istream *
i_stream_create_metawrap(struct istream *input,
metawrap_callback_t *callback, void *context)
@@ -67,8 +94,9 @@
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.istream.readable_fd = FALSE;
+ mstream->istream.istream.readable_fd = input->readable_fd;
mstream->istream.istream.blocking = input->blocking;
mstream->istream.istream.seekable = FALSE;
mstream->in_metadata = TRUE;
More information about the dovecot-cvs
mailing list