From: Timo Sirainen Date: Wed, 6 Nov 2013 19:05:51 +0000 (+0200) Subject: istream: Added i_stream_init_parent() to lazily initialize the parent stream. X-Git-Tag: 2.2.8~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5f3151744f3ffa73b57391d4a237884b75423f57;p=thirdparty%2Fdovecot%2Fcore.git istream: Added i_stream_init_parent() to lazily initialize the parent stream. --- diff --git a/src/lib/istream-private.h b/src/lib/istream-private.h index 4077e604a6..80ede30210 100644 --- a/src/lib/istream-private.h +++ b/src/lib/istream-private.h @@ -52,6 +52,9 @@ struct istream_private { struct istream * ATTR_NOWARN_UNUSED_RESULT i_stream_create(struct istream_private *stream, struct istream *parent, int fd) ATTR_NULL(2); +/* Initialize parent lazily after i_stream_create() has already been called. */ +void i_stream_init_parent(struct istream_private *_stream, + struct istream *parent); void i_stream_compress(struct istream_private *stream); void i_stream_grow_buffer(struct istream_private *stream, size_t bytes); diff --git a/src/lib/istream.c b/src/lib/istream.c index 0154266a6a..c4a52980eb 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -703,22 +703,27 @@ i_stream_default_get_size(struct istream_private *stream, return 1; } +void i_stream_init_parent(struct istream_private *_stream, + struct istream *parent) +{ + _stream->access_counter = parent->real_stream->access_counter; + _stream->parent = parent; + _stream->parent_start_offset = parent->v_offset; + _stream->parent_expected_offset = parent->v_offset; + _stream->abs_start_offset = parent->v_offset + + parent->real_stream->abs_start_offset; + /* if parent stream is an istream-error, copy the error */ + _stream->istream.stream_errno = parent->stream_errno; + _stream->istream.eof = parent->eof; + i_stream_ref(parent); +} + struct istream * i_stream_create(struct istream_private *_stream, struct istream *parent, int fd) { _stream->fd = fd; - if (parent != NULL) { - _stream->access_counter = parent->real_stream->access_counter; - _stream->parent = parent; - _stream->parent_start_offset = parent->v_offset; - _stream->parent_expected_offset = parent->v_offset; - _stream->abs_start_offset = parent->v_offset + - parent->real_stream->abs_start_offset; - /* if parent stream is an istream-error, copy the error */ - _stream->istream.stream_errno = parent->stream_errno; - _stream->istream.eof = parent->eof; - i_stream_ref(parent); - } + if (parent != NULL) + i_stream_init_parent(_stream, parent); _stream->istream.real_stream = _stream; if (_stream->iostream.close == NULL)