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;