aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ngx_file.c')
-rw-r--r--src/core/ngx_file.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index 8359c0fee..b7dd4bca3 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -141,12 +141,27 @@ ngx_int_t
ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)
{
+ size_t levels;
+ u_char *p;
uint32_t n;
ngx_err_t err;
+ ngx_str_t name;
+ ngx_uint_t prefix;
ngx_pool_cleanup_t *cln;
ngx_pool_cleanup_file_t *clnf;
- file->name.len = path->name.len + 1 + path->len + 10;
+ if (file->name.len) {
+ name = file->name;
+ levels = 0;
+ prefix = 1;
+
+ } else {
+ name = path->name;
+ levels = path->len;
+ prefix = 0;
+ }
+
+ file->name.len = name.len + 1 + levels + 10;
file->name.data = ngx_pnalloc(pool, file->name.len + 1);
if (file->name.data == NULL) {
@@ -159,7 +174,13 @@ ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
}
#endif
- ngx_memcpy(file->name.data, path->name.data, path->name.len);
+ p = ngx_cpymem(file->name.data, name.data, name.len);
+
+ if (prefix) {
+ *p = '.';
+ }
+
+ p += 1 + levels;
n = (uint32_t) ngx_next_temp_number(0);
@@ -169,10 +190,11 @@ ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
}
for ( ;; ) {
- (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len,
- "%010uD%Z", n);
+ (void) ngx_sprintf(p, "%010uD%Z", n);
- ngx_create_hashed_filename(path, file->name.data, file->name.len);
+ if (!prefix) {
+ ngx_create_hashed_filename(path, file->name.data, file->name.len);
+ }
ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
"hashed path: %s", file->name.data);