comparison src/os/unix/ngx_files.c @ 542:4c5d2c627a6c NGINX_0_8_17

nginx 0.8.17 *) Security: now "/../" are disabled in "Destination" request header line. *) Change: now $host variable value is always low case. *) Feature: the $ssl_session_id variable. *) Bugfix: socket leak; the bug had appeared in 0.8.11.
author Igor Sysoev <http://sysoev.ru>
date Mon, 28 Sep 2009 00:00:00 +0400
parents 56baf312c1b5
children 0dc162a5f3e8
comparison
equal deleted inserted replaced
541:b8ac674b0ec9 542:4c5d2c627a6c
20 20
21 n = pread(file->fd, buf, size, offset); 21 n = pread(file->fd, buf, size, offset);
22 22
23 if (n == -1) { 23 if (n == -1) {
24 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, 24 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
25 "pread() failed, file \"%s\"", file->name.data); 25 "pread() \"%s\" failed", file->name.data);
26 return NGX_ERROR; 26 return NGX_ERROR;
27 } 27 }
28 28
29 #else 29 #else
30 30
31 if (file->sys_offset != offset) { 31 if (file->sys_offset != offset) {
32 if (lseek(file->fd, offset, SEEK_SET) == -1) { 32 if (lseek(file->fd, offset, SEEK_SET) == -1) {
33 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); 33 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
34 "lseek() \"%s\" failed", file->name.data);
34 return NGX_ERROR; 35 return NGX_ERROR;
35 } 36 }
36 37
37 file->sys_offset = offset; 38 file->sys_offset = offset;
38 } 39 }
39 40
40 n = read(file->fd, buf, size); 41 n = read(file->fd, buf, size);
41 42
42 if (n == -1) { 43 if (n == -1) {
43 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "read() failed"); 44 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
45 "read() \"%s\" failed", file->name.data);
44 return NGX_ERROR; 46 return NGX_ERROR;
45 } 47 }
46 48
47 file->sys_offset += n; 49 file->sys_offset += n;
48 50
55 57
56 58
57 ssize_t 59 ssize_t
58 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) 60 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
59 { 61 {
60 ssize_t n; 62 ssize_t n, written;
61 63
62 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, 64 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
63 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); 65 "write: %d, %p, %uz, %O", file->fd, buf, size, offset);
64 66
67 written = 0;
68
65 #if (NGX_HAVE_PWRITE) 69 #if (NGX_HAVE_PWRITE)
66 70
67 n = pwrite(file->fd, buf, size, offset); 71 for ( ;; ) {
68 72 n = pwrite(file->fd, buf, size, offset);
69 if (n == -1) { 73
70 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite() failed"); 74 if (n == -1) {
71 return NGX_ERROR; 75 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
72 } 76 "pwrite() \"%s\" failed", file->name.data);
73 77 return NGX_ERROR;
74 if ((size_t) n != size) { 78 }
75 ngx_log_error(NGX_LOG_CRIT, file->log, 0, 79
76 "pwrite() has written only %z of %uz", n, size); 80 file->offset += n;
77 return NGX_ERROR; 81 written += n;
82
83 if ((size_t) n == size) {
84 return written;
85 }
86
87 offset += n;
88 size -= n;
78 } 89 }
79 90
80 #else 91 #else
81 92
82 if (file->sys_offset != offset) { 93 if (file->sys_offset != offset) {
83 if (lseek(file->fd, offset, SEEK_SET) == -1) { 94 if (lseek(file->fd, offset, SEEK_SET) == -1) {
84 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); 95 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
96 "lseek() \"%s\" failed", file->name.data);
85 return NGX_ERROR; 97 return NGX_ERROR;
86 } 98 }
87 99
88 file->sys_offset = offset; 100 file->sys_offset = offset;
89 } 101 }
90 102
91 n = write(file->fd, buf, size); 103 for ( ;; ) {
92 104 n = write(file->fd, buf, size);
93 if (n == -1) { 105
94 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "write() failed"); 106 if (n == -1) {
95 return NGX_ERROR; 107 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
96 } 108 "write() \"%s\" failed", file->name.data);
97 109 return NGX_ERROR;
98 if ((size_t) n != size) { 110 }
99 ngx_log_error(NGX_LOG_CRIT, file->log, 0, 111
100 "write() has written only %z of %uz", n, size); 112 file->offset += n;
101 return NGX_ERROR; 113 written += n;
102 } 114
103 115 if ((size_t) n == size) {
104 file->sys_offset += n; 116 return written;
105 117 }
106 #endif 118
107 119 size -= n;
108 file->offset += n; 120 }
109 121 #endif
110 return n;
111 } 122 }
112 123
113 124
114 ngx_fd_t 125 ngx_fd_t
115 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) 126 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
189 } 200 }
190 201
191 if (file->sys_offset != offset) { 202 if (file->sys_offset != offset) {
192 if (lseek(file->fd, offset, SEEK_SET) == -1) { 203 if (lseek(file->fd, offset, SEEK_SET) == -1) {
193 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, 204 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
194 "lseek() failed"); 205 "lseek() \"%s\" failed", file->name.data);
195 return NGX_ERROR; 206 return NGX_ERROR;
196 } 207 }
197 208
198 file->sys_offset = offset; 209 file->sys_offset = offset;
199 } 210 }
200 211
201 n = writev(file->fd, vec.elts, vec.nelts); 212 n = writev(file->fd, vec.elts, vec.nelts);
202 213
203 if (n == -1) { 214 if (n == -1) {
204 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, 215 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
205 "writev() failed"); 216 "writev() \"%s\" failed", file->name.data);
206 return NGX_ERROR; 217 return NGX_ERROR;
207 } 218 }
208 219
209 if ((size_t) n != size) { 220 if ((size_t) n != size) {
210 ngx_log_error(NGX_LOG_CRIT, file->log, 0, 221 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
211 "writev() has written only %z of %uz", n, size); 222 "writev() \"%s\" has written only %z of %uz",
223 file->name.data, n, size);
212 return NGX_ERROR; 224 return NGX_ERROR;
213 } 225 }
214 226
215 file->sys_offset += n; 227 file->sys_offset += n;
216 file->offset += n; 228 file->offset += n;
392 int flags; 404 int flags;
393 405
394 flags = fcntl(fd, F_GETFL); 406 flags = fcntl(fd, F_GETFL);
395 407
396 if (flags == -1) { 408 if (flags == -1) {
397 return -1; 409 return NGX_FILE_ERROR;
398 } 410 }
399 411
400 return fcntl(fd, F_SETFL, flags | O_DIRECT); 412 return fcntl(fd, F_SETFL, flags | O_DIRECT);
401 } 413 }
402 414
407 int flags; 419 int flags;
408 420
409 flags = fcntl(fd, F_GETFL); 421 flags = fcntl(fd, F_GETFL);
410 422
411 if (flags == -1) { 423 if (flags == -1) {
412 return -1; 424 return NGX_FILE_ERROR;
413 } 425 }
414 426
415 return fcntl(fd, F_SETFL, flags & ~O_DIRECT); 427 return fcntl(fd, F_SETFL, flags & ~O_DIRECT);
416 } 428 }
417 429