[dovecot-cvs] dovecot/src/lib istream-internal.h,1.3,1.4 istream.c,1.7,1.8

cras at procontrol.fi cras at procontrol.fi
Fri Mar 21 00:31:39 EET 2003


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv14069/lib

Modified Files:
	istream-internal.h istream.c 
Log Message:
Fixes for resetting stream limits. Should fix some APPEND problems.



Index: istream-internal.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/istream-internal.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- istream-internal.h	7 Jan 2003 17:44:23 -0000	1.3
+++ istream-internal.h	20 Mar 2003 22:31:36 -0000	1.4
@@ -21,7 +21,7 @@
 	unsigned char *w_buffer; /* may be NULL */
 	size_t buffer_size;
 
-	size_t skip, pos;
+	size_t skip, pos, high_pos;
 };
 
 struct istream *_i_stream_create(struct _istream *_buf, pool_t pool, int fd,

Index: istream.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/istream.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- istream.c	10 Mar 2003 00:36:08 -0000	1.7
+++ istream.c	20 Mar 2003 22:31:36 -0000	1.8
@@ -76,13 +76,13 @@
 	diff = (off_t)stream->start_offset - (off_t)offset;
 	stream->start_offset = offset;
 	stream->v_offset += diff;
-	if (stream->v_size != 0) {
+	if (stream->v_size != 0)
 		stream->v_size += diff;
+	if (stream->v_limit != 0)
 		stream->v_limit += diff;
-	}
 
 	/* reset buffer data */
-	_stream->skip = _stream->pos = 0;
+	_stream->skip = _stream->pos = _stream->high_pos = 0;
 }
 
 void i_stream_set_read_limit(struct istream *stream, uoff_t v_offset)
@@ -92,6 +92,11 @@
 
 	i_assert(stream->v_size == 0 || v_offset <= stream->v_size);
 
+	if (_stream->high_pos != 0) {
+		_stream->pos = _stream->high_pos;
+		_stream->high_pos = 0;
+	}
+
 	if (v_offset == 0)
 		stream->v_limit = stream->v_size;
 	else {
@@ -99,8 +104,11 @@
 
 		stream->v_limit = v_offset;
 		max_pos = v_offset - stream->v_offset + _stream->skip;
-		if (_stream->pos > max_pos)
+		if (_stream->pos > max_pos) {
+			if (_stream->high_pos == 0)
+				_stream->high_pos = _stream->pos;
 			_stream->pos = max_pos;
+		}
 	}
 }
 
@@ -111,6 +119,11 @@
 	if (stream->closed)
 		return -1;
 
+	if (_stream->pos < _stream->high_pos) {
+		/* virtual limit reached */
+		return -1;
+	}
+
 	return _stream->read(_stream);
 }
 
@@ -137,7 +150,11 @@
 	count -= data_size;
 	stream->v_offset += data_size;
 
-	_stream->skip_count(_stream, count);
+	if (_stream->pos < _stream->high_pos) {
+		/* virtual limit reached */
+	} else {
+		_stream->skip_count(_stream, count);
+	}
 }
 
 void i_stream_seek(struct istream *stream, uoff_t v_offset)
@@ -237,7 +254,7 @@
 
 	while (_stream->pos - _stream->skip <= threshold) {
 		/* we need more data */
-		ret = _stream->read(_stream);
+		ret = i_stream_read(stream);
 		if (ret < 0)
 			break;
 	}




More information about the dovecot-cvs mailing list