comparison src/os/unix/ngx_files.c @ 3435:d65ba5392f59 stable-0.7

merge r3138, r3139, r3157, r3158, r3159, r3164, r3165, r3202, r3203, r3383, r3388, r3417, r3418: Win32 (mostly) and some Unix file related fixes: *) preserve errno while ngx_free() *) win32 ngx_file_info() utf8 support *) delete Win95 code *) log file name for read/write errors *) test incomplete WriteFile() *) handle short pwrite() to log an error cause: ENOSPC, EDQUOT, or EFBIG *) uniform ngx_directio_on/off() interface with other file functions *) do not create Win32 drive letter in ngx_create_full_path() *) ignore EACCES errors for top level directories in ngx_create_full_path() *) fix Win32 error messages when an temporary file replaces an existent file: *) do not rename an already renamed file *) now ngx_win32_rename_file() returns error code *) do not log failure inside ngx_win32_rename_file() *) fix Win32 error message when an temporary file replaces an existent file: return at once if ngx_win32_rename_file() was not failed and do not try to delete already the renamed temporary file *) skip URI trailing spaces under Win32 *) disable Win32 short file names
author Igor Sysoev <igor@sysoev.ru>
date Mon, 01 Feb 2010 15:06:25 +0000
parents 6b8284fc958d
children
comparison
equal deleted inserted replaced
3434:8d310fbeaa38 3435:d65ba5392f59
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;
391 int flags; 403 int flags;
392 404
393 flags = fcntl(fd, F_GETFL); 405 flags = fcntl(fd, F_GETFL);
394 406
395 if (flags == -1) { 407 if (flags == -1) {
396 return -1; 408 return NGX_FILE_ERROR;
397 } 409 }
398 410
399 return fcntl(fd, F_SETFL, flags | O_DIRECT); 411 return fcntl(fd, F_SETFL, flags | O_DIRECT);
400 } 412 }
401 413
406 int flags; 418 int flags;
407 419
408 flags = fcntl(fd, F_GETFL); 420 flags = fcntl(fd, F_GETFL);
409 421
410 if (flags == -1) { 422 if (flags == -1) {
411 return -1; 423 return NGX_FILE_ERROR;
412 } 424 }
413 425
414 return fcntl(fd, F_SETFL, flags & ~O_DIRECT); 426 return fcntl(fd, F_SETFL, flags & ~O_DIRECT);
415 } 427 }
416 428