istream-limit.c revision 61e6367a259e2473f33df42fda8ceeb3b8b48416
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic void i_stream_limit_destroy(struct iostream_private *stream)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen v_offset = lstream->istream.parent_start_offset +
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen v_offset > lstream->istream.parent->v_offset) {
ad456029ce2e1841f2f4ad81dbd7a6c69ebd014fTimo Sirainen /* get to same position in parent stream */
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen i_stream_seek(lstream->istream.parent, v_offset);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Siraineni_stream_limit_set_max_buffer_size(struct iostream_private *stream,
4f79049854ca6a69453deb5487f2b722fdae3e35Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen i_stream_set_max_buffer_size(lstream->istream.parent, max_size);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic ssize_t i_stream_limit_read(struct istream_private *stream)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen (stream->pos - stream->skip) >= lstream->v_size) {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen lstream->istream.parent_start_offset + stream->istream.v_offset) {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
9269bbf0d2ad5491b09145458b56a3da92b67246Timo Sirainen if ((ret = i_stream_read(stream->parent)) == -2)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen stream->istream.stream_errno = stream->parent->stream_errno;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen left = lstream->v_size - stream->istream.v_offset;
ad456029ce2e1841f2f4ad81dbd7a6c69ebd014fTimo Sirainen ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic void i_stream_limit_seek(struct istream_private *stream, uoff_t v_offset,
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainenstatic const struct stat *
ad456029ce2e1841f2f4ad81dbd7a6c69ebd014fTimo Siraineni_stream_limit_stat(struct istream_private *stream, bool exact)
ad456029ce2e1841f2f4ad81dbd7a6c69ebd014fTimo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
80bc6f4feafd94bfaf3bf77e7b4038c03b81de3aTimo Sirainenstatic int i_stream_limit_get_size(struct istream_private *stream,
80bc6f4feafd94bfaf3bf77e7b4038c03b81de3aTimo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstruct istream *i_stream_create_limit(struct istream *input, uoff_t v_size)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainen lstream->istream.iostream.destroy = i_stream_limit_destroy;
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainen lstream->istream.iostream.set_max_buffer_size =
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen lstream->istream.get_size = i_stream_limit_get_size;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen lstream->istream.istream.blocking = input->blocking;
66fff40a31842c0d9cdbf0a6037655f089735f8fTimo Sirainen lstream->istream.istream.seekable = input->seekable;