File: | core/ngx_file.c |
Location: | line 1008, column 13 |
Description: | Null pointer passed as an argument to a 'nonnull' parameter |
1 | ||||||
2 | /* | |||||
3 | * Copyright (C) Igor Sysoev | |||||
4 | * Copyright (C) Nginx, Inc. | |||||
5 | */ | |||||
6 | ||||||
7 | ||||||
8 | #include <ngx_config.h> | |||||
9 | #include <ngx_core.h> | |||||
10 | ||||||
11 | ||||||
12 | static ngx_int_t ngx_test_full_name(ngx_str_t *name); | |||||
13 | ||||||
14 | ||||||
15 | static ngx_atomic_t temp_number = 0; | |||||
16 | ngx_atomic_t *ngx_temp_number = &temp_number; | |||||
17 | ngx_atomic_int_t ngx_random_number = 123456; | |||||
18 | ||||||
19 | ||||||
20 | ngx_int_t | |||||
21 | ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name) | |||||
22 | { | |||||
23 | size_t len; | |||||
24 | u_char *p, *n; | |||||
25 | ngx_int_t rc; | |||||
26 | ||||||
27 | rc = ngx_test_full_name(name); | |||||
28 | ||||||
29 | if (rc == NGX_OK0) { | |||||
30 | return rc; | |||||
31 | } | |||||
32 | ||||||
33 | len = prefix->len; | |||||
34 | ||||||
35 | #if (NGX_WIN32) | |||||
36 | ||||||
37 | if (rc == 2) { | |||||
38 | len = rc; | |||||
39 | } | |||||
40 | ||||||
41 | #endif | |||||
42 | ||||||
43 | n = ngx_pnalloc(pool, len + name->len + 1); | |||||
44 | if (n == NULL((void*)0)) { | |||||
45 | return NGX_ERROR-1; | |||||
46 | } | |||||
47 | ||||||
48 | p = ngx_cpymem(n, prefix->data, len)(((u_char *) memcpy(n, prefix->data, len)) + (len)); | |||||
49 | ngx_cpystrn(p, name->data, name->len + 1); | |||||
50 | ||||||
51 | name->len += len; | |||||
52 | name->data = n; | |||||
53 | ||||||
54 | return NGX_OK0; | |||||
55 | } | |||||
56 | ||||||
57 | ||||||
58 | static ngx_int_t | |||||
59 | ngx_test_full_name(ngx_str_t *name) | |||||
60 | { | |||||
61 | #if (NGX_WIN32) | |||||
62 | u_char c0, c1; | |||||
63 | ||||||
64 | c0 = name->data[0]; | |||||
65 | ||||||
66 | if (name->len < 2) { | |||||
67 | if (c0 == '/') { | |||||
68 | return 2; | |||||
69 | } | |||||
70 | ||||||
71 | return NGX_DECLINED-5; | |||||
72 | } | |||||
73 | ||||||
74 | c1 = name->data[1]; | |||||
75 | ||||||
76 | if (c1 == ':') { | |||||
77 | c0 |= 0x20; | |||||
78 | ||||||
79 | if ((c0 >= 'a' && c0 <= 'z')) { | |||||
80 | return NGX_OK0; | |||||
81 | } | |||||
82 | ||||||
83 | return NGX_DECLINED-5; | |||||
84 | } | |||||
85 | ||||||
86 | if (c1 == '/') { | |||||
87 | return NGX_OK0; | |||||
88 | } | |||||
89 | ||||||
90 | if (c0 == '/') { | |||||
91 | return 2; | |||||
92 | } | |||||
93 | ||||||
94 | return NGX_DECLINED-5; | |||||
95 | ||||||
96 | #else | |||||
97 | ||||||
98 | if (name->data[0] == '/') { | |||||
99 | return NGX_OK0; | |||||
100 | } | |||||
101 | ||||||
102 | return NGX_DECLINED-5; | |||||
103 | ||||||
104 | #endif | |||||
105 | } | |||||
106 | ||||||
107 | ||||||
108 | ssize_t | |||||
109 | ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) | |||||
110 | { | |||||
111 | ngx_int_t rc; | |||||
112 | ||||||
113 | if (tf->file.fd == NGX_INVALID_FILE-1) { | |||||
114 | rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool, | |||||
115 | tf->persistent, tf->clean, tf->access); | |||||
116 | ||||||
117 | if (rc != NGX_OK0) { | |||||
118 | return rc; | |||||
119 | } | |||||
120 | ||||||
121 | if (tf->log_level) { | |||||
122 | ngx_log_error(tf->log_level, tf->file.log, 0, "%s %V",if ((tf->file.log)->log_level >= tf->log_level) ngx_log_error_core (tf->log_level, tf->file.log, 0, "%s %V", tf->warn, & tf->file.name) | |||||
123 | tf->warn, &tf->file.name)if ((tf->file.log)->log_level >= tf->log_level) ngx_log_error_core (tf->log_level, tf->file.log, 0, "%s %V", tf->warn, & tf->file.name); | |||||
124 | } | |||||
125 | } | |||||
126 | ||||||
127 | #if (NGX_THREADS && NGX_HAVE_PWRITEV1) | |||||
128 | ||||||
129 | if (tf->thread_write) { | |||||
130 | return ngx_thread_write_chain_to_file(&tf->file, chain, tf->offset, | |||||
131 | tf->pool); | |||||
132 | } | |||||
133 | ||||||
134 | #endif | |||||
135 | ||||||
136 | return ngx_write_chain_to_file(&tf->file, chain, tf->offset, tf->pool); | |||||
137 | } | |||||
138 | ||||||
139 | ||||||
140 | ngx_int_t | |||||
141 | ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool, | |||||
142 | ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access) | |||||
143 | { | |||||
144 | uint32_t n; | |||||
145 | ngx_err_t err; | |||||
146 | ngx_pool_cleanup_t *cln; | |||||
147 | ngx_pool_cleanup_file_t *clnf; | |||||
148 | ||||||
149 | file->name.len = path->name.len + 1 + path->len + 10; | |||||
150 | ||||||
151 | file->name.data = ngx_pnalloc(pool, file->name.len + 1); | |||||
152 | if (file->name.data == NULL((void*)0)) { | |||||
153 | return NGX_ERROR-1; | |||||
154 | } | |||||
155 | ||||||
156 | #if 0 | |||||
157 | for (i = 0; i < file->name.len; i++) { | |||||
158 | file->name.data[i] = 'X'; | |||||
159 | } | |||||
160 | #endif | |||||
161 | ||||||
162 | ngx_memcpy(file->name.data, path->name.data, path->name.len)(void) memcpy(file->name.data, path->name.data, path-> name.len); | |||||
163 | ||||||
164 | n = (uint32_t) ngx_next_temp_number(0); | |||||
165 | ||||||
166 | cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t)); | |||||
167 | if (cln == NULL((void*)0)) { | |||||
168 | return NGX_ERROR-1; | |||||
169 | } | |||||
170 | ||||||
171 | for ( ;; ) { | |||||
172 | (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len, | |||||
173 | "%010uD%Z", n); | |||||
174 | ||||||
175 | ngx_create_hashed_filename(path, file->name.data, file->name.len); | |||||
176 | ||||||
177 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, | |||||
178 | "hashed path: %s", file->name.data); | |||||
179 | ||||||
180 | file->fd = ngx_open_tempfile(file->name.data, persistent, access); | |||||
181 | ||||||
182 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, | |||||
183 | "temp fd:%d", file->fd); | |||||
184 | ||||||
185 | if (file->fd != NGX_INVALID_FILE-1) { | |||||
186 | ||||||
187 | cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file; | |||||
188 | clnf = cln->data; | |||||
189 | ||||||
190 | clnf->fd = file->fd; | |||||
191 | clnf->name = file->name.data; | |||||
192 | clnf->log = pool->log; | |||||
193 | ||||||
194 | return NGX_OK0; | |||||
195 | } | |||||
196 | ||||||
197 | err = ngx_errno(*__errno_location ()); | |||||
198 | ||||||
199 | if (err == NGX_EEXIST_FILE17) { | |||||
200 | n = (uint32_t) ngx_next_temp_number(1); | |||||
201 | continue; | |||||
202 | } | |||||
203 | ||||||
204 | if ((path->level[0] == 0) || (err != NGX_ENOPATH2)) { | |||||
205 | ngx_log_error(NGX_LOG_CRIT, file->log, err,if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "open()" " \"%s\" failed", file->name .data) | |||||
206 | ngx_open_tempfile_n " \"%s\" failed",if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "open()" " \"%s\" failed", file->name .data) | |||||
207 | file->name.data)if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "open()" " \"%s\" failed", file->name .data); | |||||
208 | return NGX_ERROR-1; | |||||
209 | } | |||||
210 | ||||||
211 | if (ngx_create_path(file, path) == NGX_ERROR-1) { | |||||
212 | return NGX_ERROR-1; | |||||
213 | } | |||||
214 | } | |||||
215 | } | |||||
216 | ||||||
217 | ||||||
218 | void | |||||
219 | ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len) | |||||
220 | { | |||||
221 | size_t i, level; | |||||
222 | ngx_uint_t n; | |||||
223 | ||||||
224 | i = path->name.len + 1; | |||||
225 | ||||||
226 | file[path->name.len + path->len] = '/'; | |||||
227 | ||||||
228 | for (n = 0; n < 3; n++) { | |||||
229 | level = path->level[n]; | |||||
230 | ||||||
231 | if (level == 0) { | |||||
232 | break; | |||||
233 | } | |||||
234 | ||||||
235 | len -= level; | |||||
236 | file[i - 1] = '/'; | |||||
237 | ngx_memcpy(&file[i], &file[len], level)(void) memcpy(&file[i], &file[len], level); | |||||
238 | i += level + 1; | |||||
239 | } | |||||
240 | } | |||||
241 | ||||||
242 | ||||||
243 | ngx_int_t | |||||
244 | ngx_create_path(ngx_file_t *file, ngx_path_t *path) | |||||
245 | { | |||||
246 | size_t pos; | |||||
247 | ngx_err_t err; | |||||
248 | ngx_uint_t i; | |||||
249 | ||||||
250 | pos = path->name.len; | |||||
251 | ||||||
252 | for (i = 0; i < 3; i++) { | |||||
253 | if (path->level[i] == 0) { | |||||
254 | break; | |||||
255 | } | |||||
256 | ||||||
257 | pos += path->level[i] + 1; | |||||
258 | ||||||
259 | file->name.data[pos] = '\0'; | |||||
260 | ||||||
261 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, | |||||
262 | "temp file: \"%s\"", file->name.data); | |||||
263 | ||||||
264 | if (ngx_create_dir(file->name.data, 0700)mkdir((const char *) file->name.data, 0700) == NGX_FILE_ERROR-1) { | |||||
265 | err = ngx_errno(*__errno_location ()); | |||||
266 | if (err != NGX_EEXIST17) { | |||||
267 | ngx_log_error(NGX_LOG_CRIT, file->log, err,if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "mkdir()" " \"%s\" failed", file->name .data) | |||||
268 | ngx_create_dir_n " \"%s\" failed",if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "mkdir()" " \"%s\" failed", file->name .data) | |||||
269 | file->name.data)if ((file->log)->log_level >= 3) ngx_log_error_core( 3, file->log, err, "mkdir()" " \"%s\" failed", file->name .data); | |||||
270 | return NGX_ERROR-1; | |||||
271 | } | |||||
272 | } | |||||
273 | ||||||
274 | file->name.data[pos] = '/'; | |||||
275 | } | |||||
276 | ||||||
277 | return NGX_OK0; | |||||
278 | } | |||||
279 | ||||||
280 | ||||||
281 | ngx_err_t | |||||
282 | ngx_create_full_path(u_char *dir, ngx_uint_t access) | |||||
283 | { | |||||
284 | u_char *p, ch; | |||||
285 | ngx_err_t err; | |||||
286 | ||||||
287 | err = 0; | |||||
288 | ||||||
289 | #if (NGX_WIN32) | |||||
290 | p = dir + 3; | |||||
291 | #else | |||||
292 | p = dir + 1; | |||||
293 | #endif | |||||
294 | ||||||
295 | for ( /* void */ ; *p; p++) { | |||||
296 | ch = *p; | |||||
297 | ||||||
298 | if (ch != '/') { | |||||
299 | continue; | |||||
300 | } | |||||
301 | ||||||
302 | *p = '\0'; | |||||
303 | ||||||
304 | if (ngx_create_dir(dir, access)mkdir((const char *) dir, access) == NGX_FILE_ERROR-1) { | |||||
305 | err = ngx_errno(*__errno_location ()); | |||||
306 | ||||||
307 | switch (err) { | |||||
308 | case NGX_EEXIST17: | |||||
309 | err = 0; | |||||
310 | case NGX_EACCES13: | |||||
311 | break; | |||||
312 | ||||||
313 | default: | |||||
314 | return err; | |||||
315 | } | |||||
316 | } | |||||
317 | ||||||
318 | *p = '/'; | |||||
319 | } | |||||
320 | ||||||
321 | return err; | |||||
322 | } | |||||
323 | ||||||
324 | ||||||
325 | ngx_atomic_uint_t | |||||
326 | ngx_next_temp_number(ngx_uint_t collision) | |||||
327 | { | |||||
328 | ngx_atomic_uint_t n, add; | |||||
329 | ||||||
330 | add = collision ? ngx_random_number : 1; | |||||
331 | ||||||
332 | n = ngx_atomic_fetch_add(ngx_temp_number, add)__sync_fetch_and_add(ngx_temp_number, add); | |||||
333 | ||||||
334 | return n + add; | |||||
335 | } | |||||
336 | ||||||
337 | ||||||
338 | char * | |||||
339 | ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |||||
340 | { | |||||
341 | char *p = conf; | |||||
342 | ||||||
343 | ssize_t level; | |||||
344 | ngx_str_t *value; | |||||
345 | ngx_uint_t i, n; | |||||
346 | ngx_path_t *path, **slot; | |||||
347 | ||||||
348 | slot = (ngx_path_t **) (p + cmd->offset); | |||||
349 | ||||||
350 | if (*slot) { | |||||
351 | return "is duplicate"; | |||||
352 | } | |||||
353 | ||||||
354 | path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)); | |||||
355 | if (path == NULL((void*)0)) { | |||||
356 | return NGX_CONF_ERROR(void *) -1; | |||||
357 | } | |||||
358 | ||||||
359 | value = cf->args->elts; | |||||
360 | ||||||
361 | path->name = value[1]; | |||||
362 | ||||||
363 | if (path->name.data[path->name.len - 1] == '/') { | |||||
364 | path->name.len--; | |||||
365 | } | |||||
366 | ||||||
367 | if (ngx_conf_full_name(cf->cycle, &path->name, 0) != NGX_OK0) { | |||||
368 | return NGX_CONF_ERROR(void *) -1; | |||||
369 | } | |||||
370 | ||||||
371 | path->conf_file = cf->conf_file->file.name.data; | |||||
372 | path->line = cf->conf_file->line; | |||||
373 | ||||||
374 | for (i = 0, n = 2; n < cf->args->nelts; i++, n++) { | |||||
375 | level = ngx_atoi(value[n].data, value[n].len); | |||||
376 | if (level == NGX_ERROR-1 || level == 0) { | |||||
377 | return "invalid value"; | |||||
378 | } | |||||
379 | ||||||
380 | path->level[i] = level; | |||||
381 | path->len += level + 1; | |||||
382 | } | |||||
383 | ||||||
384 | if (path->len > 10 + i) { | |||||
385 | return "invalid value"; | |||||
386 | } | |||||
387 | ||||||
388 | *slot = path; | |||||
389 | ||||||
390 | if (ngx_add_path(cf, slot) == NGX_ERROR-1) { | |||||
391 | return NGX_CONF_ERROR(void *) -1; | |||||
392 | } | |||||
393 | ||||||
394 | return NGX_CONF_OK((void*)0); | |||||
395 | } | |||||
396 | ||||||
397 | ||||||
398 | char * | |||||
399 | ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev, | |||||
400 | ngx_path_init_t *init) | |||||
401 | { | |||||
402 | if (*path) { | |||||
403 | return NGX_CONF_OK((void*)0); | |||||
404 | } | |||||
405 | ||||||
406 | if (prev) { | |||||
407 | *path = prev; | |||||
408 | return NGX_CONF_OK((void*)0); | |||||
409 | } | |||||
410 | ||||||
411 | *path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)); | |||||
412 | if (*path == NULL((void*)0)) { | |||||
413 | return NGX_CONF_ERROR(void *) -1; | |||||
414 | } | |||||
415 | ||||||
416 | (*path)->name = init->name; | |||||
417 | ||||||
418 | if (ngx_conf_full_name(cf->cycle, &(*path)->name, 0) != NGX_OK0) { | |||||
419 | return NGX_CONF_ERROR(void *) -1; | |||||
420 | } | |||||
421 | ||||||
422 | (*path)->level[0] = init->level[0]; | |||||
423 | (*path)->level[1] = init->level[1]; | |||||
424 | (*path)->level[2] = init->level[2]; | |||||
425 | ||||||
426 | (*path)->len = init->level[0] + (init->level[0] ? 1 : 0) | |||||
427 | + init->level[1] + (init->level[1] ? 1 : 0) | |||||
428 | + init->level[2] + (init->level[2] ? 1 : 0); | |||||
429 | ||||||
430 | if (ngx_add_path(cf, path) != NGX_OK0) { | |||||
431 | return NGX_CONF_ERROR(void *) -1; | |||||
432 | } | |||||
433 | ||||||
434 | return NGX_CONF_OK((void*)0); | |||||
435 | } | |||||
436 | ||||||
437 | ||||||
438 | char * | |||||
439 | ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |||||
440 | { | |||||
441 | char *confp = conf; | |||||
442 | ||||||
443 | u_char *p; | |||||
444 | ngx_str_t *value; | |||||
445 | ngx_uint_t i, right, shift, *access; | |||||
446 | ||||||
447 | access = (ngx_uint_t *) (confp + cmd->offset); | |||||
448 | ||||||
449 | if (*access != NGX_CONF_UNSET_UINT(ngx_uint_t) -1) { | |||||
450 | return "is duplicate"; | |||||
451 | } | |||||
452 | ||||||
453 | value = cf->args->elts; | |||||
454 | ||||||
455 | *access = 0600; | |||||
456 | ||||||
457 | for (i = 1; i < cf->args->nelts; i++) { | |||||
458 | ||||||
459 | p = value[i].data; | |||||
460 | ||||||
461 | if (ngx_strncmp(p, "user:", sizeof("user:") - 1)(__extension__ (__builtin_constant_p (sizeof("user:") - 1) && ((__builtin_constant_p ((const char *) p) && strlen ( (const char *) p) < ((size_t) (sizeof("user:") - 1))) || ( __builtin_constant_p ((const char *) "user:") && strlen ((const char *) "user:") < ((size_t) (sizeof("user:") - 1 )))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p) && __builtin_constant_p ((const char *) "user:") && (__s1_len = strlen ((const char *) p) , __s2_len = strlen ((const char *) "user:"), (!((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len >= 4) && (!((size_t) (const void *)(((const char *) "user:") + 1) - (size_t)(const void *)((const char *) "user:") == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p, (const char *) "user:") : (__builtin_constant_p ((const char *) p) && ((size_t )(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) && (__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p ((const char *) "user:") && ((size_t)(const void *)(((const char *) "user:") + 1) - (size_t)(const void *)((const char *) "user:" ) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "user:" ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) "user:"); int __result = (((const unsigned char *) (const char *) ((const char *) p ))[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ((const char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( (const char *) p))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ((const char *) "user:") && ((size_t )(const void *)(((const char *) "user:") + 1) - (size_t)(const void *)((const char *) "user:") == 1) && (__s2_len = strlen ((const char *) "user:"), __s2_len < 4) ? (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "user:" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p); int __result = (( (const unsigned char *) (const char *) ((const char *) "user:" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ((const char *) "user:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "user:"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) "user:"))[3] - __s2[3 ]); } } __result; })))) : __builtin_strcmp ((const char *) p, (const char *) "user:")))); }) : strncmp ((const char *) p, ( const char *) "user:", sizeof("user:") - 1))) == 0) { | |||||
462 | shift = 6; | |||||
463 | p += sizeof("user:") - 1; | |||||
464 | ||||||
465 | } else if (ngx_strncmp(p, "group:", sizeof("group:") - 1)(__extension__ (__builtin_constant_p (sizeof("group:") - 1) && ((__builtin_constant_p ((const char *) p) && strlen ( (const char *) p) < ((size_t) (sizeof("group:") - 1))) || ( __builtin_constant_p ((const char *) "group:") && strlen ((const char *) "group:") < ((size_t) (sizeof("group:") - 1)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p) && __builtin_constant_p ((const char *) "group:") && (__s1_len = strlen ((const char *) p ), __s2_len = strlen ((const char *) "group:"), (!((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len >= 4) && (!((size_t) (const void *)(((const char *) "group:") + 1) - (size_t)(const void *)((const char *) "group:") == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p, (const char *) "group:" ) : (__builtin_constant_p ((const char *) p) && ((size_t )(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) && (__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p ((const char *) "group:") && ((size_t)(const void *)(((const char *) "group:") + 1) - (size_t)(const void *)((const char * ) "group:") == 1) ? __builtin_strcmp ((const char *) p, (const char *) "group:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) "group:" ); int __result = (((const unsigned char *) (const char *) (( const char *) p))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ((const char *) "group:" ) && ((size_t)(const void *)(((const char *) "group:" ) + 1) - (size_t)(const void *)((const char *) "group:") == 1 ) && (__s2_len = strlen ((const char *) "group:"), __s2_len < 4) ? (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "group:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p); int __result = (((const unsigned char *) (const char * ) ((const char *) "group:"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "group:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "group:"))[2 ] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) "group:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp ((const char *) p, (const char *) "group:")))); }) : strncmp ((const char *) p, (const char *) "group:", sizeof("group:") - 1))) == 0) { | |||||
466 | shift = 3; | |||||
467 | p += sizeof("group:") - 1; | |||||
468 | ||||||
469 | } else if (ngx_strncmp(p, "all:", sizeof("all:") - 1)(__extension__ (__builtin_constant_p (sizeof("all:") - 1) && ((__builtin_constant_p ((const char *) p) && strlen ( (const char *) p) < ((size_t) (sizeof("all:") - 1))) || (__builtin_constant_p ((const char *) "all:") && strlen ((const char *) "all:" ) < ((size_t) (sizeof("all:") - 1)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p) && __builtin_constant_p ((const char *) "all:") && (__s1_len = strlen ((const char *) p), __s2_len = strlen ((const char *) "all:"), (!((size_t)(const void *)(((const char *) p ) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(((const char * ) "all:") + 1) - (size_t)(const void *)((const char *) "all:" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p, (const char *) "all:") : (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char * ) p) + 1) - (size_t)(const void *)((const char *) p) == 1) && (__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p ((const char *) "all:") && ((size_t)(const void *)(( (const char *) "all:") + 1) - (size_t)(const void *)((const char *) "all:") == 1) ? __builtin_strcmp ((const char *) p, (const char *) "all:") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) "all:" ); int __result = (((const unsigned char *) (const char *) (( const char *) p))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ((const char *) "all:" ) && ((size_t)(const void *)(((const char *) "all:") + 1) - (size_t)(const void *)((const char *) "all:") == 1) && (__s2_len = strlen ((const char *) "all:"), __s2_len < 4) ? (__builtin_constant_p ((const char *) p) && ((size_t )(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) ? __builtin_strcmp ((const char * ) p, (const char *) "all:") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p); int __result = (((const unsigned char *) (const char * ) ((const char *) "all:"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "all:"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "all:"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) "all:" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp ((const char *) p, (const char *) "all:")))); }) : strncmp ((const char *) p, (const char *) "all:", sizeof("all:") - 1))) == 0) { | |||||
470 | shift = 0; | |||||
471 | p += sizeof("all:") - 1; | |||||
472 | ||||||
473 | } else { | |||||
474 | goto invalid; | |||||
475 | } | |||||
476 | ||||||
477 | if (ngx_strcmp(p, "rw")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p) && __builtin_constant_p ((const char *) "rw") && (__s1_len = strlen ((const char *) p), __s2_len = strlen ((const char *) "rw"), (!((size_t)(const void *)((( const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(((const char *) "rw") + 1) - (size_t)(const void *)((const char *) "rw") == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p, (const char *) "rw") : (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) && (__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p ((const char *) "rw") && ((size_t)(const void *)(((const char *) "rw") + 1) - (size_t )(const void *)((const char *) "rw") == 1) ? __builtin_strcmp ((const char *) p, (const char *) "rw") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) "rw"); int __result = (((const unsigned char *) (const char *) ((const char *) p))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p)) [3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (( const char *) "rw") && ((size_t)(const void *)(((const char *) "rw") + 1) - (size_t)(const void *)((const char *) "rw" ) == 1) && (__s2_len = strlen ((const char *) "rw"), __s2_len < 4) ? (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "rw") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p); int __result = (((const unsigned char *) (const char * ) ((const char *) "rw"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "rw"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "rw"))[2] - __s2[2]); if ( __s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) "rw"))[3] - __s2 [3]); } } __result; })))) : __builtin_strcmp ((const char *) p , (const char *) "rw")))); }) == 0) { | |||||
478 | right = 6; | |||||
479 | ||||||
480 | } else if (ngx_strcmp(p, "r")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p) && __builtin_constant_p ((const char *) "r") && (__s1_len = strlen ((const char *) p), __s2_len = strlen ((const char *) "r"), (!((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len >= 4) && (!((size_t)(const void *) (((const char *) "r") + 1) - (size_t)(const void *)((const char *) "r") == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p, (const char *) "r") : (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char * ) p) + 1) - (size_t)(const void *)((const char *) p) == 1) && (__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p ((const char *) "r") && ((size_t)(const void *)(((const char *) "r") + 1) - (size_t)(const void *)((const char *) "r" ) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "r" ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) "r"); int __result = ( ((const unsigned char *) (const char *) ((const char *) p))[0 ] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( (const char *) p))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ((const char *) "r") && ((size_t )(const void *)(((const char *) "r") + 1) - (size_t)(const void *)((const char *) "r") == 1) && (__s2_len = strlen ( (const char *) "r"), __s2_len < 4) ? (__builtin_constant_p ((const char *) p) && ((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const void *)((const char *) p) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "r") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p); int __result = (( (const unsigned char *) (const char *) ((const char *) "r"))[ 0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) "r"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( (const char *) "r"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) "r"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp ((const char *) p, (const char *) "r")))); } ) == 0) { | |||||
481 | right = 4; | |||||
482 | ||||||
483 | } else { | |||||
484 | goto invalid; | |||||
485 | } | |||||
486 | ||||||
487 | *access |= right << shift; | |||||
488 | } | |||||
489 | ||||||
490 | return NGX_CONF_OK((void*)0); | |||||
491 | ||||||
492 | invalid: | |||||
493 | ||||||
494 | ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0, "invalid value \"%V\"", &value[i]); | |||||
495 | ||||||
496 | return NGX_CONF_ERROR(void *) -1; | |||||
497 | } | |||||
498 | ||||||
499 | ||||||
500 | ngx_int_t | |||||
501 | ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot) | |||||
502 | { | |||||
503 | ngx_uint_t i, n; | |||||
504 | ngx_path_t *path, **p; | |||||
505 | ||||||
506 | path = *slot; | |||||
507 | ||||||
508 | p = cf->cycle->paths.elts; | |||||
509 | for (i = 0; i < cf->cycle->paths.nelts; i++) { | |||||
510 | if (p[i]->name.len == path->name.len | |||||
511 | && ngx_strcmp(p[i]->name.data, path->name.data)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ((const char *) p[i]->name.data) && __builtin_constant_p ((const char *) path->name.data) && (__s1_len = strlen ((const char *) p[i]->name.data), __s2_len = strlen ((const char *) path->name.data), (!((size_t)(const void *)(((const char *) p[i]->name.data) + 1) - (size_t)(const void *)((const char *) p[i]->name.data) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(((const char *) path->name.data ) + 1) - (size_t)(const void *)((const char *) path->name. data) == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char *) p[i]->name.data, (const char *) path->name.data) : ( __builtin_constant_p ((const char *) p[i]->name.data) && ((size_t)(const void *)(((const char *) p[i]->name.data) + 1) - (size_t)(const void *)((const char *) p[i]->name.data ) == 1) && (__s1_len = strlen ((const char *) p[i]-> name.data), __s1_len < 4) ? (__builtin_constant_p ((const char *) path->name.data) && ((size_t)(const void *)((( const char *) path->name.data) + 1) - (size_t)(const void * )((const char *) path->name.data) == 1) ? __builtin_strcmp ((const char *) p[i]->name.data, (const char *) path-> name.data) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) path->name .data); int __result = (((const unsigned char *) (const char * ) ((const char *) p[i]->name.data))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p[i]->name.data))[ 1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) p[i]->name.data))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) p[i]->name.data))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p ((const char *) path->name. data) && ((size_t)(const void *)(((const char *) path ->name.data) + 1) - (size_t)(const void *)((const char *) path ->name.data) == 1) && (__s2_len = strlen ((const char *) path->name.data), __s2_len < 4) ? (__builtin_constant_p ((const char *) p[i]->name.data) && ((size_t)(const void *)(((const char *) p[i]->name.data) + 1) - (size_t)( const void *)((const char *) p[i]->name.data) == 1) ? __builtin_strcmp ((const char *) p[i]->name.data, (const char *) path-> name.data) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ((const char *) p[i]-> name.data); int __result = (((const unsigned char *) (const char *) ((const char *) path->name.data))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) path->name.data))[ 1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ((const char *) path->name.data))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ((const char *) path->name.data))[3] - __s2[3]); } } __result ; })))) : __builtin_strcmp ((const char *) p[i]->name.data , (const char *) path->name.data)))); }) == 0) | |||||
512 | { | |||||
513 | if (p[i]->data != path->data) { | |||||
514 | ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0, | |||||
515 | "the same path name \"%V\" " | |||||
516 | "used in %s:%ui and", | |||||
517 | &p[i]->name, p[i]->conf_file, p[i]->line); | |||||
518 | return NGX_ERROR-1; | |||||
519 | } | |||||
520 | ||||||
521 | for (n = 0; n < 3; n++) { | |||||
522 | if (p[i]->level[n] != path->level[n]) { | |||||
523 | if (path->conf_file == NULL((void*)0)) { | |||||
524 | if (p[i]->conf_file == NULL((void*)0)) { | |||||
525 | ngx_log_error(NGX_LOG_EMERG, cf->log, 0,if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name) | |||||
526 | "the default path name \"%V\" has "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name) | |||||
527 | "the same name as another default path, "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name) | |||||
528 | "but the different levels, you need to "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name) | |||||
529 | "redefine one of them in http section",if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name) | |||||
530 | &p[i]->name)if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, " "but the different levels, you need to " "redefine one of them in http section" , &p[i]->name); | |||||
531 | return NGX_ERROR-1; | |||||
532 | } | |||||
533 | ||||||
534 | ngx_log_error(NGX_LOG_EMERG, cf->log, 0,if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line) | |||||
535 | "the path name \"%V\" in %s:%ui has "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line) | |||||
536 | "the same name as default path, but "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line) | |||||
537 | "the different levels, you need to "if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line) | |||||
538 | "define default path in http section",if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line) | |||||
539 | &p[i]->name, p[i]->conf_file, p[i]->line)if ((cf->log)->log_level >= 1) ngx_log_error_core(1, cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but " "the different levels, you need to " "define default path in http section" , &p[i]->name, p[i]->conf_file, p[i]->line); | |||||
540 | return NGX_ERROR-1; | |||||
541 | } | |||||
542 | ||||||
543 | ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0, | |||||
544 | "the same path name \"%V\" in %s:%ui " | |||||
545 | "has the different levels than", | |||||
546 | &p[i]->name, p[i]->conf_file, p[i]->line); | |||||
547 | return NGX_ERROR-1; | |||||
548 | } | |||||
549 | ||||||
550 | if (p[i]->level[n] == 0) { | |||||
551 | break; | |||||
552 | } | |||||
553 | } | |||||
554 | ||||||
555 | *slot = p[i]; | |||||
556 | ||||||
557 | return NGX_OK0; | |||||
558 | } | |||||
559 | } | |||||
560 | ||||||
561 | p = ngx_array_push(&cf->cycle->paths); | |||||
562 | if (p == NULL((void*)0)) { | |||||
563 | return NGX_ERROR-1; | |||||
564 | } | |||||
565 | ||||||
566 | *p = path; | |||||
567 | ||||||
568 | return NGX_OK0; | |||||
569 | } | |||||
570 | ||||||
571 | ||||||
572 | ngx_int_t | |||||
573 | ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user) | |||||
574 | { | |||||
575 | ngx_err_t err; | |||||
576 | ngx_uint_t i; | |||||
577 | ngx_path_t **path; | |||||
578 | ||||||
579 | path = cycle->paths.elts; | |||||
580 | for (i = 0; i < cycle->paths.nelts; i++) { | |||||
581 | ||||||
582 | if (ngx_create_dir(path[i]->name.data, 0700)mkdir((const char *) path[i]->name.data, 0700) == NGX_FILE_ERROR-1) { | |||||
583 | err = ngx_errno(*__errno_location ()); | |||||
584 | if (err != NGX_EEXIST17) { | |||||
585 | ngx_log_error(NGX_LOG_EMERG, cycle->log, err,if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]-> name.data) | |||||
586 | ngx_create_dir_n " \"%s\" failed",if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]-> name.data) | |||||
587 | path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]-> name.data); | |||||
588 | return NGX_ERROR-1; | |||||
589 | } | |||||
590 | } | |||||
591 | ||||||
592 | if (user == (ngx_uid_t) NGX_CONF_UNSET_UINT(ngx_uint_t) -1) { | |||||
593 | continue; | |||||
594 | } | |||||
595 | ||||||
596 | #if !(NGX_WIN32) | |||||
597 | { | |||||
598 | ngx_file_info_t fi; | |||||
599 | ||||||
600 | if (ngx_file_info((const char *) path[i]->name.data, &fi)stat((const char *) (const char *) path[i]->name.data, & fi) | |||||
601 | == NGX_FILE_ERROR-1) | |||||
602 | { | |||||
603 | ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "stat()" " \"%s\" failed" , path[i]->name.data) | |||||
604 | ngx_file_info_n " \"%s\" failed", path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "stat()" " \"%s\" failed" , path[i]->name.data); | |||||
605 | return NGX_ERROR-1; | |||||
606 | } | |||||
607 | ||||||
608 | if (fi.st_uid != user) { | |||||
609 | if (chown((const char *) path[i]->name.data, user, -1) == -1) { | |||||
610 | ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed" , path[i]->name.data, user) | |||||
611 | "chown(\"%s\", %d) failed",if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed" , path[i]->name.data, user) | |||||
612 | path[i]->name.data, user)if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed" , path[i]->name.data, user); | |||||
613 | return NGX_ERROR-1; | |||||
614 | } | |||||
615 | } | |||||
616 | ||||||
617 | if ((fi.st_mode & (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100)) | |||||
618 | != (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100)) | |||||
619 | { | |||||
620 | fi.st_mode |= (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100); | |||||
621 | ||||||
622 | if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) { | |||||
623 | ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "chmod() \"%s\" failed" , path[i]->name.data) | |||||
624 | "chmod() \"%s\" failed", path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core (1, cycle->log, (*__errno_location ()), "chmod() \"%s\" failed" , path[i]->name.data); | |||||
625 | return NGX_ERROR-1; | |||||
626 | } | |||||
627 | } | |||||
628 | } | |||||
629 | #endif | |||||
630 | } | |||||
631 | ||||||
632 | return NGX_OK0; | |||||
633 | } | |||||
634 | ||||||
635 | ||||||
636 | ngx_int_t | |||||
637 | ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext) | |||||
638 | { | |||||
639 | u_char *name; | |||||
640 | ngx_err_t err; | |||||
641 | ngx_copy_file_t cf; | |||||
642 | ||||||
643 | #if !(NGX_WIN32) | |||||
644 | ||||||
645 | if (ext->access) { | |||||
646 | if (ngx_change_file_access(src->data, ext->access)chmod((const char *) src->data, ext->access) == NGX_FILE_ERROR-1) { | |||||
647 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "chmod()" " \"%s\" failed" , src->data) | |||||
648 | ngx_change_file_access_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "chmod()" " \"%s\" failed" , src->data); | |||||
649 | err = 0; | |||||
650 | goto failed; | |||||
651 | } | |||||
652 | } | |||||
653 | ||||||
654 | #endif | |||||
655 | ||||||
656 | if (ext->time != -1) { | |||||
657 | if (ngx_set_file_time(src->data, ext->fd, ext->time) != NGX_OK0) { | |||||
658 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "utimes()" " \"%s\" failed" , src->data) | |||||
659 | ngx_set_file_time_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "utimes()" " \"%s\" failed" , src->data); | |||||
660 | err = 0; | |||||
661 | goto failed; | |||||
662 | } | |||||
663 | } | |||||
664 | ||||||
665 | if (ngx_rename_file(src->data, to->data)rename((const char *) src->data, (const char *) to->data ) != NGX_FILE_ERROR-1) { | |||||
666 | return NGX_OK0; | |||||
667 | } | |||||
668 | ||||||
669 | err = ngx_errno(*__errno_location ()); | |||||
670 | ||||||
671 | if (err == NGX_ENOPATH2) { | |||||
672 | ||||||
673 | if (!ext->create_path) { | |||||
674 | goto failed; | |||||
675 | } | |||||
676 | ||||||
677 | err = ngx_create_full_path(to->data, ngx_dir_access(ext->path_access)(ext->path_access | (ext->path_access & 0444) >> 2)); | |||||
678 | ||||||
679 | if (err) { | |||||
680 | ngx_log_error(NGX_LOG_CRIT, ext->log, err,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, err, "mkdir()" " \"%s\" failed", to->data) | |||||
681 | ngx_create_dir_n " \"%s\" failed", to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, err, "mkdir()" " \"%s\" failed", to->data); | |||||
682 | err = 0; | |||||
683 | goto failed; | |||||
684 | } | |||||
685 | ||||||
686 | if (ngx_rename_file(src->data, to->data)rename((const char *) src->data, (const char *) to->data ) != NGX_FILE_ERROR-1) { | |||||
687 | return NGX_OK0; | |||||
688 | } | |||||
689 | ||||||
690 | err = ngx_errno(*__errno_location ()); | |||||
691 | } | |||||
692 | ||||||
693 | #if (NGX_WIN32) | |||||
694 | ||||||
695 | if (err == NGX_EEXIST17 || err == NGX_EEXIST_FILE17) { | |||||
696 | err = ngx_win32_rename_file(src, to, ext->log); | |||||
697 | ||||||
698 | if (err == 0) { | |||||
699 | return NGX_OK0; | |||||
700 | } | |||||
701 | } | |||||
702 | ||||||
703 | #endif | |||||
704 | ||||||
705 | if (err == NGX_EXDEV18) { | |||||
706 | ||||||
707 | cf.size = -1; | |||||
708 | cf.buf_size = 0; | |||||
709 | cf.access = ext->access; | |||||
710 | cf.time = ext->time; | |||||
711 | cf.log = ext->log; | |||||
712 | ||||||
713 | name = ngx_alloc(to->len + 1 + 10 + 1, ext->log); | |||||
714 | if (name == NULL((void*)0)) { | |||||
715 | return NGX_ERROR-1; | |||||
716 | } | |||||
717 | ||||||
718 | (void) ngx_sprintf(name, "%*s.%010uD%Z", to->len, to->data, | |||||
719 | (uint32_t) ngx_next_temp_number(0)); | |||||
720 | ||||||
721 | if (ngx_copy_file(src->data, name, &cf) == NGX_OK0) { | |||||
722 | ||||||
723 | if (ngx_rename_file(name, to->data)rename((const char *) name, (const char *) to->data) != NGX_FILE_ERROR-1) { | |||||
724 | ngx_freefree(name); | |||||
725 | ||||||
726 | if (ngx_delete_file(src->data)unlink((const char *) src->data) == NGX_FILE_ERROR-1) { | |||||
727 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , src->data) | |||||
728 | ngx_delete_file_n " \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , src->data) | |||||
729 | src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , src->data); | |||||
730 | return NGX_ERROR-1; | |||||
731 | } | |||||
732 | ||||||
733 | return NGX_OK0; | |||||
734 | } | |||||
735 | ||||||
736 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed" , name, to->data) | |||||
737 | ngx_rename_file_n " \"%s\" to \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed" , name, to->data) | |||||
738 | name, to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed" , name, to->data); | |||||
739 | ||||||
740 | if (ngx_delete_file(name)unlink((const char *) name) == NGX_FILE_ERROR-1) { | |||||
741 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , name) | |||||
742 | ngx_delete_file_n " \"%s\" failed", name)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , name); | |||||
743 | ||||||
744 | } | |||||
745 | } | |||||
746 | ||||||
747 | ngx_freefree(name); | |||||
748 | ||||||
749 | err = 0; | |||||
750 | } | |||||
751 | ||||||
752 | failed: | |||||
753 | ||||||
754 | if (ext->delete_file) { | |||||
755 | if (ngx_delete_file(src->data)unlink((const char *) src->data) == NGX_FILE_ERROR-1) { | |||||
756 | ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , src->data) | |||||
757 | ngx_delete_file_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed" , src->data); | |||||
758 | } | |||||
759 | } | |||||
760 | ||||||
761 | if (err) { | |||||
762 | ngx_log_error(NGX_LOG_CRIT, ext->log, err,if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src ->data, to->data) | |||||
763 | ngx_rename_file_n " \"%s\" to \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src ->data, to->data) | |||||
764 | src->data, to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3 , ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src ->data, to->data); | |||||
765 | } | |||||
766 | ||||||
767 | return NGX_ERROR-1; | |||||
768 | } | |||||
769 | ||||||
770 | ||||||
771 | ngx_int_t | |||||
772 | ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf) | |||||
773 | { | |||||
774 | char *buf; | |||||
775 | off_t size; | |||||
776 | size_t len; | |||||
777 | ssize_t n; | |||||
778 | ngx_fd_t fd, nfd; | |||||
779 | ngx_int_t rc; | |||||
780 | ngx_file_info_t fi; | |||||
781 | ||||||
782 | rc = NGX_ERROR-1; | |||||
783 | buf = NULL((void*)0); | |||||
784 | nfd = NGX_INVALID_FILE-1; | |||||
785 | ||||||
786 | fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0)open((const char *) from, 00|0, 0); | |||||
787 | ||||||
788 | if (fd == NGX_INVALID_FILE-1) { | |||||
789 | ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,if ((cf->log)->log_level >= 3) ngx_log_error_core(3, cf->log, (*__errno_location ()), "open()" " \"%s\" failed" , from) | |||||
790 | ngx_open_file_n " \"%s\" failed", from)if ((cf->log)->log_level >= 3) ngx_log_error_core(3, cf->log, (*__errno_location ()), "open()" " \"%s\" failed" , from); | |||||
791 | goto failed; | |||||
792 | } | |||||
793 | ||||||
794 | if (cf->size != -1) { | |||||
795 | size = cf->size; | |||||
796 | ||||||
797 | } else { | |||||
798 | if (ngx_fd_info(fd, &fi)fstat(fd, &fi) == NGX_FILE_ERROR-1) { | |||||
799 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "fstat()" " \"%s\" failed" , from) | |||||
800 | ngx_fd_info_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "fstat()" " \"%s\" failed" , from); | |||||
801 | ||||||
802 | goto failed; | |||||
803 | } | |||||
804 | ||||||
805 | size = ngx_file_size(&fi)(&fi)->st_size; | |||||
806 | } | |||||
807 | ||||||
808 | len = cf->buf_size ? cf->buf_size : 65536; | |||||
809 | ||||||
810 | if ((off_t) len > size) { | |||||
811 | len = (size_t) size; | |||||
812 | } | |||||
813 | ||||||
814 | buf = ngx_alloc(len, cf->log); | |||||
815 | if (buf == NULL((void*)0)) { | |||||
816 | goto failed; | |||||
817 | } | |||||
818 | ||||||
819 | nfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_CREATE_OR_OPEN,open((const char *) to, 01|0100, cf->access) | |||||
820 | cf->access)open((const char *) to, 01|0100, cf->access); | |||||
821 | ||||||
822 | if (nfd == NGX_INVALID_FILE-1) { | |||||
823 | ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,if ((cf->log)->log_level >= 3) ngx_log_error_core(3, cf->log, (*__errno_location ()), "open()" " \"%s\" failed" , to) | |||||
824 | ngx_open_file_n " \"%s\" failed", to)if ((cf->log)->log_level >= 3) ngx_log_error_core(3, cf->log, (*__errno_location ()), "open()" " \"%s\" failed" , to); | |||||
825 | goto failed; | |||||
826 | } | |||||
827 | ||||||
828 | while (size > 0) { | |||||
829 | ||||||
830 | if ((off_t) len > size) { | |||||
831 | len = (size_t) size; | |||||
832 | } | |||||
833 | ||||||
834 | n = ngx_read_fdread(fd, buf, len); | |||||
835 | ||||||
836 | if (n == -1) { | |||||
837 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "read()" " \"%s\" failed" , from) | |||||
838 | ngx_read_fd_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "read()" " \"%s\" failed" , from); | |||||
839 | goto failed; | |||||
840 | } | |||||
841 | ||||||
842 | if ((size_t) n != len) { | |||||
843 | ngx_log_error(NGX_LOG_ALERT, cf->log, 0,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "read()" " has read only %z of %O from %s", n , size, from) | |||||
844 | ngx_read_fd_n " has read only %z of %O from %s",if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "read()" " has read only %z of %O from %s", n , size, from) | |||||
845 | n, size, from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "read()" " has read only %z of %O from %s", n , size, from); | |||||
846 | goto failed; | |||||
847 | } | |||||
848 | ||||||
849 | n = ngx_write_fd(nfd, buf, len); | |||||
850 | ||||||
851 | if (n == -1) { | |||||
852 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "write()" " \"%s\" failed" , to) | |||||
853 | ngx_write_fd_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "write()" " \"%s\" failed" , to); | |||||
854 | goto failed; | |||||
855 | } | |||||
856 | ||||||
857 | if ((size_t) n != len) { | |||||
858 | ngx_log_error(NGX_LOG_ALERT, cf->log, 0,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "write()" " has written only %z of %O to %s", n, size, to) | |||||
859 | ngx_write_fd_n " has written only %z of %O to %s",if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "write()" " has written only %z of %O to %s", n, size, to) | |||||
860 | n, size, to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, 0, "write()" " has written only %z of %O to %s", n, size, to); | |||||
861 | goto failed; | |||||
862 | } | |||||
863 | ||||||
864 | size -= n; | |||||
865 | } | |||||
866 | ||||||
867 | if (cf->time != -1) { | |||||
868 | if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK0) { | |||||
869 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "utimes()" " \"%s\" failed" , to) | |||||
870 | ngx_set_file_time_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "utimes()" " \"%s\" failed" , to); | |||||
871 | goto failed; | |||||
872 | } | |||||
873 | } | |||||
874 | ||||||
875 | rc = NGX_OK0; | |||||
876 | ||||||
877 | failed: | |||||
878 | ||||||
879 | if (nfd != NGX_INVALID_FILE-1) { | |||||
880 | if (ngx_close_fileclose(nfd) == NGX_FILE_ERROR-1) { | |||||
881 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "close()" " \"%s\" failed" , to) | |||||
882 | ngx_close_file_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "close()" " \"%s\" failed" , to); | |||||
883 | } | |||||
884 | } | |||||
885 | ||||||
886 | if (fd != NGX_INVALID_FILE-1) { | |||||
887 | if (ngx_close_fileclose(fd) == NGX_FILE_ERROR-1) { | |||||
888 | ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "close()" " \"%s\" failed" , from) | |||||
889 | ngx_close_file_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2, cf->log, (*__errno_location ()), "close()" " \"%s\" failed" , from); | |||||
890 | } | |||||
891 | } | |||||
892 | ||||||
893 | if (buf) { | |||||
894 | ngx_freefree(buf); | |||||
895 | } | |||||
896 | ||||||
897 | return rc; | |||||
898 | } | |||||
899 | ||||||
900 | ||||||
901 | /* | |||||
902 | * ctx->init_handler() - see ctx->alloc | |||||
903 | * ctx->file_handler() - file handler | |||||
904 | * ctx->pre_tree_handler() - handler is called before entering directory | |||||
905 | * ctx->post_tree_handler() - handler is called after leaving directory | |||||
906 | * ctx->spec_handler() - special (socket, FIFO, etc.) file handler | |||||
907 | * | |||||
908 | * ctx->data - some data structure, it may be the same on all levels, or | |||||
909 | * reallocated if ctx->alloc is nonzero | |||||
910 | * | |||||
911 | * ctx->alloc - a size of data structure that is allocated at every level | |||||
912 | * and is initialized by ctx->init_handler() | |||||
913 | * | |||||
914 | * ctx->log - a log | |||||
915 | * | |||||
916 | * on fatal (memory) error handler must return NGX_ABORT to stop walking tree | |||||
917 | */ | |||||
918 | ||||||
919 | ngx_int_t | |||||
920 | ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree) | |||||
921 | { | |||||
922 | void *data, *prev; | |||||
923 | u_char *p, *name; | |||||
924 | size_t len; | |||||
925 | ngx_int_t rc; | |||||
926 | ngx_err_t err; | |||||
927 | ngx_str_t file, buf; | |||||
928 | ngx_dir_t dir; | |||||
929 | ||||||
930 | ngx_str_null(&buf)(&buf)->len = 0; (&buf)->data = ((void*)0); | |||||
| ||||||
931 | ||||||
932 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
933 | "walk tree \"%V\"", tree); | |||||
934 | ||||||
935 | if (ngx_open_dir(tree, &dir) == NGX_ERROR-1) { | |||||
936 | ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "opendir()" " \"%s\" failed" , tree->data) | |||||
937 | ngx_open_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "opendir()" " \"%s\" failed" , tree->data); | |||||
938 | return NGX_ERROR-1; | |||||
939 | } | |||||
940 | ||||||
941 | prev = ctx->data; | |||||
942 | ||||||
943 | if (ctx->alloc) { | |||||
944 | data = ngx_alloc(ctx->alloc, ctx->log); | |||||
945 | if (data == NULL((void*)0)) { | |||||
946 | goto failed; | |||||
947 | } | |||||
948 | ||||||
949 | if (ctx->init_handler(data, prev) == NGX_ABORT-6) { | |||||
950 | goto failed; | |||||
951 | } | |||||
952 | ||||||
953 | ctx->data = data; | |||||
954 | ||||||
955 | } else { | |||||
956 | data = NULL((void*)0); | |||||
957 | } | |||||
958 | ||||||
959 | for ( ;; ) { | |||||
960 | ||||||
961 | ngx_set_errno(0)(*__errno_location ()) = 0; | |||||
962 | ||||||
963 | if (ngx_read_dir(&dir) == NGX_ERROR-1) { | |||||
964 | err = ngx_errno(*__errno_location ()); | |||||
965 | ||||||
966 | if (err == NGX_ENOMOREFILES0) { | |||||
967 | rc = NGX_OK0; | |||||
968 | ||||||
969 | } else { | |||||
970 | ngx_log_error(NGX_LOG_CRIT, ctx->log, err,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, err, "readdir()" " \"%s\" failed", tree->data ) | |||||
971 | ngx_read_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, err, "readdir()" " \"%s\" failed", tree->data ); | |||||
972 | rc = NGX_ERROR-1; | |||||
973 | } | |||||
974 | ||||||
975 | goto done; | |||||
976 | } | |||||
977 | ||||||
978 | len = ngx_de_namelen(&dir)strlen((const char *) (&dir)->de->d_name); | |||||
979 | name = ngx_de_name(&dir)((u_char *) (&dir)->de->d_name); | |||||
980 | ||||||
981 | ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
982 | "tree name %uz:\"%s\"", len, name); | |||||
983 | ||||||
984 | if (len == 1 && name[0] == '.') { | |||||
985 | continue; | |||||
986 | } | |||||
987 | ||||||
988 | if (len == 2 && name[0] == '.' && name[1] == '.') { | |||||
989 | continue; | |||||
990 | } | |||||
991 | ||||||
992 | file.len = tree->len + 1 + len; | |||||
993 | ||||||
994 | if (file.len + NGX_DIR_MASK_LEN0 > buf.len) { | |||||
995 | ||||||
996 | if (buf.len) { | |||||
997 | ngx_freefree(buf.data); | |||||
998 | } | |||||
999 | ||||||
1000 | buf.len = tree->len + 1 + len + NGX_DIR_MASK_LEN0; | |||||
1001 | ||||||
1002 | buf.data = ngx_alloc(buf.len + 1, ctx->log); | |||||
1003 | if (buf.data == NULL((void*)0)) { | |||||
1004 | goto failed; | |||||
1005 | } | |||||
1006 | } | |||||
1007 | ||||||
1008 | p = ngx_cpymem(buf.data, tree->data, tree->len)(((u_char *) memcpy(buf.data, tree->data, tree->len)) + (tree->len)); | |||||
| ||||||
1009 | *p++ = '/'; | |||||
1010 | ngx_memcpy(p, name, len + 1)(void) memcpy(p, name, len + 1); | |||||
1011 | ||||||
1012 | file.data = buf.data; | |||||
1013 | ||||||
1014 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
1015 | "tree path \"%s\"", file.data); | |||||
1016 | ||||||
1017 | if (!dir.valid_info) { | |||||
1018 | if (ngx_de_info(file.data, &dir) == NGX_FILE_ERROR-1) { | |||||
1019 | ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "stat()" " \"%s\" failed" , file.data) | |||||
1020 | ngx_de_info_n " \"%s\" failed", file.data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "stat()" " \"%s\" failed" , file.data); | |||||
1021 | continue; | |||||
1022 | } | |||||
1023 | } | |||||
1024 | ||||||
1025 | if (ngx_de_is_file(&dir)(((&dir)->type) ? ((&dir)->type == DT_REG) : (( ((((&dir)->info.st_mode)) & 0170000) == (0100000)) ))) { | |||||
1026 | ||||||
1027 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
1028 | "tree file \"%s\"", file.data); | |||||
1029 | ||||||
1030 | ctx->size = ngx_de_size(&dir)(&dir)->info.st_size; | |||||
1031 | ctx->fs_size = ngx_de_fs_size(&dir)(((&dir)->info.st_size < (&dir)->info.st_blocks * 512) ? ((&dir)->info.st_blocks * 512) : ((&dir) ->info.st_size)); | |||||
1032 | ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777); | |||||
1033 | ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec; | |||||
1034 | ||||||
1035 | if (ctx->file_handler(ctx, &file) == NGX_ABORT-6) { | |||||
1036 | goto failed; | |||||
1037 | } | |||||
1038 | ||||||
1039 | } else if (ngx_de_is_dir(&dir)(((&dir)->type) ? ((&dir)->type == DT_DIR) : (( ((((&dir)->info.st_mode)) & 0170000) == (0040000)) ))) { | |||||
1040 | ||||||
1041 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
1042 | "tree enter dir \"%s\"", file.data); | |||||
1043 | ||||||
1044 | ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777); | |||||
1045 | ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec; | |||||
1046 | ||||||
1047 | rc = ctx->pre_tree_handler(ctx, &file); | |||||
1048 | ||||||
1049 | if (rc == NGX_ABORT-6) { | |||||
1050 | goto failed; | |||||
1051 | } | |||||
1052 | ||||||
1053 | if (rc == NGX_DECLINED-5) { | |||||
1054 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
1055 | "tree skip dir \"%s\"", file.data); | |||||
1056 | continue; | |||||
1057 | } | |||||
1058 | ||||||
1059 | if (ngx_walk_tree(ctx, &file) == NGX_ABORT-6) { | |||||
1060 | goto failed; | |||||
1061 | } | |||||
1062 | ||||||
1063 | ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777); | |||||
1064 | ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec; | |||||
1065 | ||||||
1066 | if (ctx->post_tree_handler(ctx, &file) == NGX_ABORT-6) { | |||||
1067 | goto failed; | |||||
1068 | } | |||||
1069 | ||||||
1070 | } else { | |||||
1071 | ||||||
1072 | ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, | |||||
1073 | "tree special \"%s\"", file.data); | |||||
1074 | ||||||
1075 | if (ctx->spec_handler(ctx, &file) == NGX_ABORT-6) { | |||||
1076 | goto failed; | |||||
1077 | } | |||||
1078 | } | |||||
1079 | } | |||||
1080 | ||||||
1081 | failed: | |||||
1082 | ||||||
1083 | rc = NGX_ABORT-6; | |||||
1084 | ||||||
1085 | done: | |||||
1086 | ||||||
1087 | if (buf.len) { | |||||
1088 | ngx_freefree(buf.data); | |||||
1089 | } | |||||
1090 | ||||||
1091 | if (data) { | |||||
1092 | ngx_freefree(data); | |||||
1093 | ctx->data = prev; | |||||
1094 | } | |||||
1095 | ||||||
1096 | if (ngx_close_dir(&dir)closedir((&dir)->dir) == NGX_ERROR-1) { | |||||
1097 | ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "closedir()" " \"%s\" failed" , tree->data) | |||||
1098 | ngx_close_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3 , ctx->log, (*__errno_location ()), "closedir()" " \"%s\" failed" , tree->data); | |||||
1099 | } | |||||
1100 | ||||||
1101 | return rc; | |||||
1102 | } |