Mercurial > dovecot > original-hg > dovecot-1.2
comparison src/lib-mail/istream-header-filter.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 | b9faf4db2a9f |
children | b1a27ed69e60 |
comparison
equal
deleted
inserted
replaced
9005:e87431fb8c90 | 9006:06bd1266f0c7 |
---|---|
293 static ssize_t i_stream_header_filter_read(struct istream_private *stream) | 293 static ssize_t i_stream_header_filter_read(struct istream_private *stream) |
294 { | 294 { |
295 struct header_filter_istream *mstream = | 295 struct header_filter_istream *mstream = |
296 (struct header_filter_istream *)stream; | 296 (struct header_filter_istream *)stream; |
297 ssize_t ret; | 297 ssize_t ret; |
298 size_t pos; | |
299 | 298 |
300 if (!mstream->header_read || | 299 if (!mstream->header_read || |
301 stream->istream.v_offset < mstream->header_size.virtual_size) { | 300 stream->istream.v_offset < mstream->header_size.virtual_size) { |
302 ret = read_header(mstream); | 301 ret = read_header(mstream); |
303 if (ret != -2 || stream->pos != stream->skip) | 302 if (ret != -2 || stream->pos != stream->skip) |
311 | 310 |
312 i_stream_seek(stream->parent, mstream->istream.parent_start_offset + | 311 i_stream_seek(stream->parent, mstream->istream.parent_start_offset + |
313 stream->istream.v_offset - | 312 stream->istream.v_offset - |
314 mstream->header_size.virtual_size + | 313 mstream->header_size.virtual_size + |
315 mstream->header_size.physical_size); | 314 mstream->header_size.physical_size); |
316 | 315 return i_stream_read_copy_from_parent(&stream->istream); |
317 stream->pos -= stream->skip; | |
318 stream->skip = 0; | |
319 | |
320 stream->buffer = i_stream_get_data(stream->parent, &pos); | |
321 if (pos <= stream->pos) { | |
322 if ((ret = i_stream_read(stream->parent)) == -2) { | |
323 i_assert(stream->skip != stream->pos); | |
324 return -2; | |
325 } | |
326 stream->istream.stream_errno = stream->parent->stream_errno; | |
327 stream->istream.eof = stream->parent->eof; | |
328 stream->buffer = i_stream_get_data(stream->parent, &pos); | |
329 } else { | |
330 ret = 0; | |
331 } | |
332 | |
333 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) : | |
334 (ret == 0 ? 0 : -1); | |
335 stream->pos = pos; | |
336 return ret; | |
337 } | 316 } |
338 | 317 |
339 static void parse_header(struct header_filter_istream *mstream) | 318 static void parse_header(struct header_filter_istream *mstream) |
340 { | 319 { |
341 size_t pos; | 320 size_t pos; |