[dovecot-cvs] dovecot/src/lib-index/mbox istream-mbox.c,1.1,1.2

cras at procontrol.fi cras at procontrol.fi
Tue Oct 7 00:53:41 EEST 2003


Update of /home/cvs/dovecot/src/lib-index/mbox
In directory danu:/tmp/cvs-serv10755

Modified Files:
	istream-mbox.c 
Log Message:
bugfixes



Index: istream-mbox.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mbox/istream-mbox.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- istream-mbox.c	2 Sep 2003 22:33:33 -0000	1.1
+++ istream-mbox.c	6 Oct 2003 20:53:39 -0000	1.2
@@ -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 -



More information about the dovecot-cvs mailing list