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);
 	}