istream-limit.c revision 032964c7cc6788188b63ae6270fc26cbd4a3ca26
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainenstatic void i_stream_limit_destroy(struct iostream_private *stream)
37847ec8eaec9ad55c9df10ae109efe7b37ac573Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen v_offset = lstream->istream.parent_start_offset +
ef50336eefcb9ba99f73c6af37420eaf8857a39bTimo Sirainen v_offset > lstream->istream.parent->v_offset) {
91b203fd2132510a47a4b34252c0ae0efd688a19Timo Sirainen /* get to same position in parent stream */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen i_stream_seek(lstream->istream.parent, v_offset);
5694eeb99b69dea8033ca77ad69743c6b4871370Timo Sirainenstatic ssize_t i_stream_limit_read(struct istream_private *stream)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen (stream->pos - stream->skip) >= lstream->v_size) {
de486b59018016977015ef42e6071155b60e82e1Timo Sirainen i_stream_seek(stream->parent, lstream->istream.parent_start_offset +
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen if ((ret = i_stream_read(stream->parent)) == -2)
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen stream->istream.stream_errno = stream->parent->stream_errno;
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen left = lstream->v_size - stream->istream.v_offset;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic const struct stat *
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Siraineni_stream_limit_stat(struct istream_private *stream, bool exact)
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int i_stream_limit_get_size(struct istream_private *stream,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct limit_istream *lstream = (struct limit_istream *) stream;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstruct istream *i_stream_create_limit(struct istream *input, uoff_t v_size)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen lstream->istream.iostream.destroy = i_stream_limit_destroy;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen lstream->istream.get_size = i_stream_limit_get_size;
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen lstream->istream.istream.readable_fd = input->readable_fd;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen lstream->istream.istream.blocking = input->blocking;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen lstream->istream.istream.seekable = input->seekable;