[dovecot-cvs] dovecot/src/lib ostream-file.c,1.31,1.32

cras at dovecot.org cras at dovecot.org
Tue Aug 31 12:14:17 EEST 2004


Update of /home/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv24345

Modified Files:
	ostream-file.c 
Log Message:
Output stream sometimes duplicated data and sometimes lost data.



Index: ostream-file.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/ostream-file.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- ostream-file.c	23 Aug 2004 15:27:31 -0000	1.31
+++ ostream-file.c	31 Aug 2004 09:14:14 -0000	1.32
@@ -102,20 +102,17 @@
 	if (fstream->head < fstream->tail) {
 		/* ...HXXXT... */
 		used = fstream->tail - fstream->head;
-		fstream->head += I_MIN(used, size);
+		i_assert(size <= used);
+		fstream->head += size;
 	} else {
 		/* XXXT...HXXX */
 		used = fstream->buffer_size - fstream->head;
 		if (size > used) {
 			size -= used;
-			if (size < fstream->tail)
-				fstream->head = size;
-			else {
-				/* whole buffer is sent */
-				fstream->head = fstream->tail = 0;
-			}
+			i_assert(size <= fstream->tail);
+			fstream->head = size;
 		} else {
-			fstream->head += I_MIN(used, size);
+			fstream->head += size;
 		}
 
 		fstream->full = FALSE;
@@ -128,7 +125,6 @@
 		fstream->head = 0;
 }
 
-/* NOTE: modifies iov */
 static ssize_t o_stream_writev(struct file_ostream *fstream,
 			       const struct const_iovec *iov, int iov_size)
 {
@@ -158,9 +154,9 @@
 		if (iov_size <= UIO_MAXIOV) {
 			ret = writev(fstream->fd, (const struct iovec *)iov,
 				     iov_size);
-			if (ret > 0)
-				ret += sent;
 		}
+		if (ret > 0)
+			ret += sent;
 	}
 
 	if (ret < 0) {
@@ -373,7 +369,8 @@
 
 		if (unused > size-sent)
 			unused = size-sent;
-		memcpy(fstream->buffer + fstream->tail, data, unused);
+		memcpy(fstream->buffer + fstream->tail,
+		       CONST_PTR_OFFSET(data, sent), unused);
 		sent += unused;
 
 		fstream->tail += unused;



More information about the dovecot-cvs mailing list