aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_file.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-12-07 20:22:03 +0000
committerIgor Sysoev <igor@sysoev.ru>2007-12-07 20:22:03 +0000
commite9af690e6168a1be972c5adcddd9e64b8e75de56 (patch)
tree89d0b94b7ae8e3d089d754cd9707f0b9dfd046df /src/core/ngx_file.c
parentac7586e9520861a78146afe387c981d6be9b4d7b (diff)
downloadnginx-e9af690e6168a1be972c5adcddd9e64b8e75de56.tar.gz
nginx-e9af690e6168a1be972c5adcddd9e64b8e75de56.zip
ngx_create_path_and_rename_file()
Diffstat (limited to 'src/core/ngx_file.c')
-rw-r--r--src/core/ngx_file.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index f85578623..c945b558d 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -483,6 +483,89 @@ ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user)
ngx_int_t
+ngx_create_path_and_rename_file(ngx_str_t *src, ngx_str_t *to,
+ ngx_uint_t access, ngx_uint_t full_path, ngx_uint_t delete, ngx_log_t *log)
+{
+ ngx_err_t err;
+
+#if !(NGX_WIN32)
+
+ if (ngx_change_file_access(src->data, access) == NGX_FILE_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
+ ngx_change_file_access_n " \"%s\" failed", src->data);
+ err = 0;
+ goto failed;
+ }
+
+#endif
+
+ if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
+ return NGX_OK;
+ }
+
+ err = ngx_errno;
+
+ if (err == NGX_ENOENT) {
+
+ if (!full_path) {
+ goto failed;
+ }
+
+ err = ngx_create_full_path(to->data, ngx_dir_access(access));
+
+ if (err) {
+ ngx_log_error(NGX_LOG_CRIT, log, err,
+ ngx_create_dir_n " \"%s\" failed", to->data);
+ err = 0;
+ goto failed;
+ }
+
+ if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
+ return NGX_OK;
+ }
+
+ err = ngx_errno;
+ goto failed;
+ }
+
+#if (NGX_WIN32)
+
+ if (err == NGX_EEXIST) {
+ if (ngx_win32_rename_file(src, to, log) == NGX_OK) {
+
+ if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {
+ return NGX_OK;
+ }
+
+ err = ngx_errno;
+
+ } else {
+ err = 0;
+ }
+ }
+
+#endif
+
+failed:
+
+ if (delete) {
+ if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
+ ngx_delete_file_n " \"%s\" failed", src->data);
+ }
+ }
+
+ if (err) {
+ ngx_log_error(NGX_LOG_CRIT, log, err,
+ ngx_rename_file_n " \"%s\" to \"%s\" failed",
+ src->data, to->data);
+ }
+
+ return NGX_ERROR;
+}
+
+
+ngx_int_t
ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree)
{
void *data, *prev;