Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3396:a176b7d20895 HEAD
Seekable stream was broken after its memory limit was reached and it started
using temporary file.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 28 May 2005 15:17:40 +0300 |
parents | 5573554dce0c |
children | 2db396230881 |
files | src/lib/istream-seekable.c |
diffstat | 1 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/istream-seekable.c Sat May 28 14:31:19 2005 +0300 +++ b/src/lib/istream-seekable.c Sat May 28 15:17:40 2005 +0300 @@ -199,7 +199,7 @@ { struct seekable_istream *sstream = (struct seekable_istream *)stream; const unsigned char *data; - size_t size; + size_t size, pos; ssize_t ret; stream->buffer = CONST_PTR_OFFSET(stream->buffer, stream->skip); @@ -215,6 +215,7 @@ i_stream_close(&stream->istream); return -1; } + i_assert(sstream->buffer == NULL); } while (stream->istream.v_offset + stream->pos >= sstream->write_peak) { @@ -231,6 +232,7 @@ i_stream_close(&stream->istream); return -1; } + i_stream_sync(sstream->fd_input); i_stream_skip(sstream->cur_input, size); sstream->write_peak += size; } @@ -242,6 +244,14 @@ stream->istream.stream_errno = sstream->fd_input->stream_errno; } + + stream->buffer = i_stream_get_data(sstream->fd_input, &pos); + stream->pos -= stream->skip; + stream->skip = 0; + + ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) : + (ret == 0 ? 0 : -1); + stream->pos = pos; return ret; } @@ -264,8 +274,10 @@ i_stream_skip(&stream->istream, stream->skip); } while ((ret = _read(stream)) > 0); - if (ret == 0) - i_panic("get_size() used for non-blocking stream"); + if (ret == 0) { + i_panic("i_stream_stat() used for non-blocking " + "seekable stream"); + } i_stream_seek(&stream->istream, old_offset); }