void i_stream_default_seek_nonseekable(struct istream_private *stream,
uoff_t v_offset, bool mark);
+struct istream *i_stream_get_root_io(struct istream *stream);
void i_stream_set_io(struct istream *stream, struct io *io);
void i_stream_unset_io(struct istream *stream, struct io *io);
return TRUE;
}
-void i_stream_set_input_pending(struct istream *stream, bool pending)
+struct istream *i_stream_get_root_io(struct istream *stream)
{
- if (!pending)
- return;
-
while (stream->real_stream->parent != NULL) {
i_assert(stream->real_stream->io == NULL);
stream = stream->real_stream->parent;
}
+ return stream;
+}
+
+void i_stream_set_input_pending(struct istream *stream, bool pending)
+{
+ if (!pending)
+ return;
+
+ stream = i_stream_get_root_io(stream);
if (stream->real_stream->io != NULL)
io_set_pending(stream->real_stream->io);
}
void i_stream_set_io(struct istream *stream, struct io *io)
{
- while (stream->real_stream->parent != NULL) {
- i_assert(stream->real_stream->io == NULL);
- stream = stream->real_stream->parent;
- }
+ stream = i_stream_get_root_io(stream);
i_assert(stream->real_stream->io == NULL);
stream->real_stream->io = io;
void i_stream_unset_io(struct istream *stream, struct io *io)
{
- while (stream->real_stream->parent != NULL) {
- i_assert(stream->real_stream->io == NULL);
- stream = stream->real_stream->parent;
- }
+ stream = i_stream_get_root_io(stream);
i_assert(stream->real_stream->io == io);
stream->real_stream->io = NULL;