diff options
| author | Maxim Dounin <mdounin@mdounin.ru> | 2011-12-13 18:59:18 +0000 |
|---|---|---|
| committer | Maxim Dounin <mdounin@mdounin.ru> | 2011-12-13 18:59:18 +0000 |
| commit | b993b9ded79794222c1ecbc7f0c46cb6163530f2 (patch) | |
| tree | a71ffd3fb8bdad4f86377b60ed3a1144a54a0a37 | |
| parent | 3a8f4c11411d9cf142d5a37c4ec32ed34fcd0d96 (diff) | |
| download | nginx-b993b9ded79794222c1ecbc7f0c46cb6163530f2.tar.gz nginx-b993b9ded79794222c1ecbc7f0c46cb6163530f2.tar.bz2 | |
Merge of r4221, r4222:
Fixed unix ngx_write_chain_to_file() to return total bytes written.
Previously result of last iteration's writev() was returned. This was
unnoticed as return value was only used if chain contained only one or
two buffers.
| -rw-r--r-- | src/os/unix/ngx_files.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index 89ab8d6bc..ad26d2752 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -153,7 +153,7 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, { u_char *prev; size_t size; - ssize_t n; + ssize_t total, n; ngx_array_t vec; struct iovec *iov, iovs[NGX_IOVS]; @@ -165,6 +165,8 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, offset); } + total = 0; + vec.elts = iovs; vec.size = sizeof(struct iovec); vec.nalloc = NGX_IOVS; @@ -202,8 +204,15 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, if (vec.nelts == 1) { iov = vec.elts; - return ngx_write_file(file, (u_char *) iov[0].iov_base, - iov[0].iov_len, offset); + + n = ngx_write_file(file, (u_char *) iov[0].iov_base, + iov[0].iov_len, offset); + + if (n == NGX_ERROR) { + return n; + } + + return total + n; } if (file->sys_offset != offset) { @@ -233,10 +242,11 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, file->sys_offset += n; file->offset += n; + total += n; } while (cl); - return n; + return total; } |
