comparison src/core/ngx_file.c @ 5958:a9138c35120d

Core: added prefix-based temporary files. Now, if the "path" parameter is NULL, ngx_create_temp_file() will use file->name as a predefined file path prefix.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 26 Dec 2014 16:22:54 +0300
parents 570677a06dce
children 863d9de1e62b
comparison
equal deleted inserted replaced
5957:570677a06dce 5958:a9138c35120d
109 ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) 109 ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)
110 { 110 {
111 ngx_int_t rc; 111 ngx_int_t rc;
112 112
113 if (tf->file.fd == NGX_INVALID_FILE) { 113 if (tf->file.fd == NGX_INVALID_FILE) {
114 rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool, 114 rc = ngx_create_temp_file(&tf->file, tf->prefix ? NULL : tf->path,
115 tf->persistent, tf->clean, tf->access); 115 tf->pool, tf->persistent, tf->clean,
116 tf->access);
116 117
117 if (rc != NGX_OK) { 118 if (rc != NGX_OK) {
118 return rc; 119 return rc;
119 } 120 }
120 121
130 131
131 ngx_int_t 132 ngx_int_t
132 ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool, 133 ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
133 ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access) 134 ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)
134 { 135 {
136 u_char *p;
135 uint32_t n; 137 uint32_t n;
136 ngx_err_t err; 138 ngx_err_t err;
139 ngx_str_t prefix;
137 ngx_pool_cleanup_t *cln; 140 ngx_pool_cleanup_t *cln;
138 ngx_pool_cleanup_file_t *clnf; 141 ngx_pool_cleanup_file_t *clnf;
139 142
140 file->name.len = path->name.len + 1 + path->len + 10; 143 prefix = path ? path->name : file->name;
144 file->name.len = prefix.len + 1 + (path ? path->len : 0) + 10;
141 145
142 file->name.data = ngx_pnalloc(pool, file->name.len + 1); 146 file->name.data = ngx_pnalloc(pool, file->name.len + 1);
143 if (file->name.data == NULL) { 147 if (file->name.data == NULL) {
144 return NGX_ERROR; 148 return NGX_ERROR;
145 } 149 }
148 for (i = 0; i < file->name.len; i++) { 152 for (i = 0; i < file->name.len; i++) {
149 file->name.data[i] = 'X'; 153 file->name.data[i] = 'X';
150 } 154 }
151 #endif 155 #endif
152 156
153 ngx_memcpy(file->name.data, path->name.data, path->name.len); 157 p = ngx_cpymem(file->name.data, prefix.data, prefix.len);
158
159 if (path) {
160 p += 1 + path->len;
161
162 } else {
163 *p++ = '.';
164 }
154 165
155 n = (uint32_t) ngx_next_temp_number(0); 166 n = (uint32_t) ngx_next_temp_number(0);
156 167
157 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t)); 168 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
158 if (cln == NULL) { 169 if (cln == NULL) {
159 return NGX_ERROR; 170 return NGX_ERROR;
160 } 171 }
161 172
162 for ( ;; ) { 173 for ( ;; ) {
163 (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len, 174 (void) ngx_sprintf(p, "%010uD%Z", n);
164 "%010uD%Z", n); 175
165 176 if (path) {
166 ngx_create_hashed_filename(path, file->name.data, file->name.len); 177 ngx_create_hashed_filename(path, file->name.data, file->name.len);
178 }
167 179
168 ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, 180 ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
169 "hashed path: %s", file->name.data); 181 "hashed path: %s", file->name.data);
170 182
171 file->fd = ngx_open_tempfile(file->name.data, persistent, access); 183 file->fd = ngx_open_tempfile(file->name.data, persistent, access);
190 if (err == NGX_EEXIST) { 202 if (err == NGX_EEXIST) {
191 n = (uint32_t) ngx_next_temp_number(1); 203 n = (uint32_t) ngx_next_temp_number(1);
192 continue; 204 continue;
193 } 205 }
194 206
195 if ((path->level[0] == 0) || (err != NGX_ENOPATH)) { 207 if ((path == NULL) || (path->level[0] == 0) || (err != NGX_ENOPATH)) {
196 ngx_log_error(NGX_LOG_CRIT, file->log, err, 208 ngx_log_error(NGX_LOG_CRIT, file->log, err,
197 ngx_open_tempfile_n " \"%s\" failed", 209 ngx_open_tempfile_n " \"%s\" failed",
198 file->name.data); 210 file->name.data);
199 return NGX_ERROR; 211 return NGX_ERROR;
200 } 212 }