dovecot-2.0: Simplified up istream-limit implementation.

dovecot at dovecot.org dovecot at dovecot.org
Mon Mar 8 15:41:05 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/d49913d2d75a
changeset: 10854:d49913d2d75a
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Mar 08 15:29:41 2010 +0200
description:
Simplified up istream-limit implementation.

diffstat:

 src/lib/istream-limit.c |  47 ++++++++++++++---------------------------------
 1 files changed, 14 insertions(+), 33 deletions(-)

diffs (70 lines):

diff -r b1d5982ffd14 -r d49913d2d75a src/lib/istream-limit.c
--- a/src/lib/istream-limit.c	Sat Mar 06 16:34:52 2010 +0200
+++ b/src/lib/istream-limit.c	Mon Mar 08 15:29:41 2010 +0200
@@ -29,45 +29,25 @@
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 	uoff_t left;
 	ssize_t ret;
-	size_t pos;
 
-	if (stream->istream.v_offset +
-	    (stream->pos - stream->skip) >= lstream->v_size) {
+	i_assert(stream->istream.v_offset +
+		 (stream->pos - stream->skip) <= lstream->v_size);
+	left = lstream->v_size -
+		(stream->istream.v_offset + (stream->pos - stream->skip));
+	if (left == 0) {
 		stream->istream.eof = TRUE;
 		return -1;
 	}
 
-	i_stream_seek(stream->parent, lstream->istream.parent_start_offset +
-		      stream->istream.v_offset);
-
-	stream->pos -= stream->skip;
-	stream->skip = 0;
-
-	stream->buffer = i_stream_get_data(stream->parent, &pos);
-	if (pos > stream->pos)
-		ret = 0;
-	else do {
-		if ((ret = i_stream_read(stream->parent)) == -2)
-			return -2;
-
-		stream->istream.stream_errno = stream->parent->stream_errno;
-		stream->istream.eof = stream->parent->eof;
-		stream->buffer = i_stream_get_data(stream->parent, &pos);
-	} while (pos <= stream->pos && ret > 0);
-
-	if (lstream->v_size != (uoff_t)-1) {
-		left = lstream->v_size - stream->istream.v_offset;
-		if (pos >= left) {
-			pos = left;
-			stream->istream.eof = TRUE;
-		}
+	i_stream_skip(stream->parent, stream->skip);
+	ret = i_stream_read_copy_from_parent(&stream->istream);
+	i_assert(stream->skip == 0);
+	if (ret >= (off_t)left) {
+		stream->pos -= ret - left;
+		ret = left;
+		stream->istream.eof = TRUE;
 	}
-
-	ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
-		(ret == 0 ? 0 : -1);
-	stream->pos = pos;
-	i_assert(ret != -1 || stream->istream.eof ||
-		 stream->istream.stream_errno != 0);
+	i_assert(stream->istream.v_offset + stream->pos <= lstream->v_size);
 	return ret;
 }
 
@@ -78,6 +58,7 @@
 
 	i_assert(v_offset <= lstream->v_size);
 
+	i_stream_seek(stream->parent, stream->parent_start_offset + v_offset);
 	stream->istream.v_offset = v_offset;
 	stream->skip = stream->pos = 0;
 }


More information about the dovecot-cvs mailing list