Mercurial > hg > nginx
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 |