istream.c revision 7b42d6cbee8186195d8c5e66078043a0fa1f25c1
b9f30617c2c96d54acbc4f85ed17b939c4f28916Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid i_stream_set_name(struct istream *stream, const char *name)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen stream->real_stream->iostream.name = i_strdup(name);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenconst char *i_stream_get_name(struct istream *stream)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen while (stream->real_stream->iostream.name == NULL) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen io_stream_ref(&stream->real_stream->iostream);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct istream_private *_stream = (*stream)->real_stream;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen io_stream_unref(&(*stream)->real_stream->iostream);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid i_stream_set_destroy_callback(struct istream *stream,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct iostream_private *iostream = &stream->real_stream->iostream;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct istream_private *_stream = stream->real_stream;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen io_stream_close(&stream->real_stream->iostream);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid i_stream_set_init_buffer_size(struct istream *stream, size_t size)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid i_stream_set_max_buffer_size(struct istream *stream, size_t max_size)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen io_stream_set_max_buffer_size(&stream->real_stream->iostream, max_size);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainensize_t i_stream_get_max_buffer_size(struct istream *stream)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid i_stream_set_return_partial_line(struct istream *stream, bool set)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void i_stream_update(struct istream_private *stream)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen stream->parent_expected_offset = stream->parent->v_offset;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct istream_private *_stream = stream->real_stream;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_stream_seek(_stream->parent, _stream->parent_expected_offset);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* error handling should be easier if we now just
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen assume the stream is now at EOF */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_assert((size_t)ret+old_size == _stream->pos - _stream->skip);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenssize_t i_stream_read_copy_from_parent(struct istream *istream)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct istream_private *stream = istream->real_stream;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if ((ret = i_stream_read(stream->parent)) == -2)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen stream->istream.stream_errno = stream->parent->stream_errno;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen stream->buffer = i_stream_get_data(stream->parent, &pos);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* check again, in case the parent stream had been seeked
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen backwards and the previous read() didn't get us far
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenvoid i_stream_skip(struct istream *stream, uoff_t count)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct istream_private *_stream = stream->real_stream;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* within buffer */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen /* have to seek forward */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen _stream->seek(_stream, stream->v_offset + count, FALSE);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic bool i_stream_can_optimize_seek(struct istream_private *stream)
return TRUE;
return FALSE;
return NULL;
char *ret;
end = i;
return ret;
return NULL;
const unsigned char *pos;
return NULL;
return NULL;
char *line;
return line;
*size_r = 0;
return NULL;
*size_r = 0;
return NULL;
if (ret > 0)
} while (ret > 0);
if (ret == 0) {
if (read_more) {
return FALSE;
return TRUE;
if (available == 0) {
static const struct stat *
struct istream *