[dovecot-cvs] dovecot/src/lib ostream-file.c,1.14,1.15

cras at procontrol.fi cras at procontrol.fi
Mon Mar 17 07:09:30 EET 2003


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

Modified Files:
	ostream-file.c 
Log Message:
file offset wasn't kept right.



Index: ostream-file.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/ostream-file.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- ostream-file.c	24 Feb 2003 18:15:18 -0000	1.14
+++ ostream-file.c	17 Mar 2003 05:09:28 -0000	1.15
@@ -486,7 +486,7 @@
 {
 	struct file_ostream *fstream = (struct file_ostream *) stream;
 	struct iovec iov;
-	ssize_t ret;
+	ssize_t ret = 0;
 
 	i_assert(size <= SSIZE_T_MAX);
 
@@ -498,7 +498,11 @@
 	    (!fstream->corked || !_have_space(stream, size))) {
 		iov.iov_base = (void *) data;
 		iov.iov_len = size;
+
 		ret = o_stream_writev(fstream, &iov, 1);
+		if (ret > 0)
+			stream->ostream.offset += ret;
+
 		if (ret < 0 || (size_t)ret == size)
 			return ret;
 
@@ -510,10 +514,10 @@
 		/* send it blocking */
 		if (o_stream_send_blocking(fstream, data, size) < 0)
 			return -1;
-		ret = (ssize_t)size;
+		ret += (ssize_t)size;
 	} else {
 		/* buffer it, at least partly */
-		ret = (ssize_t)o_stream_add(fstream, data, size);
+		ret += (ssize_t)o_stream_add(fstream, data, size);
 	}
 
 	stream->ostream.offset += ret;
@@ -595,13 +599,17 @@
 	struct iovec iov[3];
 	int iov_len;
 	const unsigned char *data;
-	size_t size;
+	size_t size, skip_size;
 	ssize_t ret;
 	int pos;
 
 	timeout_time = GET_TIMEOUT_TIME(foutstream);
 	iov_len = o_stream_fill_iovec(foutstream, iov);
 
+        skip_size = 0;
+	for (pos = 0; pos < iov_len; pos++)
+		skip_size += iov[pos].iov_len;
+
 	i_assert(!overlapping || iov_len == 0);
 
         start_offset = instream->v_offset;
@@ -631,12 +639,22 @@
 			/* error */
 			return -1;
 		}
-		outstream->ostream.offset += ret;
 
 		if (ret == 0 && !STREAM_IS_BLOCKING(foutstream)) {
 			/* don't block */
 			break;
 		}
+
+		if (skip_size > 0) {
+			if ((size_t)ret < skip_size) {
+				skip_size -= ret;
+				ret = 0;
+			} else {
+				ret -= skip_size;
+				skip_size = 0;
+			}
+		}
+		outstream->ostream.offset += ret;
 
 		if (timeout_time > 0 && time(NULL) > timeout_time) {
 			/* timeouted */




More information about the dovecot-cvs mailing list