Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
Igor Sysoev | ff8da91 | 2004-09-29 16:00:49 +0000 | [diff] [blame] | 3 | * Copyright (C) Igor Sysoev |
Maxim Konovalov | f8d59e3 | 2012-01-18 15:07:43 +0000 | [diff] [blame] | 4 | * Copyright (C) Nginx, Inc. |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 8 | #ifndef _NGX_FILES_H_INCLUDED_ |
| 9 | #define _NGX_FILES_H_INCLUDED_ |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 10 | |
| 11 | |
Igor Sysoev | 86de4cb | 2003-01-30 07:28:09 +0000 | [diff] [blame] | 12 | #include <ngx_config.h> |
Igor Sysoev | a536298 | 2004-03-04 07:04:55 +0000 | [diff] [blame] | 13 | #include <ngx_core.h> |
Igor Sysoev | 86de4cb | 2003-01-30 07:28:09 +0000 | [diff] [blame] | 14 | |
| 15 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 16 | typedef int ngx_fd_t; |
| 17 | typedef struct stat ngx_file_info_t; |
| 18 | typedef ino_t ngx_file_uniq_t; |
| 19 | |
| 20 | |
| 21 | typedef struct { |
Igor Sysoev | 865db9b | 2010-06-29 15:18:50 +0000 | [diff] [blame] | 22 | u_char *name; |
| 23 | size_t size; |
| 24 | void *addr; |
| 25 | ngx_fd_t fd; |
| 26 | ngx_log_t *log; |
| 27 | } ngx_file_mapping_t; |
| 28 | |
| 29 | |
| 30 | typedef struct { |
Igor Sysoev | eb5a64f | 2009-06-11 05:51:37 +0000 | [diff] [blame] | 31 | DIR *dir; |
| 32 | struct dirent *de; |
| 33 | struct stat info; |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 34 | |
Igor Sysoev | eb5a64f | 2009-06-11 05:51:37 +0000 | [diff] [blame] | 35 | unsigned type:8; |
| 36 | unsigned valid_info:1; |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 37 | } ngx_dir_t; |
| 38 | |
| 39 | |
| 40 | typedef struct { |
| 41 | size_t n; |
| 42 | glob_t pglob; |
| 43 | u_char *pattern; |
| 44 | ngx_log_t *log; |
| 45 | ngx_uint_t test; |
| 46 | } ngx_glob_t; |
| 47 | |
| 48 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 49 | #define NGX_INVALID_FILE -1 |
| 50 | #define NGX_FILE_ERROR -1 |
| 51 | |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 52 | |
| 53 | |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 54 | #ifdef __CYGWIN__ |
| 55 | |
Maxim Dounin | 3183d7e | 2014-03-31 21:38:25 +0400 | [diff] [blame] | 56 | #ifndef NGX_HAVE_CASELESS_FILESYSTEM |
Igor Sysoev | 0f17f6c | 2008-07-29 16:55:11 +0000 | [diff] [blame] | 57 | #define NGX_HAVE_CASELESS_FILESYSTEM 1 |
Maxim Dounin | 3183d7e | 2014-03-31 21:38:25 +0400 | [diff] [blame] | 58 | #endif |
Igor Sysoev | 0f17f6c | 2008-07-29 16:55:11 +0000 | [diff] [blame] | 59 | |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 60 | #define ngx_open_file(name, mode, create, access) \ |
| 61 | open((const char *) name, mode|create|O_BINARY, access) |
| 62 | |
| 63 | #else |
| 64 | |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 65 | #define ngx_open_file(name, mode, create, access) \ |
| 66 | open((const char *) name, mode|create, access) |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 67 | |
| 68 | #endif |
| 69 | |
Igor Sysoev | 83661a9 | 2002-08-23 16:14:30 +0000 | [diff] [blame] | 70 | #define ngx_open_file_n "open()" |
| 71 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 72 | #define NGX_FILE_RDONLY O_RDONLY |
Igor Sysoev | a3eef70 | 2007-01-18 20:37:19 +0000 | [diff] [blame] | 73 | #define NGX_FILE_WRONLY O_WRONLY |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 74 | #define NGX_FILE_RDWR O_RDWR |
| 75 | #define NGX_FILE_CREATE_OR_OPEN O_CREAT |
| 76 | #define NGX_FILE_OPEN 0 |
Gleb Smirnoff | 050f74b | 2013-07-05 11:42:25 +0400 | [diff] [blame] | 77 | #define NGX_FILE_TRUNCATE (O_CREAT|O_TRUNC) |
| 78 | #define NGX_FILE_APPEND (O_WRONLY|O_APPEND) |
Igor Sysoev | bfc8b78 | 2010-04-21 15:59:36 +0000 | [diff] [blame] | 79 | #define NGX_FILE_NONBLOCK O_NONBLOCK |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 80 | |
Andrey Belov | 71205c3 | 2012-02-13 16:13:21 +0000 | [diff] [blame] | 81 | #if (NGX_HAVE_OPENAT) |
| 82 | #define NGX_FILE_NOFOLLOW O_NOFOLLOW |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 83 | |
| 84 | #if defined(O_DIRECTORY) |
| 85 | #define NGX_FILE_DIRECTORY O_DIRECTORY |
| 86 | #else |
| 87 | #define NGX_FILE_DIRECTORY 0 |
Andrey Belov | 71205c3 | 2012-02-13 16:13:21 +0000 | [diff] [blame] | 88 | #endif |
| 89 | |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 90 | #if defined(O_SEARCH) |
Gleb Smirnoff | 050f74b | 2013-07-05 11:42:25 +0400 | [diff] [blame] | 91 | #define NGX_FILE_SEARCH (O_SEARCH|NGX_FILE_DIRECTORY) |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 92 | |
| 93 | #elif defined(O_EXEC) |
Gleb Smirnoff | 050f74b | 2013-07-05 11:42:25 +0400 | [diff] [blame] | 94 | #define NGX_FILE_SEARCH (O_EXEC|NGX_FILE_DIRECTORY) |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 95 | |
Valentin Bartenev | 7b37384 | 2013-09-02 08:07:59 +0400 | [diff] [blame] | 96 | #elif (NGX_HAVE_O_PATH) |
| 97 | #define NGX_FILE_SEARCH (O_PATH|O_RDONLY|NGX_FILE_DIRECTORY) |
| 98 | |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 99 | #else |
Gleb Smirnoff | 050f74b | 2013-07-05 11:42:25 +0400 | [diff] [blame] | 100 | #define NGX_FILE_SEARCH (O_RDONLY|NGX_FILE_DIRECTORY) |
Valentin Bartenev | 86c5513 | 2012-02-21 15:10:13 +0000 | [diff] [blame] | 101 | #endif |
| 102 | |
| 103 | #endif /* NGX_HAVE_OPENAT */ |
| 104 | |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 105 | #define NGX_FILE_DEFAULT_ACCESS 0644 |
Igor Sysoev | 52859f2 | 2009-03-23 13:14:51 +0000 | [diff] [blame] | 106 | #define NGX_FILE_OWNER_ACCESS 0600 |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 107 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 108 | |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 109 | #define ngx_close_file close |
| 110 | #define ngx_close_file_n "close()" |
| 111 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 112 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 113 | #define ngx_delete_file(name) unlink((const char *) name) |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 114 | #define ngx_delete_file_n "unlink()" |
| 115 | |
| 116 | |
Igor Sysoev | 8a2b2fb | 2006-04-14 09:53:38 +0000 | [diff] [blame] | 117 | ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent, |
Igor Sysoev | fe1cb8c | 2007-01-18 19:52:18 +0000 | [diff] [blame] | 118 | ngx_uint_t access); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 119 | #define ngx_open_tempfile_n "open()" |
| 120 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 121 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 122 | ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset); |
Igor Sysoev | b17e332 | 2008-08-15 20:14:49 +0000 | [diff] [blame] | 123 | #if (NGX_HAVE_PREAD) |
| 124 | #define ngx_read_file_n "pread()" |
| 125 | #else |
Igor Sysoev | 83661a9 | 2002-08-23 16:14:30 +0000 | [diff] [blame] | 126 | #define ngx_read_file_n "read()" |
Igor Sysoev | b17e332 | 2008-08-15 20:14:49 +0000 | [diff] [blame] | 127 | #endif |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 128 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 129 | ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 130 | off_t offset); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 131 | |
| 132 | ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 133 | off_t offset, ngx_pool_t *pool); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 134 | |
| 135 | |
Igor Sysoev | 83ff0cd | 2007-01-18 20:39:30 +0000 | [diff] [blame] | 136 | #define ngx_read_fd read |
| 137 | #define ngx_read_fd_n "read()" |
| 138 | |
Igor Sysoev | f2884e1 | 2008-11-11 16:17:45 +0000 | [diff] [blame] | 139 | /* |
| 140 | * we use inlined function instead of simple #define |
| 141 | * because glibc 2.3 sets warn_unused_result attribute for write() |
| 142 | * and in this case gcc 4.3 ignores (void) cast |
| 143 | */ |
| 144 | static ngx_inline ssize_t |
| 145 | ngx_write_fd(ngx_fd_t fd, void *buf, size_t n) |
| 146 | { |
| 147 | return write(fd, buf, n); |
| 148 | } |
| 149 | |
Igor Sysoev | 83ff0cd | 2007-01-18 20:39:30 +0000 | [diff] [blame] | 150 | #define ngx_write_fd_n "write()" |
| 151 | |
Igor Sysoev | 9d4a8d9 | 2009-04-28 15:05:27 +0000 | [diff] [blame] | 152 | |
| 153 | #define ngx_write_console ngx_write_fd |
| 154 | |
| 155 | |
Igor Sysoev | 697d1ae | 2005-10-27 15:46:13 +0000 | [diff] [blame] | 156 | #define ngx_linefeed(p) *p++ = LF; |
| 157 | #define NGX_LINEFEED_SIZE 1 |
Igor Sysoev | 07bb4ed | 2011-11-14 14:59:00 +0000 | [diff] [blame] | 158 | #define NGX_LINEFEED "\x0a" |
Igor Sysoev | 697d1ae | 2005-10-27 15:46:13 +0000 | [diff] [blame] | 159 | |
| 160 | |
Igor Sysoev | 8a2b2fb | 2006-04-14 09:53:38 +0000 | [diff] [blame] | 161 | #define ngx_rename_file(o, n) rename((const char *) o, (const char *) n) |
Igor Sysoev | da173ab | 2006-08-30 10:39:17 +0000 | [diff] [blame] | 162 | #define ngx_rename_file_n "rename()" |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 163 | |
| 164 | |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 165 | #define ngx_change_file_access(n, a) chmod((const char *) n, a) |
Igor Sysoev | da173ab | 2006-08-30 10:39:17 +0000 | [diff] [blame] | 166 | #define ngx_change_file_access_n "chmod()" |
| 167 | |
| 168 | |
| 169 | ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s); |
| 170 | #define ngx_set_file_time_n "utimes()" |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 171 | |
| 172 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 173 | #define ngx_file_info(file, sb) stat((const char *) file, sb) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 174 | #define ngx_file_info_n "stat()" |
| 175 | |
| 176 | #define ngx_fd_info(fd, sb) fstat(fd, sb) |
| 177 | #define ngx_fd_info_n "fstat()" |
| 178 | |
Igor Sysoev | 3ec15dd | 2010-04-22 17:15:42 +0000 | [diff] [blame] | 179 | #define ngx_link_info(file, sb) lstat((const char *) file, sb) |
| 180 | #define ngx_link_info_n "lstat()" |
| 181 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 182 | #define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode)) |
| 183 | #define ngx_is_file(sb) (S_ISREG((sb)->st_mode)) |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 184 | #define ngx_is_link(sb) (S_ISLNK((sb)->st_mode)) |
Igor Sysoev | f4b598b | 2009-11-03 14:57:27 +0000 | [diff] [blame] | 185 | #define ngx_is_exec(sb) (((sb)->st_mode & S_IXUSR) == S_IXUSR) |
Igor Sysoev | 4a27d0f | 2007-01-18 20:31:22 +0000 | [diff] [blame] | 186 | #define ngx_file_access(sb) ((sb)->st_mode & 0777) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 187 | #define ngx_file_size(sb) (sb)->st_size |
Maxim Dounin | c66a1e7 | 2012-02-28 11:09:02 +0000 | [diff] [blame] | 188 | #define ngx_file_fs_size(sb) ngx_max((sb)->st_size, (sb)->st_blocks * 512) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 189 | #define ngx_file_mtime(sb) (sb)->st_mtime |
| 190 | #define ngx_file_uniq(sb) (sb)->st_ino |
| 191 | |
| 192 | |
Igor Sysoev | 865db9b | 2010-06-29 15:18:50 +0000 | [diff] [blame] | 193 | ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm); |
| 194 | void ngx_close_file_mapping(ngx_file_mapping_t *fm); |
| 195 | |
| 196 | |
Maxim Dounin | 36aef0c | 2012-03-27 16:42:34 +0000 | [diff] [blame] | 197 | #define ngx_realpath(p, r) (u_char *) realpath((char *) p, (char *) r) |
Igor Sysoev | 6736614 | 2008-09-27 11:53:41 +0000 | [diff] [blame] | 198 | #define ngx_realpath_n "realpath()" |
Igor Sysoev | 5ef370d | 2009-04-27 11:32:33 +0000 | [diff] [blame] | 199 | #define ngx_getcwd(buf, size) (getcwd((char *) buf, size) != NULL) |
Igor Sysoev | ab517d5 | 2004-05-18 15:29:08 +0000 | [diff] [blame] | 200 | #define ngx_getcwd_n "getcwd()" |
Igor Sysoev | bf14b00 | 2009-04-23 16:38:59 +0000 | [diff] [blame] | 201 | #define ngx_path_separator(c) ((c) == '/') |
| 202 | |
Maxim Dounin | 36aef0c | 2012-03-27 16:42:34 +0000 | [diff] [blame] | 203 | |
| 204 | #if defined(PATH_MAX) |
| 205 | |
| 206 | #define NGX_HAVE_MAX_PATH 1 |
Igor Sysoev | ab517d5 | 2004-05-18 15:29:08 +0000 | [diff] [blame] | 207 | #define NGX_MAX_PATH PATH_MAX |
| 208 | |
Maxim Dounin | 36aef0c | 2012-03-27 16:42:34 +0000 | [diff] [blame] | 209 | #else |
| 210 | |
| 211 | #define NGX_MAX_PATH 4096 |
| 212 | |
| 213 | #endif |
| 214 | |
| 215 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 216 | #define NGX_DIR_MASK_LEN 0 |
| 217 | |
| 218 | |
Igor Sysoev | d43bee8 | 2004-11-20 19:52:20 +0000 | [diff] [blame] | 219 | ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 220 | #define ngx_open_dir_n "opendir()" |
| 221 | |
| 222 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 223 | #define ngx_close_dir(d) closedir((d)->dir) |
| 224 | #define ngx_close_dir_n "closedir()" |
| 225 | |
| 226 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 227 | ngx_int_t ngx_read_dir(ngx_dir_t *dir); |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 228 | #define ngx_read_dir_n "readdir()" |
| 229 | |
| 230 | |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 231 | #define ngx_create_dir(name, access) mkdir((const char *) name, access) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 232 | #define ngx_create_dir_n "mkdir()" |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 233 | |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 234 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 235 | #define ngx_delete_dir(name) rmdir((const char *) name) |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 236 | #define ngx_delete_dir_n "rmdir()" |
| 237 | |
| 238 | |
Igor Sysoev | e31625b | 2007-01-29 12:25:44 +0000 | [diff] [blame] | 239 | #define ngx_dir_access(a) (a | (a & 0444) >> 2) |
| 240 | |
| 241 | |
Igor Sysoev | 723e6cc | 2004-10-25 15:29:23 +0000 | [diff] [blame] | 242 | #define ngx_de_name(dir) ((u_char *) (dir)->de->d_name) |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 243 | #if (NGX_HAVE_D_NAMLEN) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 244 | #define ngx_de_namelen(dir) (dir)->de->d_namlen |
| 245 | #else |
| 246 | #define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) |
| 247 | #endif |
Igor Sysoev | e58700d | 2009-10-14 11:33:35 +0000 | [diff] [blame] | 248 | |
| 249 | static ngx_inline ngx_int_t |
| 250 | ngx_de_info(u_char *name, ngx_dir_t *dir) |
| 251 | { |
| 252 | dir->type = 0; |
| 253 | return stat((const char *) name, &dir->info); |
| 254 | } |
| 255 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 256 | #define ngx_de_info_n "stat()" |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 257 | #define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) |
| 258 | #define ngx_de_link_info_n "lstat()" |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 259 | |
| 260 | #if (NGX_HAVE_D_TYPE) |
| 261 | |
Igor Sysoev | e58700d | 2009-10-14 11:33:35 +0000 | [diff] [blame] | 262 | /* |
| 263 | * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD) |
| 264 | * do not set dirent.d_type |
| 265 | */ |
Igor Sysoev | 78c95de | 2009-03-06 13:01:21 +0000 | [diff] [blame] | 266 | |
| 267 | #define ngx_de_is_dir(dir) \ |
| 268 | (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) |
| 269 | #define ngx_de_is_file(dir) \ |
| 270 | (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) |
| 271 | #define ngx_de_is_link(dir) \ |
Igor Sysoev | e58700d | 2009-10-14 11:33:35 +0000 | [diff] [blame] | 272 | (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode))) |
Igor Sysoev | 78c95de | 2009-03-06 13:01:21 +0000 | [diff] [blame] | 273 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 274 | #else |
| 275 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 276 | #define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) |
| 277 | #define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 278 | #define ngx_de_is_link(dir) (S_ISLNK((dir)->info.st_mode)) |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 279 | |
| 280 | #endif |
| 281 | |
Igor Sysoev | 4a27d0f | 2007-01-18 20:31:22 +0000 | [diff] [blame] | 282 | #define ngx_de_access(dir) (((dir)->info.st_mode) & 0777) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 283 | #define ngx_de_size(dir) (dir)->info.st_size |
Maxim Dounin | c66a1e7 | 2012-02-28 11:09:02 +0000 | [diff] [blame] | 284 | #define ngx_de_fs_size(dir) \ |
| 285 | ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 286 | #define ngx_de_mtime(dir) (dir)->info.st_mtime |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 287 | |
| 288 | |
Igor Sysoev | 97c2f46 | 2006-10-02 08:46:45 +0000 | [diff] [blame] | 289 | ngx_int_t ngx_open_glob(ngx_glob_t *gl); |
| 290 | #define ngx_open_glob_n "glob()" |
| 291 | ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name); |
| 292 | void ngx_close_glob(ngx_glob_t *gl); |
| 293 | |
| 294 | |
Igor Sysoev | ffe7144 | 2006-02-08 15:33:12 +0000 | [diff] [blame] | 295 | ngx_err_t ngx_trylock_fd(ngx_fd_t fd); |
| 296 | ngx_err_t ngx_lock_fd(ngx_fd_t fd); |
| 297 | ngx_err_t ngx_unlock_fd(ngx_fd_t fd); |
| 298 | |
| 299 | #define ngx_trylock_fd_n "fcntl(F_SETLK, F_WRLCK)" |
| 300 | #define ngx_lock_fd_n "fcntl(F_SETLKW, F_WRLCK)" |
| 301 | #define ngx_unlock_fd_n "fcntl(F_SETLK, F_UNLCK)" |
| 302 | |
| 303 | |
Igor Sysoev | 3266171 | 2009-09-30 13:21:52 +0000 | [diff] [blame] | 304 | #if (NGX_HAVE_F_READAHEAD) |
| 305 | |
| 306 | #define NGX_HAVE_READ_AHEAD 1 |
| 307 | |
| 308 | #define ngx_read_ahead(fd, n) fcntl(fd, F_READAHEAD, (int) n) |
| 309 | #define ngx_read_ahead_n "fcntl(fd, F_READAHEAD)" |
| 310 | |
| 311 | #elif (NGX_HAVE_POSIX_FADVISE) |
| 312 | |
| 313 | #define NGX_HAVE_READ_AHEAD 1 |
| 314 | |
Igor Sysoev | 700a779 | 2009-11-15 09:16:58 +0000 | [diff] [blame] | 315 | ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n); |
Igor Sysoev | 3266171 | 2009-09-30 13:21:52 +0000 | [diff] [blame] | 316 | #define ngx_read_ahead_n "posix_fadvise(POSIX_FADV_SEQUENTIAL)" |
| 317 | |
| 318 | #else |
| 319 | |
| 320 | #define ngx_read_ahead(fd, n) 0 |
| 321 | #define ngx_read_ahead_n "ngx_read_ahead_n" |
| 322 | |
| 323 | #endif |
| 324 | |
| 325 | |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 326 | #if (NGX_HAVE_O_DIRECT) |
| 327 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 328 | ngx_int_t ngx_directio_on(ngx_fd_t fd); |
| 329 | #define ngx_directio_on_n "fcntl(O_DIRECT)" |
| 330 | |
| 331 | ngx_int_t ngx_directio_off(ngx_fd_t fd); |
| 332 | #define ngx_directio_off_n "fcntl(!O_DIRECT)" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 333 | |
| 334 | #elif (NGX_HAVE_F_NOCACHE) |
| 335 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 336 | #define ngx_directio_on(fd) fcntl(fd, F_NOCACHE, 1) |
| 337 | #define ngx_directio_on_n "fcntl(F_NOCACHE, 1)" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 338 | |
Igor Sysoev | b83f893 | 2008-08-04 15:32:10 +0000 | [diff] [blame] | 339 | #elif (NGX_HAVE_DIRECTIO) |
| 340 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 341 | #define ngx_directio_on(fd) directio(fd, DIRECTIO_ON) |
| 342 | #define ngx_directio_on_n "directio(DIRECTIO_ON)" |
Igor Sysoev | b83f893 | 2008-08-04 15:32:10 +0000 | [diff] [blame] | 343 | |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 344 | #else |
| 345 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 346 | #define ngx_directio_on(fd) 0 |
| 347 | #define ngx_directio_on_n "ngx_directio_on_n" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 348 | |
| 349 | #endif |
| 350 | |
Igor Sysoev | 1be7419 | 2009-03-30 07:43:06 +0000 | [diff] [blame] | 351 | size_t ngx_fs_bsize(u_char *name); |
| 352 | |
| 353 | |
Andrey Belov | 71205c3 | 2012-02-13 16:13:21 +0000 | [diff] [blame] | 354 | #if (NGX_HAVE_OPENAT) |
| 355 | |
| 356 | #define ngx_openat_file(fd, name, mode, create, access) \ |
| 357 | openat(fd, (const char *) name, mode|create, access) |
| 358 | |
| 359 | #define ngx_openat_file_n "openat()" |
| 360 | |
| 361 | #define ngx_file_at_info(fd, name, sb, flag) \ |
| 362 | fstatat(fd, (const char *) name, sb, flag) |
| 363 | |
| 364 | #define ngx_file_at_info_n "fstatat()" |
| 365 | |
Maxim Dounin | 7ba66f4 | 2012-02-20 19:14:35 +0000 | [diff] [blame] | 366 | #define NGX_AT_FDCWD (ngx_fd_t) AT_FDCWD |
| 367 | |
Andrey Belov | 71205c3 | 2012-02-13 16:13:21 +0000 | [diff] [blame] | 368 | #endif |
| 369 | |
| 370 | |
Igor Sysoev | c28ff71 | 2009-04-23 11:13:12 +0000 | [diff] [blame] | 371 | #define ngx_stderr STDERR_FILENO |
| 372 | #define ngx_set_stderr(fd) dup2(fd, STDERR_FILENO) |
| 373 | #define ngx_set_stderr_n "dup2(STDERR_FILENO)" |
| 374 | |
| 375 | |
Igor Sysoev | a962506 | 2009-08-28 08:12:35 +0000 | [diff] [blame] | 376 | #if (NGX_HAVE_FILE_AIO) |
| 377 | |
| 378 | ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, |
| 379 | off_t offset, ngx_pool_t *pool); |
| 380 | |
Igor Sysoev | 4121aa3 | 2009-11-05 13:12:30 +0000 | [diff] [blame] | 381 | extern ngx_uint_t ngx_file_aio; |
| 382 | |
Igor Sysoev | a962506 | 2009-08-28 08:12:35 +0000 | [diff] [blame] | 383 | #endif |
| 384 | |
| 385 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 386 | #endif /* _NGX_FILES_H_INCLUDED_ */ |