comparison src/core/ngx_file.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 8c76116820f3
children b3cfbb1f0224
comparison
equal deleted inserted replaced
3434:8d310fbeaa38 3435:d65ba5392f59
181 ngx_create_full_path(u_char *dir, ngx_uint_t access) 181 ngx_create_full_path(u_char *dir, ngx_uint_t access)
182 { 182 {
183 u_char *p, ch; 183 u_char *p, ch;
184 ngx_err_t err; 184 ngx_err_t err;
185 185
186 for (p = dir + 1; *p; p++) { 186 err = 0;
187
188 #if (NGX_WIN32)
189 p = dir + 3;
190 #else
191 p = dir + 1;
192 #endif
193
194 for ( /* void */ ; *p; p++) {
187 ch = *p; 195 ch = *p;
188 196
189 if (ch != '/') { 197 if (ch != '/') {
190 continue; 198 continue;
191 } 199 }
192 200
193 *p = '\0'; 201 *p = '\0';
194 202
195 if (ngx_create_dir(dir, access) == NGX_FILE_ERROR) { 203 if (ngx_create_dir(dir, access) == NGX_FILE_ERROR) {
196 err = ngx_errno; 204 err = ngx_errno;
197 if (err != NGX_EEXIST) { 205
206 switch (err) {
207 case NGX_EEXIST:
208 err = 0;
209 case NGX_EACCES:
210 break;
211
212 default:
198 return err; 213 return err;
199 } 214 }
200 } 215 }
201 216
202 *p = '/'; 217 *p = '/';
203 } 218 }
204 219
205 return 0; 220 return err;
206 } 221 }
207 222
208 223
209 ngx_atomic_uint_t 224 ngx_atomic_uint_t
210 ngx_next_temp_number(ngx_uint_t collision) 225 ngx_next_temp_number(ngx_uint_t collision)
574 } 589 }
575 590
576 #if (NGX_WIN32) 591 #if (NGX_WIN32)
577 592
578 if (err == NGX_EEXIST) { 593 if (err == NGX_EEXIST) {
579 if (ngx_win32_rename_file(src, to, ext->log) == NGX_OK) { 594 err = ngx_win32_rename_file(src, to, ext->log);
580 595
581 if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) { 596 if (err == 0) {
582 return NGX_OK; 597 return NGX_OK;
583 }
584
585 err = ngx_errno;
586
587 } else {
588 err = 0;
589 } 598 }
590 } 599 }
591 600
592 #endif 601 #endif
593 602