changeset 6254:28b9873da2cc HEAD

If we do multiple writev() calls and the last one fails, we shouldn't treat all of it as a failure because some data was already sent. Also added some more asserts.
author Timo Sirainen <tss@iki.fi>
date Thu, 09 Aug 2007 21:26:02 +0300
parents f108845caaa1
children 4c48e42412ef
files src/lib/ostream-file.c
diffstat 1 files changed, 9 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/ostream-file.c	Thu Aug 09 21:03:20 2007 +0300
+++ b/src/lib/ostream-file.c	Thu Aug 09 21:26:02 2007 +0300
@@ -203,6 +203,8 @@
 		if (ret > 0) {
 			fstream->real_offset += ret;
 			ret += sent;
+		} else {
+			ret = sent;
 		}
 	}
 
@@ -461,7 +463,7 @@
 		      unsigned int iov_count)
 {
 	struct file_ostream *fstream = (struct file_ostream *)stream;
-	size_t size, added, optimal_size;
+	size_t size, total_size, added, optimal_size;
 	unsigned int i;
 	ssize_t ret = 0;
 
@@ -469,6 +471,7 @@
 
 	for (i = 0, size = 0; i < iov_count; i++)
 		size += iov[i].iov_len;
+	total_size = size;
 
 	if (size > get_unused_space(fstream) && !IS_STREAM_EMPTY(fstream)) {
 		if (_flush(stream) < 0)
@@ -485,13 +488,15 @@
 			return -1;
 
 		size = ret;
-		while (size > 0 && size >= iov[0].iov_len) {
+		while (size > 0 && iov_count > 0 && size >= iov[0].iov_len) {
 			size -= iov[0].iov_len;
 			iov++;
 			iov_count--;
 		}
 
-		if (iov_count > 0) {
+		if (iov_count == 0)
+			i_assert(size == 0);
+		else {
 			added = o_stream_add(fstream,
 					CONST_PTR_OFFSET(iov[0].iov_base, size),
 					iov[0].iov_len - size);
@@ -516,6 +521,7 @@
 			break;
 	}
 	stream->ostream.offset += ret;
+	i_assert(ret < (ssize_t)total_size);
 	return ret;
 }