Mercurial > dovecot > original-hg > dovecot-1.2
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; }