3 * Copyright (C) Igor Sysoev
7 #ifndef _NGX_FILE_H_INCLUDED_
8 #define _NGX_FILE_H_INCLUDED_
11 #include <ngx_config.h>
14 typedef struct ngx_path_s ngx_path_t;
16 #include <ngx_garbage_collector.h>
29 unsigned valid_info:1;
33 #define NGX_MAX_PATH_LEVEL 3
39 ngx_gc_handler_pt cleaner;
56 unsigned persistent:1;
63 ngx_uint_t path_access;
66 ngx_err_t rename_error;
68 unsigned create_path:1;
69 unsigned delete_file:1;
70 unsigned log_rename_error:1;
73 } ngx_ext_rename_file_t;
76 typedef struct ngx_tree_ctx_s ngx_tree_ctx_t;
78 typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev);
79 typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name);
81 struct ngx_tree_ctx_s {
86 ngx_tree_init_handler_pt init_handler;
87 ngx_tree_handler_pt file_handler;
88 ngx_tree_handler_pt pre_tree_handler;
89 ngx_tree_handler_pt post_tree_handler;
90 ngx_tree_handler_pt spec_handler;
99 ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);
100 ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
101 ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean,
103 void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len);
104 ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);
105 ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access);
106 ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot);
107 ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user);
108 ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to,
109 ngx_ext_rename_file_t *ext);
110 ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree);
112 void ngx_init_temp_number(void);
113 ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);
115 char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
116 char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
119 #define ngx_conf_merge_path_value(curr, prev, path, l1, l2, l3, clean, cf) \
120 if (curr == NULL) { \
121 if (prev == NULL) { \
122 curr = ngx_palloc(cf->pool, sizeof(ngx_path_t)); \
123 if (curr == NULL) { \
124 return NGX_CONF_ERROR; \
127 curr->name.len = sizeof(path) - 1; \
128 curr->name.data = (u_char *) path; \
130 if (ngx_conf_full_name(cf->cycle, &curr->name, 0) == NGX_ERROR) { \
131 return NGX_CONF_ERROR; \
134 curr->level[0] = l1; \
135 curr->level[1] = l2; \
136 curr->level[2] = l3; \
137 curr->len = l1 + l2 + l3 + (l1 ? 1:0) + (l2 ? 1:0) + (l3 ? 1:0); \
138 curr->cleaner = clean; \
139 curr->conf_file = NULL; \
141 if (ngx_add_path(cf, &curr) == NGX_ERROR) { \
142 return NGX_CONF_ERROR; \
152 #endif /* _NGX_FILE_H_INCLUDED_ */