xref: /unit/src/nxt_file.h (revision 2645:c71a1acff7e9)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_UNIX_FILE_H_INCLUDED_
8 #define _NXT_UNIX_FILE_H_INCLUDED_
9 
10 
11 typedef int                         nxt_fd_t;
12 
13 #define NXT_FILE_INVALID            -1
14 
15 typedef nxt_uint_t                  nxt_file_access_t;
16 typedef struct stat                 nxt_file_info_t;
17 
18 
19 #define NXT_FILE_SYSTEM_NAME_UTF8   1
20 
21 typedef u_char                      nxt_file_name_t;
22 
23 
24 typedef struct {
25     size_t                          len;
26     nxt_file_name_t                 *start;
27 } nxt_file_name_str_t;
28 
29 
30 #define nxt_file_name_str_set(file_name, mem_pool, name)                      \
31     ((file_name) = (nxt_file_name_t *) (name), NXT_OK)
32 
33 
34 #define nxt_file_name_alloc(mem_pool, len)                                    \
35     nxt_mp_nget(mem_pool, len)
36 
37 
38 #define nxt_file_name_copy(dst, src, len)                                     \
39     nxt_cpymem(dst, src, len)
40 
41 
42 #define nxt_file_name_add(dst, src, len)                                      \
43     nxt_cpymem(dst, src, len)
44 
45 
46 #if (NXT_HAVE_CASELESS_FILESYSTEM)
47 
48 /* MacOSX, Cygwin. */
49 
50 #define nxt_file_name_eq(fn1, fn2)                                            \
51     (nxt_strcasecmp(fn1, fn2) == 0)
52 
53 #else
54 
55 #define nxt_file_name_eq(fn1, fn2)                                            \
56     (nxt_strcmp(fn1, fn2) == 0)
57 
58 #endif
59 
60 
61 #define nxt_file_name_is_absolute(name)                                       \
62     (name[0] == '/')
63 
64 
65 #define NXT_MAX_PATH_LEN            MAXPATHLEN
66 
67 
68 typedef enum {
69     NXT_FILE_UNKNOWN = 0,
70     NXT_FILE_REGULAR,
71     NXT_FILE_DIRECTORY,
72 } nxt_file_type_t;
73 
74 
75 typedef struct {
76     nxt_file_name_t                 *name;
77 
78     /* Both are int's. */
79     nxt_fd_t                        fd;
80     nxt_err_t                       error;
81 
82 #define NXT_FILE_ACCESSED_LONG_AGO  0xFFFF
83     /*
84      * Number of seconds ago the file content was last
85      * read.  The maximum value is about 18 hours.
86      */
87     uint16_t                        accessed;
88 
89     uint8_t                         type;       /* nxt_file_type_t */
90 
91     /*
92      * Log open() file error with given log level if it is non zero.
93      * Note that zero log level is NXT_LOG_ALERT.
94      */
95     uint8_t                         log_level;
96 
97     nxt_time_t                      mtime;
98     nxt_off_t                       size;
99 } nxt_file_t;
100 
101 
102 NXT_EXPORT nxt_int_t nxt_file_open(nxt_task_t *task, nxt_file_t *file,
103     nxt_uint_t mode, nxt_uint_t create, nxt_file_access_t access);
104 
105 #if (NXT_HAVE_OPENAT2)
106 NXT_EXPORT nxt_int_t nxt_file_openat2(nxt_task_t *task, nxt_file_t *file,
107     nxt_uint_t mode, nxt_uint_t create, nxt_file_access_t access, nxt_fd_t dfd,
108     nxt_uint_t resolve);
109 #endif
110 
111 
112 /* The file open access modes. */
113 #define NXT_FILE_RDONLY             O_RDONLY
114 #define NXT_FILE_WRONLY             O_WRONLY
115 #define NXT_FILE_RDWR               O_RDWR
116 #define NXT_FILE_APPEND             (O_WRONLY | O_APPEND)
117 
118 #if (NXT_HAVE_OPENAT2)
119 
120 #if defined(O_DIRECTORY)
121 #define NXT_FILE_DIRECTORY          O_DIRECTORY
122 #else
123 #define NXT_FILE_DIRECTORY          0
124 #endif
125 
126 #if defined(O_SEARCH)
127 #define NXT_FILE_SEARCH             (O_SEARCH|NXT_FILE_DIRECTORY)
128 
129 #elif defined(O_EXEC)
130 #define NXT_FILE_SEARCH             (O_EXEC|NXT_FILE_DIRECTORY)
131 
132 #else
133 /*
134  * O_PATH is used in combination with O_RDONLY.  The last one is ignored
135  * if O_PATH is used, but it allows Unit to not fail when it was built on
136  * modern system (i.e. glibc 2.14+) and run with a kernel older than 2.6.39.
137  * Then O_PATH is unknown to the kernel and ignored, while O_RDONLY is used.
138  */
139 #define NXT_FILE_SEARCH             (O_PATH|O_RDONLY|NXT_FILE_DIRECTORY)
140 #endif
141 
142 #endif /* NXT_HAVE_OPENAT2 */
143 
144 /* The file creation modes. */
145 #define NXT_FILE_CREATE_OR_OPEN     O_CREAT
146 #define NXT_FILE_OPEN               0
147 #define NXT_FILE_TRUNCATE           (O_CREAT | O_TRUNC)
148 
149 /* The file access rights. */
150 #define NXT_FILE_DEFAULT_ACCESS     0644
151 #define NXT_FILE_OWNER_ACCESS       0600
152 
153 
154 NXT_EXPORT void nxt_file_close(nxt_task_t *task, nxt_file_t *file);
155 NXT_EXPORT ssize_t nxt_file_write(nxt_file_t *file, const u_char *buf,
156     size_t size, nxt_off_t offset);
157 NXT_EXPORT ssize_t nxt_file_read(nxt_file_t *file, u_char *buf, size_t size,
158     nxt_off_t offset);
159 NXT_EXPORT void nxt_file_read_ahead(nxt_file_t *file, nxt_off_t offset,
160     size_t size);
161 NXT_EXPORT nxt_int_t nxt_file_info(nxt_file_t *file, nxt_file_info_t *fi);
162 
163 
164 #define nxt_is_dir(fi)                                                        \
165     (S_ISDIR((fi)->st_mode))
166 
167 #define nxt_is_file(fi)                                                       \
168     (S_ISREG((fi)->st_mode))
169 
170 #define nxt_file_size(fi)                                                     \
171     (fi)->st_size
172 
173 #define nxt_file_mtime(fi)                                                    \
174     (fi)->st_mtime
175 
176 
177 NXT_EXPORT nxt_int_t nxt_file_delete(nxt_file_name_t *name);
178 NXT_EXPORT nxt_int_t nxt_file_set_access(nxt_file_name_t *name,
179     nxt_file_access_t access);
180 NXT_EXPORT nxt_int_t nxt_file_chown(nxt_file_name_t *name, const char *owner,
181     const char *group);
182 NXT_EXPORT nxt_int_t nxt_file_rename(nxt_file_name_t *old_name,
183     nxt_file_name_t *new_name);
184 
185 NXT_EXPORT nxt_int_t nxt_fd_nonblocking(nxt_task_t *task, nxt_fd_t fd);
186 NXT_EXPORT nxt_int_t nxt_fd_blocking(nxt_task_t *task, nxt_fd_t fd);
187 NXT_EXPORT ssize_t nxt_fd_write(nxt_fd_t fd, u_char *buf, size_t size);
188 NXT_EXPORT ssize_t nxt_fd_read(nxt_fd_t fd, u_char *buf, size_t size);
189 NXT_EXPORT void nxt_fd_close(nxt_fd_t fd);
190 
191 NXT_EXPORT FILE *nxt_file_fopen(nxt_task_t *task, const char *pathname,
192     const char *mode);
193 NXT_EXPORT void nxt_file_fclose(nxt_task_t *task, FILE *fp);
194 
195 NXT_EXPORT nxt_int_t nxt_file_redirect(nxt_file_t *file, nxt_fd_t fd);
196 NXT_EXPORT nxt_int_t nxt_file_stdout(nxt_file_t *file);
197 NXT_EXPORT nxt_int_t nxt_file_stderr(nxt_file_t *file);
198 NXT_EXPORT nxt_int_t nxt_stderr_start(void);
199 
200 
201 #define nxt_stdout  STDOUT_FILENO
202 #define nxt_stderr  STDERR_FILENO
203 
204 
205 #define nxt_write_console(fd, buf, size)                                      \
206     write(fd, buf, size)
207 
208 #define nxt_write_syslog(priority, message)                                   \
209     syslog(priority, "%s", message)
210 
211 
212 NXT_EXPORT nxt_int_t nxt_pipe_create(nxt_task_t *task, nxt_fd_t *pp,
213     nxt_bool_t nbread, nxt_bool_t nbwrite);
214 NXT_EXPORT void nxt_pipe_close(nxt_task_t *task, nxt_fd_t *pp);
215 
216 NXT_EXPORT size_t nxt_dir_current(char *buf, size_t len);
217 
218 
219 #endif /* _NXT_UNIX_FILE_H_INCLUDED_ */
220