comparison src/core/ngx_file.c @ 1695:8c4532a48b0a

ngx_create_path_and_rename_file()
author Igor Sysoev <igor@sysoev.ru>
date Fri, 07 Dec 2007 20:22:03 +0000
parents e958b3cab51a
children e584e946e198
comparison
equal deleted inserted replaced
1694:8c696afe46b3 1695:8c4532a48b0a
481 return NGX_OK; 481 return NGX_OK;
482 } 482 }
483 483
484 484
485 ngx_int_t 485 ngx_int_t
486 ngx_create_path_and_rename_file(ngx_str_t *src, ngx_str_t *to,
487 ngx_uint_t access, ngx_uint_t full_path, ngx_uint_t delete, ngx_log_t *log)
488 {
489 ngx_err_t err;
490
491 #if !(NGX_WIN32)
492
493 if (ngx_change_file_access(src->data, access) == NGX_FILE_ERROR) {
494 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
495 ngx_change_file_access_n " \"%s\" failed", src->data);
496 err = 0;
497 goto failed;
498 }
499
500 #endif
501
502 if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
503 return NGX_OK;
504 }
505
506 err = ngx_errno;
507
508 if (err == NGX_ENOENT) {
509
510 if (!full_path) {
511 goto failed;
512 }
513
514 err = ngx_create_full_path(to->data, ngx_dir_access(access));
515
516 if (err) {
517 ngx_log_error(NGX_LOG_CRIT, log, err,
518 ngx_create_dir_n " \"%s\" failed", to->data);
519 err = 0;
520 goto failed;
521 }
522
523 if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
524 return NGX_OK;
525 }
526
527 err = ngx_errno;
528 goto failed;
529 }
530
531 #if (NGX_WIN32)
532
533 if (err == NGX_EEXIST) {
534 if (ngx_win32_rename_file(src, to, log) == NGX_OK) {
535
536 if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
537 return NGX_OK;
538 }
539
540 err = ngx_errno;
541
542 } else {
543 err = 0;
544 }
545 }
546
547 #endif
548
549 failed:
550
551 if (delete) {
552 if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {
553 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
554 ngx_delete_file_n " \"%s\" failed", src->data);
555 }
556 }
557
558 if (err) {
559 ngx_log_error(NGX_LOG_CRIT, log, err,
560 ngx_rename_file_n " \"%s\" to \"%s\" failed",
561 src->data, to->data);
562 }
563
564 return NGX_ERROR;
565 }
566
567
568 ngx_int_t
486 ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree) 569 ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree)
487 { 570 {
488 void *data, *prev; 571 void *data, *prev;
489 u_char *p, *name; 572 u_char *p, *name;
490 size_t len; 573 size_t len;