Mercurial > hg > nginx-mail
comparison src/os/unix/ngx_files.c @ 665:0b460e61bdcd default tip
Merge with nginx 1.0.0.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 25 Apr 2011 04:22:17 +0400 |
parents | bb20316269e4 |
children |
comparison
equal
deleted
inserted
replaced
572:06419a2298a9 | 665:0b460e61bdcd |
---|---|
6 | 6 |
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 | 9 |
10 | 10 |
11 #if (NGX_HAVE_FILE_AIO) | |
12 | |
13 ngx_uint_t ngx_file_aio = 1; | |
14 | |
15 #endif | |
16 | |
17 | |
11 ssize_t | 18 ssize_t |
12 ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) | 19 ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) |
13 { | 20 { |
14 ssize_t n; | 21 ssize_t n; |
15 | 22 |
20 | 27 |
21 n = pread(file->fd, buf, size, offset); | 28 n = pread(file->fd, buf, size, offset); |
22 | 29 |
23 if (n == -1) { | 30 if (n == -1) { |
24 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 31 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
25 "pread() failed, file \"%s\"", file->name.data); | 32 "pread() \"%s\" failed", file->name.data); |
26 return NGX_ERROR; | 33 return NGX_ERROR; |
27 } | 34 } |
28 | 35 |
29 #else | 36 #else |
30 | 37 |
31 if (file->sys_offset != offset) { | 38 if (file->sys_offset != offset) { |
32 if (lseek(file->fd, offset, SEEK_SET) == -1) { | 39 if (lseek(file->fd, offset, SEEK_SET) == -1) { |
33 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); | 40 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
41 "lseek() \"%s\" failed", file->name.data); | |
34 return NGX_ERROR; | 42 return NGX_ERROR; |
35 } | 43 } |
36 | 44 |
37 file->sys_offset = offset; | 45 file->sys_offset = offset; |
38 } | 46 } |
39 | 47 |
40 n = read(file->fd, buf, size); | 48 n = read(file->fd, buf, size); |
41 | 49 |
42 if (n == -1) { | 50 if (n == -1) { |
43 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "read() failed"); | 51 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
52 "read() \"%s\" failed", file->name.data); | |
44 return NGX_ERROR; | 53 return NGX_ERROR; |
45 } | 54 } |
46 | 55 |
47 file->sys_offset += n; | 56 file->sys_offset += n; |
48 | 57 |
55 | 64 |
56 | 65 |
57 ssize_t | 66 ssize_t |
58 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) | 67 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) |
59 { | 68 { |
60 ssize_t n; | 69 ssize_t n, written; |
61 | 70 |
62 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, | 71 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, |
63 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); | 72 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); |
64 | 73 |
74 written = 0; | |
75 | |
65 #if (NGX_HAVE_PWRITE) | 76 #if (NGX_HAVE_PWRITE) |
66 | 77 |
67 n = pwrite(file->fd, buf, size, offset); | 78 for ( ;; ) { |
68 | 79 n = pwrite(file->fd, buf + written, size, offset); |
69 if (n == -1) { | 80 |
70 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite() failed"); | 81 if (n == -1) { |
71 return NGX_ERROR; | 82 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
72 } | 83 "pwrite() \"%s\" failed", file->name.data); |
73 | 84 return NGX_ERROR; |
74 if ((size_t) n != size) { | 85 } |
75 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | 86 |
76 "pwrite() has written only %z of %uz", n, size); | 87 file->offset += n; |
77 return NGX_ERROR; | 88 written += n; |
89 | |
90 if ((size_t) n == size) { | |
91 return written; | |
92 } | |
93 | |
94 offset += n; | |
95 size -= n; | |
78 } | 96 } |
79 | 97 |
80 #else | 98 #else |
81 | 99 |
82 if (file->sys_offset != offset) { | 100 if (file->sys_offset != offset) { |
83 if (lseek(file->fd, offset, SEEK_SET) == -1) { | 101 if (lseek(file->fd, offset, SEEK_SET) == -1) { |
84 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); | 102 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
103 "lseek() \"%s\" failed", file->name.data); | |
85 return NGX_ERROR; | 104 return NGX_ERROR; |
86 } | 105 } |
87 | 106 |
88 file->sys_offset = offset; | 107 file->sys_offset = offset; |
89 } | 108 } |
90 | 109 |
91 n = write(file->fd, buf, size); | 110 for ( ;; ) { |
92 | 111 n = write(file->fd, buf + written, size); |
93 if (n == -1) { | 112 |
94 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "write() failed"); | 113 if (n == -1) { |
95 return NGX_ERROR; | 114 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
96 } | 115 "write() \"%s\" failed", file->name.data); |
97 | 116 return NGX_ERROR; |
98 if ((size_t) n != size) { | 117 } |
99 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | 118 |
100 "write() has written only %z of %uz", n, size); | 119 file->offset += n; |
101 return NGX_ERROR; | 120 written += n; |
102 } | 121 |
103 | 122 if ((size_t) n == size) { |
104 file->sys_offset += n; | 123 return written; |
105 | 124 } |
106 #endif | 125 |
107 | 126 size -= n; |
108 file->offset += n; | 127 } |
109 | 128 #endif |
110 return n; | |
111 } | 129 } |
112 | 130 |
113 | 131 |
114 ngx_fd_t | 132 ngx_fd_t |
115 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) | 133 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) |
189 } | 207 } |
190 | 208 |
191 if (file->sys_offset != offset) { | 209 if (file->sys_offset != offset) { |
192 if (lseek(file->fd, offset, SEEK_SET) == -1) { | 210 if (lseek(file->fd, offset, SEEK_SET) == -1) { |
193 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 211 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
194 "lseek() failed"); | 212 "lseek() \"%s\" failed", file->name.data); |
195 return NGX_ERROR; | 213 return NGX_ERROR; |
196 } | 214 } |
197 | 215 |
198 file->sys_offset = offset; | 216 file->sys_offset = offset; |
199 } | 217 } |
200 | 218 |
201 n = writev(file->fd, vec.elts, vec.nelts); | 219 n = writev(file->fd, vec.elts, vec.nelts); |
202 | 220 |
203 if (n == -1) { | 221 if (n == -1) { |
204 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 222 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
205 "writev() failed"); | 223 "writev() \"%s\" failed", file->name.data); |
206 return NGX_ERROR; | 224 return NGX_ERROR; |
207 } | 225 } |
208 | 226 |
209 if ((size_t) n != size) { | 227 if ((size_t) n != size) { |
210 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | 228 ngx_log_error(NGX_LOG_CRIT, file->log, 0, |
211 "writev() has written only %z of %uz", n, size); | 229 "writev() \"%s\" has written only %z of %uz", |
230 file->name.data, n, size); | |
212 return NGX_ERROR; | 231 return NGX_ERROR; |
213 } | 232 } |
214 | 233 |
215 file->sys_offset += n; | 234 file->sys_offset += n; |
216 file->offset += n; | 235 file->offset += n; |
224 ngx_int_t | 243 ngx_int_t |
225 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) | 244 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) |
226 { | 245 { |
227 struct timeval tv[2]; | 246 struct timeval tv[2]; |
228 | 247 |
229 tv[0].tv_sec = s; | 248 tv[0].tv_sec = ngx_time(); |
230 tv[0].tv_usec = 0; | 249 tv[0].tv_usec = 0; |
231 tv[1].tv_sec = s; | 250 tv[1].tv_sec = s; |
232 tv[1].tv_usec = 0; | 251 tv[1].tv_usec = 0; |
233 | 252 |
234 if (utimes((char *) name, tv) != -1) { | 253 if (utimes((char *) name, tv) != -1) { |
238 return NGX_ERROR; | 257 return NGX_ERROR; |
239 } | 258 } |
240 | 259 |
241 | 260 |
242 ngx_int_t | 261 ngx_int_t |
262 ngx_create_file_mapping(ngx_file_mapping_t *fm) | |
263 { | |
264 fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, | |
265 NGX_FILE_DEFAULT_ACCESS); | |
266 if (fm->fd == NGX_INVALID_FILE) { | |
267 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, | |
268 ngx_open_file_n " \"%s\" failed", fm->name); | |
269 return NGX_ERROR; | |
270 } | |
271 | |
272 if (ftruncate(fm->fd, fm->size) == -1) { | |
273 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, | |
274 "ftruncate() \"%s\" failed", fm->name); | |
275 goto failed; | |
276 } | |
277 | |
278 fm->addr = mmap(NULL, fm->size, PROT_READ|PROT_WRITE, MAP_SHARED, | |
279 fm->fd, 0); | |
280 if (fm->addr != MAP_FAILED) { | |
281 return NGX_OK; | |
282 } | |
283 | |
284 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, | |
285 "mmap(%uz) \"%s\" failed", fm->size, fm->name); | |
286 | |
287 failed: | |
288 | |
289 if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { | |
290 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, | |
291 ngx_close_file_n " \"%s\" failed", fm->name); | |
292 } | |
293 | |
294 return NGX_ERROR; | |
295 } | |
296 | |
297 | |
298 void | |
299 ngx_close_file_mapping(ngx_file_mapping_t *fm) | |
300 { | |
301 if (munmap(fm->addr, fm->size) == -1) { | |
302 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, | |
303 "munmap(%uz) \"%s\" failed", fm->size, fm->name); | |
304 } | |
305 | |
306 if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { | |
307 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, | |
308 ngx_close_file_n " \"%s\" failed", fm->name); | |
309 } | |
310 } | |
311 | |
312 | |
313 ngx_int_t | |
243 ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) | 314 ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) |
244 { | 315 { |
245 dir->dir = opendir((const char *) name->data); | 316 dir->dir = opendir((const char *) name->data); |
246 | 317 |
247 if (dir->dir == NULL) { | 318 if (dir->dir == NULL) { |
260 dir->de = readdir(dir->dir); | 331 dir->de = readdir(dir->dir); |
261 | 332 |
262 if (dir->de) { | 333 if (dir->de) { |
263 #if (NGX_HAVE_D_TYPE) | 334 #if (NGX_HAVE_D_TYPE) |
264 dir->type = dir->de->d_type; | 335 dir->type = dir->de->d_type; |
265 dir->valid_type = dir->type ? 1 : 0; | |
266 #else | 336 #else |
267 dir->valid_type = 0; | 337 dir->type = 0; |
268 #endif | 338 #endif |
269 return NGX_OK; | 339 return NGX_OK; |
270 } | 340 } |
271 | 341 |
272 return NGX_ERROR; | 342 return NGX_ERROR; |
382 | 452 |
383 return 0; | 453 return 0; |
384 } | 454 } |
385 | 455 |
386 | 456 |
457 #if (NGX_HAVE_POSIX_FADVISE) | |
458 | |
459 ngx_int_t | |
460 ngx_read_ahead(ngx_fd_t fd, size_t n) | |
461 { | |
462 int err; | |
463 | |
464 err = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); | |
465 | |
466 if (err == 0) { | |
467 return 0; | |
468 } | |
469 | |
470 ngx_set_errno(err); | |
471 return NGX_FILE_ERROR; | |
472 } | |
473 | |
474 #endif | |
475 | |
476 | |
387 #if (NGX_HAVE_O_DIRECT) | 477 #if (NGX_HAVE_O_DIRECT) |
388 | 478 |
389 ngx_int_t | 479 ngx_int_t |
390 ngx_directio_on(ngx_fd_t fd) | 480 ngx_directio_on(ngx_fd_t fd) |
391 { | 481 { |
392 int flags; | 482 int flags; |
393 | 483 |
394 flags = fcntl(fd, F_GETFL); | 484 flags = fcntl(fd, F_GETFL); |
395 | 485 |
396 if (flags == -1) { | 486 if (flags == -1) { |
397 return -1; | 487 return NGX_FILE_ERROR; |
398 } | 488 } |
399 | 489 |
400 return fcntl(fd, F_SETFL, flags | O_DIRECT); | 490 return fcntl(fd, F_SETFL, flags | O_DIRECT); |
401 } | 491 } |
402 | 492 |
407 int flags; | 497 int flags; |
408 | 498 |
409 flags = fcntl(fd, F_GETFL); | 499 flags = fcntl(fd, F_GETFL); |
410 | 500 |
411 if (flags == -1) { | 501 if (flags == -1) { |
412 return -1; | 502 return NGX_FILE_ERROR; |
413 } | 503 } |
414 | 504 |
415 return fcntl(fd, F_SETFL, flags & ~O_DIRECT); | 505 return fcntl(fd, F_SETFL, flags & ~O_DIRECT); |
416 } | 506 } |
417 | 507 |