Mercurial > dovecot > original-hg > dovecot-1.2
changeset 1809:2683523cc575 HEAD
bugfixes
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 06 Oct 2003 23:53:39 +0300 |
parents | 36d0e23dc231 |
children | e3ce78c545f0 |
files | src/lib-index/mbox/istream-mbox.c |
diffstat | 1 files changed, 22 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mbox/istream-mbox.c Mon Oct 06 23:17:19 2003 +0300 +++ b/src/lib-index/mbox/istream-mbox.c Mon Oct 06 23:53:39 2003 +0300 @@ -48,6 +48,8 @@ { struct mbox_istream *mstream = (struct mbox_istream *) stream; ssize_t ret; + uoff_t limit, old_limit; + off_t vsize_diff; if (stream->istream.v_offset < mstream->header_size.virtual_size) { /* we don't support mixing headers and body. @@ -55,17 +57,29 @@ return -2; } - if (mstream->input->v_offset - mstream->header_size.physical_size != - stream->istream.v_offset - mstream->header_size.virtual_size) { - i_stream_seek(mstream->input, stream->istream.v_offset - - mstream->header_size.virtual_size + - mstream->header_size.physical_size); + /* may be positive or negative, depending on how much there was CRs + and how much headers were hidden */ + vsize_diff = mstream->header_size.virtual_size - + mstream->header_size.physical_size; + + limit = stream->istream.v_limit - vsize_diff; + old_limit = mstream->input->v_limit; + if (limit != old_limit) + i_stream_set_read_limit(mstream->input, limit); + + if (mstream->input->v_offset != stream->istream.v_offset - vsize_diff) { + i_stream_seek(mstream->input, + stream->istream.v_offset - vsize_diff); } ret = i_stream_read(mstream->input); + mstream->istream.skip = 0; mstream->istream.buffer = i_stream_get_data(mstream->input, &mstream->istream.pos); + + if (limit != old_limit) + i_stream_set_read_limit(mstream->input, old_limit); return ret; } @@ -77,11 +91,12 @@ if (v_offset < mstream->header_size.virtual_size) { /* still in headers */ stream->skip = v_offset; - stream->pos = mstream->header_size.virtual_size; + stream->pos = stream->high_pos = + mstream->header_size.virtual_size; stream->buffer = buffer_get_data(mstream->headers, NULL); } else { /* body - use our real input stream */ - stream->skip = stream->pos = 0; + stream->skip = stream->pos = stream->high_pos = 0; stream->buffer = NULL; v_offset += mstream->header_size.physical_size -