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);
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)