blob: 344da09577cce0811d0599aea69d38f294650e3b [file] [log] [blame]
Igor Sysoevd90282d2004-09-28 08:34:51 +00001
2/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Igor Sysoevd90282d2004-09-28 08:34:51 +00004 */
5
6
Igor Sysoeva58e3ca2002-09-02 14:48:24 +00007#ifndef _NGX_FILE_H_INCLUDED_
8#define _NGX_FILE_H_INCLUDED_
9
10
Igor Sysoev1c104622003-06-03 15:42:58 +000011#include <ngx_config.h>
12#include <ngx_core.h>
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000013
Igor Sysoev1b138ed2003-11-18 21:34:08 +000014typedef struct ngx_path_s ngx_path_t;
15
16#include <ngx_garbage_collector.h>
17
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000018
19struct ngx_file_s {
Igor Sysoevd43bee82004-11-20 19:52:20 +000020 ngx_fd_t fd;
21 ngx_str_t name;
22 ngx_file_info_t info;
Igor Sysoev42feecb2002-12-15 06:25:09 +000023
Igor Sysoevd43bee82004-11-20 19:52:20 +000024 off_t offset;
25 off_t sys_offset;
Igor Sysoev41d5a4f2002-12-21 17:14:50 +000026
Igor Sysoevd43bee82004-11-20 19:52:20 +000027 ngx_log_t *log;
Igor Sysoev42feecb2002-12-15 06:25:09 +000028
Igor Sysoev8633e1f2008-09-05 14:48:47 +000029 unsigned valid_info:1;
30 unsigned directio:1;
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000031};
32
Igor Sysoev297c0482003-11-14 16:52:04 +000033#define NGX_MAX_PATH_LEVEL 3
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000034
Igor Sysoev1b138ed2003-11-18 21:34:08 +000035struct ngx_path_s {
36 ngx_str_t name;
Igor Sysoev4959ec42005-05-23 12:07:45 +000037 size_t len;
38 size_t level[3];
Igor Sysoev02025fd2005-01-18 13:03:58 +000039 ngx_gc_handler_pt cleaner;
Igor Sysoevd43bee82004-11-20 19:52:20 +000040
41 u_char *conf_file;
42 ngx_uint_t line;
Igor Sysoev1b138ed2003-11-18 21:34:08 +000043};
Igor Sysoevfd675862003-04-11 16:01:14 +000044
45
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000046typedef struct {
Igor Sysoevd43bee82004-11-20 19:52:20 +000047 ngx_file_t file;
48 off_t offset;
49 ngx_path_t *path;
50 ngx_pool_t *pool;
51 char *warn;
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000052
Igor Sysoevfe1cb8c2007-01-18 19:52:18 +000053 ngx_uint_t access;
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +000054
Igor Sysoev7bdb7202006-04-19 15:30:56 +000055 unsigned log_level:8;
Igor Sysoevd43bee82004-11-20 19:52:20 +000056 unsigned persistent:1;
Igor Sysoevcd5b99a2007-01-25 08:45:04 +000057 unsigned clean:1;
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000058} ngx_temp_file_t;
59
60
Igor Sysoev37391512008-01-03 22:17:27 +000061typedef struct {
62 ngx_uint_t access;
Igor Sysoev524f54f2008-12-10 14:53:45 +000063 ngx_uint_t path_access;
Igor Sysoev37391512008-01-03 22:17:27 +000064 time_t time;
65 ngx_fd_t fd;
Igor Sysoev524f54f2008-12-10 14:53:45 +000066 ngx_err_t rename_error;
Igor Sysoev37391512008-01-03 22:17:27 +000067
68 unsigned create_path:1;
Igor Sysoev34cec292008-03-03 16:32:16 +000069 unsigned delete_file:1;
Igor Sysoev524f54f2008-12-10 14:53:45 +000070 unsigned log_rename_error:1;
Igor Sysoev37391512008-01-03 22:17:27 +000071
72 ngx_log_t *log;
73} ngx_ext_rename_file_t;
74
75
Igor Sysoev60d30e62006-12-25 12:38:00 +000076typedef struct ngx_tree_ctx_s ngx_tree_ctx_t;
77
Igor Sysoevf5a359b2007-01-18 21:04:31 +000078typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev);
Igor Sysoev60d30e62006-12-25 12:38:00 +000079typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name);
80
81struct ngx_tree_ctx_s {
Igor Sysoevf5a359b2007-01-18 21:04:31 +000082 off_t size;
83 ngx_uint_t access;
84 time_t mtime;
85
Igor Sysoev60d30e62006-12-25 12:38:00 +000086 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;
Igor Sysoevf5a359b2007-01-18 21:04:31 +000091
Igor Sysoev60d30e62006-12-25 12:38:00 +000092 void *data;
Igor Sysoevf5a359b2007-01-18 21:04:31 +000093 size_t alloc;
94
Igor Sysoev60d30e62006-12-25 12:38:00 +000095 ngx_log_t *log;
96};
97
98
Igor Sysoevd43bee82004-11-20 19:52:20 +000099ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);
100ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
Igor Sysoevcd5b99a2007-01-25 08:45:04 +0000101 ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean,
102 ngx_uint_t access);
Igor Sysoev00cbb8a2007-12-17 21:29:34 +0000103void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len);
Igor Sysoevd43bee82004-11-20 19:52:20 +0000104ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);
Igor Sysoevb71c6902006-08-04 16:04:04 +0000105ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access);
Igor Sysoev02025fd2005-01-18 13:03:58 +0000106ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot);
Igor Sysoevd43bee82004-11-20 19:52:20 +0000107ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user);
Igor Sysoev37391512008-01-03 22:17:27 +0000108ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to,
109 ngx_ext_rename_file_t *ext);
Igor Sysoev60d30e62006-12-25 12:38:00 +0000110ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree);
Igor Sysoevfd675862003-04-11 16:01:14 +0000111
Igor Sysoev8184d1b2005-03-04 14:06:57 +0000112void ngx_init_temp_number(void);
Igor Sysoev4a715592005-02-24 12:29:09 +0000113ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);
Igor Sysoevfd675862003-04-11 16:01:14 +0000114
Igor Sysoevdc9dd432003-10-22 16:38:26 +0000115char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
Igor Sysoev58feb532007-07-12 11:19:05 +0000116char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
Igor Sysoevdc9dd432003-10-22 16:38:26 +0000117
118
Igor Sysoev02025fd2005-01-18 13:03:58 +0000119#define ngx_conf_merge_path_value(curr, prev, path, l1, l2, l3, clean, cf) \
120 if (curr == NULL) { \
121 if (prev == NULL) { \
Igor Sysoevc1571722005-03-19 12:38:37 +0000122 curr = ngx_palloc(cf->pool, sizeof(ngx_path_t)); \
123 if (curr == NULL) { \
Igor Sysoev02025fd2005-01-18 13:03:58 +0000124 return NGX_CONF_ERROR; \
125 } \
126 \
127 curr->name.len = sizeof(path) - 1; \
128 curr->name.data = (u_char *) path; \
129 \
Igor Sysoeva1df4162007-07-29 18:05:45 +0000130 if (ngx_conf_full_name(cf->cycle, &curr->name, 0) == NGX_ERROR) { \
Igor Sysoev02025fd2005-01-18 13:03:58 +0000131 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 } \
Igor Sysoevdc9dd432003-10-22 16:38:26 +0000148 }
149
150
Igor Sysoevfd675862003-04-11 16:01:14 +0000151
Igor Sysoev73009772003-02-06 17:21:13 +0000152#endif /* _NGX_FILE_H_INCLUDED_ */