xref: /unit/src/nxt_file.h (revision 13:3a52b2c3d3f1)
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                                                                       \
31 nxt_file_name_str_set(file_name, mem_pool, name)                              \
32     ((file_name) = (nxt_file_name_t *) (name), NXT_OK)
33 
34 
35 #define                                                                       \
36 nxt_file_name_alloc(mem_pool, len)                                            \
37     nxt_mem_nalloc(mem_pool, len)
38 
39 
40 #define                                                                       \
41 nxt_file_name_copy(dst, src, len)                                             \
42     nxt_cpymem(dst, src, len)
43 
44 
45 #define                                                                       \
46 nxt_file_name_add(dst, src, len)                                              \
47     nxt_cpymem(dst, src, len)
48 
49 
50 #if (NXT_HAVE_CASELESS_FILESYSTEM)
51 
52 /* MacOSX, Cygwin. */
53 
54 #define                                                                       \
55 nxt_file_name_eq(fn1, fn2)                                                    \
56     (nxt_strcasecmp(fn1, fn2) == 0)
57 
58 #else
59 
60 #define                                                                       \
61 nxt_file_name_eq(fn1, fn2)                                                    \
62     (nxt_strcmp(fn1, fn2) == 0)
63 
64 #endif
65 
66 
67 #define                                                                       \
68 nxt_file_name_is_absolute(name)                                               \
69     (name[0] == '/')
70 
71 
72 #define NXT_MAX_PATH_LEN            MAXPATHLEN
73 
74 
75 typedef enum {
76     NXT_FILE_UNKNOWN = 0,
77     NXT_FILE_REGULAR,
78     NXT_FILE_DIRECTORY,
79 } nxt_file_type_t;
80 
81 
82 typedef struct {
83     nxt_file_name_t                 *name;
84 
85     /* Both are int's. */
86     nxt_fd_t                        fd;
87     nxt_err_t                       error;
88 
89 #define NXT_FILE_ACCESSED_LONG_AGO  0xffff
90     /*
91      * Number of seconds ago the file content was last
92      * read.  The maximum value is about 18 hours.
93      */
94     uint16_t                        accessed;
95 
96     uint8_t                         type;       /* nxt_file_type_t */
97 
98     /*
99      * Log open() file error with given log level if it is non zero.
100      * Note that zero log level is NXT_LOG_EMERG.
101      */
102     uint8_t                         log_level;
103 
104     nxt_time_t                      mtime;
105     nxt_off_t                       size;
106 } nxt_file_t;
107 
108 
109 NXT_EXPORT nxt_int_t nxt_file_open(nxt_file_t *file, nxt_uint_t mode,
110     nxt_uint_t create, nxt_file_access_t access);
111 
112 #define nxt_file_open_n             "open"
113 
114 
115 /* The file open access modes. */
116 #define NXT_FILE_RDONLY             O_RDONLY
117 #define NXT_FILE_WRONLY             O_WRONLY
118 #define NXT_FILE_RDWR               O_RDWR
119 #define NXT_FILE_APPEND             (O_WRONLY | O_APPEND)
120 
121 /* The file creation modes. */
122 #define NXT_FILE_CREATE_OR_OPEN     O_CREAT
123 #define NXT_FILE_OPEN               0
124 #define NXT_FILE_TRUNCATE           (O_CREAT | O_TRUNC)
125 
126 /* The file access rights. */
127 #define NXT_FILE_DEFAULT_ACCESS     0644
128 #define NXT_FILE_OWNER_ACCESS       0600
129 
130 
131 NXT_EXPORT void nxt_file_close(nxt_file_t *file);
132 NXT_EXPORT ssize_t nxt_file_write(nxt_file_t *file, const u_char *buf,
133     size_t size, nxt_off_t offset);
134 NXT_EXPORT ssize_t nxt_file_read(nxt_file_t *file, u_char *buf, size_t size,
135     nxt_off_t offset);
136 NXT_EXPORT void nxt_file_read_ahead(nxt_file_t *file, nxt_off_t offset,
137     size_t size);
138 NXT_EXPORT nxt_int_t nxt_file_info(nxt_file_t *file, nxt_file_info_t *fi);
139 
140 
141 #define                                                                       \
142 nxt_is_dir(fi)                                                                \
143     (S_ISDIR((fi)->st_mode))
144 
145 #define                                                                       \
146 nxt_is_file(fi)                                                               \
147     (S_ISREG((fi)->st_mode))
148 
149 #define                                                                       \
150 nxt_file_size(fi)                                                             \
151     (fi)->st_size
152 
153 #define                                                                       \
154 nxt_file_mtime(fi)                                                            \
155     (fi)->st_mtime
156 
157 
158 NXT_EXPORT nxt_int_t nxt_file_delete(nxt_file_name_t *name);
159 NXT_EXPORT nxt_int_t nxt_file_set_access(nxt_file_name_t *name,
160     nxt_file_access_t access);
161 NXT_EXPORT nxt_int_t nxt_file_rename(nxt_file_name_t *old_name,
162     nxt_file_name_t *new_name);
163 
164 NXT_EXPORT nxt_int_t nxt_fd_nonblocking(nxt_task_t *task, nxt_fd_t fd);
165 NXT_EXPORT nxt_int_t nxt_fd_blocking(nxt_task_t *task, nxt_fd_t fd);
166 NXT_EXPORT ssize_t nxt_fd_write(nxt_fd_t fd, u_char *buf, size_t size);
167 NXT_EXPORT ssize_t nxt_fd_read(nxt_fd_t fd, u_char *buf, size_t size);
168 NXT_EXPORT void nxt_fd_close(nxt_fd_t fd);
169 
170 NXT_EXPORT nxt_int_t nxt_file_redirect(nxt_file_t *file, nxt_fd_t fd);
171 NXT_EXPORT nxt_int_t nxt_file_stderr(nxt_file_t *file);
172 NXT_EXPORT nxt_int_t nxt_stderr_start(void);
173 
174 
175 #define nxt_stdout  STDOUT_FILENO
176 #define nxt_stderr  STDERR_FILENO
177 
178 
179 #define                                                                       \
180 nxt_write_console(fd, buf, size)                                              \
181     write(fd, buf, size)
182 
183 #define                                                                       \
184 nxt_write_syslog(priority, message)                                           \
185     syslog(priority, "%s", message)
186 
187 
188 NXT_EXPORT nxt_int_t nxt_pipe_create(nxt_task_t *task, nxt_fd_t *pp,
189     nxt_bool_t nbread, nxt_bool_t nbwrite);
190 NXT_EXPORT void nxt_pipe_close(nxt_task_t *task, nxt_fd_t *pp);
191 
192 NXT_EXPORT size_t nxt_dir_current(char *buf, size_t len);
193 
194 
195 #endif /* _NXT_UNIX_FILE_H_INCLUDED_ */
196