Mercurial > dovecot > original-hg > dovecot-1.2
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 |