changeset 4351:d1d34de1a419 stable-1.0

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.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 13 Dec 2011 18:59:18 +0000
parents ea0f2e1f84d4
children 413b822f1efa
files src/os/unix/ngx_files.c
diffstat 1 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/unix/ngx_files.c	Tue Dec 13 18:46:07 2011 +0000
+++ b/src/os/unix/ngx_files.c	Tue Dec 13 18:59:18 2011 +0000
@@ -153,7 +153,7 @@
 {
     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 @@
                               offset);
     }
 
+    total = 0;
+
     vec.elts = iovs;
     vec.size = sizeof(struct iovec);
     vec.nalloc = NGX_IOVS;
@@ -202,8 +204,15 @@
 
         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 @@
 
         file->sys_offset += n;
         file->offset += n;
+        total += n;
 
     } while (cl);
 
-    return n;
+    return total;
 }