upstream nginx-0.7.35
[nginx.git] / nginx / src / core / ngx_file.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_FILE_H_INCLUDED_
8 #define _NGX_FILE_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13
14 typedef struct ngx_path_s  ngx_path_t;
15
16 #include <ngx_garbage_collector.h>
17
18
19 struct ngx_file_s {
20     ngx_fd_t            fd;
21     ngx_str_t           name;
22     ngx_file_info_t     info;
23
24     off_t               offset;
25     off_t               sys_offset;
26
27     ngx_log_t          *log;
28
29     unsigned            valid_info:1;
30     unsigned            directio:1;
31 };
32
33 #define NGX_MAX_PATH_LEVEL  3
34
35 struct ngx_path_s {
36     ngx_str_t           name;
37     size_t              len;
38     size_t              level[3];
39     ngx_gc_handler_pt   cleaner;
40
41     u_char             *conf_file;
42     ngx_uint_t          line;
43 };
44
45
46 typedef struct {
47     ngx_file_t          file;
48     off_t               offset;
49     ngx_path_t         *path;
50     ngx_pool_t         *pool;
51     char               *warn;
52
53     ngx_uint_t          access;
54
55     unsigned            log_level:8;
56     unsigned            persistent:1;
57     unsigned            clean:1;
58 } ngx_temp_file_t;
59
60
61 typedef struct {
62     ngx_uint_t          access;
63     ngx_uint_t          path_access;
64     time_t              time;
65     ngx_fd_t            fd;
66     ngx_err_t           rename_error;
67
68     unsigned            create_path:1;
69     unsigned            delete_file:1;
70     unsigned            log_rename_error:1;
71
72     ngx_log_t          *log;
73 } ngx_ext_rename_file_t;
74
75
76 typedef struct ngx_tree_ctx_s  ngx_tree_ctx_t;
77
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);
80
81 struct ngx_tree_ctx_s {
82     off_t                      size;
83     ngx_uint_t                 access;
84     time_t                     mtime;
85
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;
91
92     void                      *data;
93     size_t                     alloc;
94
95     ngx_log_t                 *log;
96 };
97
98
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,
102     ngx_uint_t access);
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);
111
112 void ngx_init_temp_number(void);
113 ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);
114
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);
117
118
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;                                        \
125             }                                                                 \
126                                                                               \
127             curr->name.len = sizeof(path) - 1;                                \
128             curr->name.data = (u_char *) path;                                \
129                                                                               \
130             if (ngx_conf_full_name(cf->cycle, &curr->name, 0) == NGX_ERROR) { \
131                 return NGX_CONF_ERROR;                                        \
132             }                                                                 \
133                                                                               \
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;                                           \
140                                                                               \
141             if (ngx_add_path(cf, &curr) == NGX_ERROR) {                       \
142                 return NGX_CONF_ERROR;                                        \
143             }                                                                 \
144                                                                               \
145         } else {                                                              \
146             curr = prev;                                                      \
147         }                                                                     \
148     }
149
150
151
152 #endif /* _NGX_FILE_H_INCLUDED_ */