comparison src/os/unix/ngx_files.c @ 4220:4be8dd8dd547

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 Thu, 20 Oct 2011 12:40:26 +0000
parents cf80c0b0109a
children 3203ddb78279
comparison
equal deleted inserted replaced
4219:691133126226 4220:4be8dd8dd547
151 ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, 151 ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
152 ngx_pool_t *pool) 152 ngx_pool_t *pool)
153 { 153 {
154 u_char *prev; 154 u_char *prev;
155 size_t size; 155 size_t size;
156 ssize_t n; 156 ssize_t total, n;
157 ngx_array_t vec; 157 ngx_array_t vec;
158 struct iovec *iov, iovs[NGX_IOVS]; 158 struct iovec *iov, iovs[NGX_IOVS];
159 159
160 /* use pwrite() if there is the only buf in a chain */ 160 /* use pwrite() if there is the only buf in a chain */
161 161
162 if (cl->next == NULL) { 162 if (cl->next == NULL) {
163 return ngx_write_file(file, cl->buf->pos, 163 return ngx_write_file(file, cl->buf->pos,
164 (size_t) (cl->buf->last - cl->buf->pos), 164 (size_t) (cl->buf->last - cl->buf->pos),
165 offset); 165 offset);
166 } 166 }
167
168 total = 0;
167 169
168 vec.elts = iovs; 170 vec.elts = iovs;
169 vec.size = sizeof(struct iovec); 171 vec.size = sizeof(struct iovec);
170 vec.nalloc = NGX_IOVS; 172 vec.nalloc = NGX_IOVS;
171 vec.pool = pool; 173 vec.pool = pool;
231 return NGX_ERROR; 233 return NGX_ERROR;
232 } 234 }
233 235
234 file->sys_offset += n; 236 file->sys_offset += n;
235 file->offset += n; 237 file->offset += n;
238 total += n;
236 239
237 } while (cl); 240 } while (cl);
238 241
239 return n; 242 return total;
240 } 243 }
241 244
242 245
243 ngx_int_t 246 ngx_int_t
244 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) 247 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)