comparison src/lib/istream.c @ 9006:06bd1266f0c7 HEAD

istreams: Fixed some parent stream seeking issues.
author Timo Sirainen <tss@iki.fi>
date Fri, 01 May 2009 14:50:08 -0400
parents 5e513d6612e0
children 70593ef74836
comparison
equal deleted inserted replaced
9005:e87431fb8c90 9006:06bd1266f0c7
100 break; 100 break;
101 } 101 }
102 return ret; 102 return ret;
103 } 103 }
104 104
105 ssize_t i_stream_read_copy_from_parent(struct istream *istream)
106 {
107 struct istream_private *stream = istream->real_stream;
108 size_t pos;
109 ssize_t ret;
110
111 stream->pos -= stream->skip;
112 stream->skip = 0;
113
114 stream->buffer = i_stream_get_data(stream->parent, &pos);
115 if (pos > stream->pos)
116 ret = 0;
117 else do {
118 if ((ret = i_stream_read(stream->parent)) == -2)
119 return -2;
120
121 stream->istream.stream_errno = stream->parent->stream_errno;
122 stream->istream.eof = stream->parent->eof;
123 stream->buffer = i_stream_get_data(stream->parent, &pos);
124 /* check again, in case the parent stream had been seeked
125 backwards and the previous read() didn't get us far
126 enough. */
127 } while (pos <= stream->pos && ret > 0);
128
129 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
130 (ret == 0 ? 0 : -1);
131 stream->pos = pos;
132 i_assert(ret != -1 || stream->istream.eof ||
133 stream->istream.stream_errno != 0);
134 return ret;
135 }
136
105 void i_stream_skip(struct istream *stream, uoff_t count) 137 void i_stream_skip(struct istream *stream, uoff_t count)
106 { 138 {
107 struct istream_private *_stream = stream->real_stream; 139 struct istream_private *_stream = stream->real_stream;
108 size_t data_size; 140 size_t data_size;
109 141