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