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.
Maxim Dounin
10 years ago
152 | 152 | { |
153 | 153 | u_char *prev; |
154 | 154 | size_t size; |
155 | ssize_t n; | |
155 | ssize_t total, n; | |
156 | 156 | ngx_array_t vec; |
157 | 157 | struct iovec *iov, iovs[NGX_IOVS]; |
158 | 158 | |
163 | 163 | (size_t) (cl->buf->last - cl->buf->pos), |
164 | 164 | offset); |
165 | 165 | } |
166 | ||
167 | total = 0; | |
166 | 168 | |
167 | 169 | vec.elts = iovs; |
168 | 170 | vec.size = sizeof(struct iovec); |
201 | 203 | |
202 | 204 | if (vec.nelts == 1) { |
203 | 205 | iov = vec.elts; |
204 | return ngx_write_file(file, (u_char *) iov[0].iov_base, | |
205 | iov[0].iov_len, offset); | |
206 | ||
207 | n = ngx_write_file(file, (u_char *) iov[0].iov_base, | |
208 | iov[0].iov_len, offset); | |
209 | ||
210 | if (n == NGX_ERROR) { | |
211 | return n; | |
212 | } | |
213 | ||
214 | return total + n; | |
206 | 215 | } |
207 | 216 | |
208 | 217 | if (file->sys_offset != offset) { |
232 | 241 | |
233 | 242 | file->sys_offset += n; |
234 | 243 | file->offset += n; |
244 | total += n; | |
235 | 245 | |
236 | 246 | } while (cl); |
237 | 247 | |
238 | return n; | |
248 | return total; | |
239 | 249 | } |
240 | 250 | |
241 | 251 |