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 |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 7 | #ifndef _NGX_FILES_H_INCLUDED_ |
| 8 | #define _NGX_FILES_H_INCLUDED_ |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 9 | |
| 10 | |
Igor Sysoev | 86de4cb | 2003-01-30 07:28:09 +0000 | [diff] [blame] | 11 | #include <ngx_config.h> |
Igor Sysoev | a536298 | 2004-03-04 07:04:55 +0000 | [diff] [blame] | 12 | #include <ngx_core.h> |
Igor Sysoev | 86de4cb | 2003-01-30 07:28:09 +0000 | [diff] [blame] | 13 | |
| 14 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 15 | typedef int ngx_fd_t; |
| 16 | typedef struct stat ngx_file_info_t; |
| 17 | typedef ino_t ngx_file_uniq_t; |
| 18 | |
| 19 | |
| 20 | typedef struct { |
| 21 | DIR *dir; |
| 22 | struct dirent *de; |
| 23 | struct stat info; |
| 24 | |
| 25 | unsigned type:8; |
| 26 | unsigned valid_info:1; |
| 27 | unsigned valid_type:1; |
| 28 | } ngx_dir_t; |
| 29 | |
| 30 | |
| 31 | typedef struct { |
| 32 | size_t n; |
| 33 | glob_t pglob; |
| 34 | u_char *pattern; |
| 35 | ngx_log_t *log; |
| 36 | ngx_uint_t test; |
| 37 | } ngx_glob_t; |
| 38 | |
| 39 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 40 | #define NGX_INVALID_FILE -1 |
| 41 | #define NGX_FILE_ERROR -1 |
| 42 | |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 43 | |
| 44 | |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 45 | #ifdef __CYGWIN__ |
| 46 | |
Igor Sysoev | 0f17f6c | 2008-07-29 16:55:11 +0000 | [diff] [blame] | 47 | #define NGX_HAVE_CASELESS_FILESYSTEM 1 |
| 48 | |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 49 | #define ngx_open_file(name, mode, create, access) \ |
| 50 | open((const char *) name, mode|create|O_BINARY, access) |
| 51 | |
| 52 | #else |
| 53 | |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 54 | #define ngx_open_file(name, mode, create, access) \ |
| 55 | open((const char *) name, mode|create, access) |
Igor Sysoev | b39b9aa | 2008-04-24 19:19:26 +0000 | [diff] [blame] | 56 | |
| 57 | #endif |
| 58 | |
Igor Sysoev | 83661a9 | 2002-08-23 16:14:30 +0000 | [diff] [blame] | 59 | #define ngx_open_file_n "open()" |
| 60 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 61 | #define NGX_FILE_RDONLY O_RDONLY |
Igor Sysoev | a3eef70 | 2007-01-18 20:37:19 +0000 | [diff] [blame] | 62 | #define NGX_FILE_WRONLY O_WRONLY |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 63 | #define NGX_FILE_RDWR O_RDWR |
| 64 | #define NGX_FILE_CREATE_OR_OPEN O_CREAT |
| 65 | #define NGX_FILE_OPEN 0 |
Igor Sysoev | 2ec2e35 | 2009-04-08 19:03:41 +0000 | [diff] [blame] | 66 | #define NGX_FILE_TRUNCATE O_CREAT|O_TRUNC |
Igor Sysoev | 24c2787 | 2009-03-31 13:52:01 +0000 | [diff] [blame] | 67 | #define NGX_FILE_APPEND O_WRONLY|O_APPEND |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 68 | |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 69 | #define NGX_FILE_DEFAULT_ACCESS 0644 |
Igor Sysoev | 52859f2 | 2009-03-23 13:14:51 +0000 | [diff] [blame] | 70 | #define NGX_FILE_OWNER_ACCESS 0600 |
Igor Sysoev | 50034b8 | 2007-01-18 20:15:09 +0000 | [diff] [blame] | 71 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 72 | |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 73 | #define ngx_close_file close |
| 74 | #define ngx_close_file_n "close()" |
| 75 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 76 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 77 | #define ngx_delete_file(name) unlink((const char *) name) |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 78 | #define ngx_delete_file_n "unlink()" |
| 79 | |
| 80 | |
Igor Sysoev | 8a2b2fb | 2006-04-14 09:53:38 +0000 | [diff] [blame] | 81 | 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] | 82 | ngx_uint_t access); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 83 | #define ngx_open_tempfile_n "open()" |
| 84 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 85 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 86 | 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] | 87 | #if (NGX_HAVE_PREAD) |
| 88 | #define ngx_read_file_n "pread()" |
| 89 | #else |
Igor Sysoev | 83661a9 | 2002-08-23 16:14:30 +0000 | [diff] [blame] | 90 | #define ngx_read_file_n "read()" |
Igor Sysoev | b17e332 | 2008-08-15 20:14:49 +0000 | [diff] [blame] | 91 | #endif |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 92 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 93 | 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] | 94 | off_t offset); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 95 | |
| 96 | 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] | 97 | off_t offset, ngx_pool_t *pool); |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 98 | |
| 99 | |
Igor Sysoev | 83ff0cd | 2007-01-18 20:39:30 +0000 | [diff] [blame] | 100 | #define ngx_read_fd read |
| 101 | #define ngx_read_fd_n "read()" |
| 102 | |
Igor Sysoev | f2884e1 | 2008-11-11 16:17:45 +0000 | [diff] [blame] | 103 | /* |
| 104 | * we use inlined function instead of simple #define |
| 105 | * because glibc 2.3 sets warn_unused_result attribute for write() |
| 106 | * and in this case gcc 4.3 ignores (void) cast |
| 107 | */ |
| 108 | static ngx_inline ssize_t |
| 109 | ngx_write_fd(ngx_fd_t fd, void *buf, size_t n) |
| 110 | { |
| 111 | return write(fd, buf, n); |
| 112 | } |
| 113 | |
Igor Sysoev | 83ff0cd | 2007-01-18 20:39:30 +0000 | [diff] [blame] | 114 | #define ngx_write_fd_n "write()" |
| 115 | |
Igor Sysoev | 697d1ae | 2005-10-27 15:46:13 +0000 | [diff] [blame] | 116 | #define ngx_linefeed(p) *p++ = LF; |
| 117 | #define NGX_LINEFEED_SIZE 1 |
| 118 | |
| 119 | |
Igor Sysoev | 8a2b2fb | 2006-04-14 09:53:38 +0000 | [diff] [blame] | 120 | #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] | 121 | #define ngx_rename_file_n "rename()" |
Igor Sysoev | 6597749 | 2003-11-02 22:56:18 +0000 | [diff] [blame] | 122 | |
| 123 | |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 124 | #define ngx_change_file_access(n, a) chmod((const char *) n, a) |
Igor Sysoev | da173ab | 2006-08-30 10:39:17 +0000 | [diff] [blame] | 125 | #define ngx_change_file_access_n "chmod()" |
| 126 | |
| 127 | |
| 128 | ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s); |
| 129 | #define ngx_set_file_time_n "utimes()" |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 130 | |
| 131 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 132 | #define ngx_file_info(file, sb) stat((const char *) file, sb) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 133 | #define ngx_file_info_n "stat()" |
| 134 | |
| 135 | #define ngx_fd_info(fd, sb) fstat(fd, sb) |
| 136 | #define ngx_fd_info_n "fstat()" |
| 137 | |
| 138 | #define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode)) |
| 139 | #define ngx_is_file(sb) (S_ISREG((sb)->st_mode)) |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 140 | #define ngx_is_link(sb) (S_ISLNK((sb)->st_mode)) |
| 141 | #define ngx_is_exec(sb) ((sb)->st_mode & S_IXUSR) |
Igor Sysoev | 4a27d0f | 2007-01-18 20:31:22 +0000 | [diff] [blame] | 142 | #define ngx_file_access(sb) ((sb)->st_mode & 0777) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 143 | #define ngx_file_size(sb) (sb)->st_size |
| 144 | #define ngx_file_mtime(sb) (sb)->st_mtime |
| 145 | #define ngx_file_uniq(sb) (sb)->st_ino |
| 146 | |
| 147 | |
Igor Sysoev | 0f17f6c | 2008-07-29 16:55:11 +0000 | [diff] [blame] | 148 | #if (NGX_HAVE_CASELESS_FILESYSTEM) |
| 149 | |
| 150 | #define ngx_filename_cmp(s1, s2, n) strncasecmp((char *) s1, (char *) s2, n) |
| 151 | |
| 152 | #else |
| 153 | |
| 154 | #define ngx_filename_cmp ngx_memcmp |
| 155 | |
| 156 | #endif |
| 157 | |
Igor Sysoev | ab517d5 | 2004-05-18 15:29:08 +0000 | [diff] [blame] | 158 | |
Igor Sysoev | 6736614 | 2008-09-27 11:53:41 +0000 | [diff] [blame] | 159 | #define ngx_realpath(p, r) realpath((char *) p, (char *) r) |
| 160 | #define ngx_realpath_n "realpath()" |
Igor Sysoev | 5ef370d | 2009-04-27 11:32:33 +0000 | [diff] [blame] | 161 | #define ngx_getcwd(buf, size) (getcwd((char *) buf, size) != NULL) |
Igor Sysoev | ab517d5 | 2004-05-18 15:29:08 +0000 | [diff] [blame] | 162 | #define ngx_getcwd_n "getcwd()" |
Igor Sysoev | bf14b00 | 2009-04-23 16:38:59 +0000 | [diff] [blame] | 163 | #define ngx_path_separator(c) ((c) == '/') |
| 164 | |
Igor Sysoev | ab517d5 | 2004-05-18 15:29:08 +0000 | [diff] [blame] | 165 | #define NGX_MAX_PATH PATH_MAX |
| 166 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 167 | #define NGX_DIR_MASK_LEN 0 |
| 168 | |
| 169 | |
Igor Sysoev | d43bee8 | 2004-11-20 19:52:20 +0000 | [diff] [blame] | 170 | 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] | 171 | #define ngx_open_dir_n "opendir()" |
| 172 | |
| 173 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 174 | #define ngx_close_dir(d) closedir((d)->dir) |
| 175 | #define ngx_close_dir_n "closedir()" |
| 176 | |
| 177 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 178 | ngx_int_t ngx_read_dir(ngx_dir_t *dir); |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 179 | #define ngx_read_dir_n "readdir()" |
| 180 | |
| 181 | |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 182 | #define ngx_create_dir(name, access) mkdir((const char *) name, access) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 183 | #define ngx_create_dir_n "mkdir()" |
Igor Sysoev | fd67586 | 2003-04-11 16:01:14 +0000 | [diff] [blame] | 184 | |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 185 | |
Igor Sysoev | 10a543a | 2004-03-16 07:10:12 +0000 | [diff] [blame] | 186 | #define ngx_delete_dir(name) rmdir((const char *) name) |
Igor Sysoev | 297c048 | 2003-11-14 16:52:04 +0000 | [diff] [blame] | 187 | #define ngx_delete_dir_n "rmdir()" |
| 188 | |
| 189 | |
Igor Sysoev | e31625b | 2007-01-29 12:25:44 +0000 | [diff] [blame] | 190 | #define ngx_dir_access(a) (a | (a & 0444) >> 2) |
| 191 | |
| 192 | |
Igor Sysoev | 723e6cc | 2004-10-25 15:29:23 +0000 | [diff] [blame] | 193 | #define ngx_de_name(dir) ((u_char *) (dir)->de->d_name) |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 194 | #if (NGX_HAVE_D_NAMLEN) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 195 | #define ngx_de_namelen(dir) (dir)->de->d_namlen |
| 196 | #else |
| 197 | #define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) |
| 198 | #endif |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 199 | #define ngx_de_info(name, dir) stat((const char *) name, &(dir)->info) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 200 | #define ngx_de_info_n "stat()" |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 201 | #define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) |
| 202 | #define ngx_de_link_info_n "lstat()" |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 203 | |
| 204 | #if (NGX_HAVE_D_TYPE) |
| 205 | |
Igor Sysoev | 78c95de | 2009-03-06 13:01:21 +0000 | [diff] [blame] | 206 | #if (NGX_LINUX) |
| 207 | |
| 208 | /* XFS on Linux does not set dirent.d_type */ |
| 209 | |
| 210 | #define ngx_de_is_dir(dir) \ |
| 211 | (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) |
| 212 | #define ngx_de_is_file(dir) \ |
| 213 | (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) |
| 214 | #define ngx_de_is_link(dir) \ |
| 215 | (((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode))) |
| 216 | |
| 217 | #else |
| 218 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 219 | #define ngx_de_is_dir(dir) ((dir)->type == DT_DIR) |
| 220 | #define ngx_de_is_file(dir) ((dir)->type == DT_REG) |
| 221 | #define ngx_de_is_link(dir) ((dir)->type == DT_LINK) |
| 222 | |
Igor Sysoev | 78c95de | 2009-03-06 13:01:21 +0000 | [diff] [blame] | 223 | #endif /* NGX_LINUX */ |
| 224 | |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 225 | #else |
| 226 | |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 227 | #define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) |
| 228 | #define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) |
Igor Sysoev | 11d7532 | 2005-03-01 15:20:36 +0000 | [diff] [blame] | 229 | #define ngx_de_is_link(dir) (S_ISLNK((dir)->info.st_mode)) |
Igor Sysoev | dfc8dad | 2008-09-05 15:43:34 +0000 | [diff] [blame] | 230 | |
| 231 | #endif |
| 232 | |
Igor Sysoev | 4a27d0f | 2007-01-18 20:31:22 +0000 | [diff] [blame] | 233 | #define ngx_de_access(dir) (((dir)->info.st_mode) & 0777) |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 234 | #define ngx_de_size(dir) (dir)->info.st_size |
| 235 | #define ngx_de_mtime(dir) (dir)->info.st_mtime |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 236 | |
| 237 | |
Igor Sysoev | 97c2f46 | 2006-10-02 08:46:45 +0000 | [diff] [blame] | 238 | ngx_int_t ngx_open_glob(ngx_glob_t *gl); |
| 239 | #define ngx_open_glob_n "glob()" |
| 240 | ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name); |
| 241 | void ngx_close_glob(ngx_glob_t *gl); |
| 242 | |
| 243 | |
Igor Sysoev | ffe7144 | 2006-02-08 15:33:12 +0000 | [diff] [blame] | 244 | ngx_err_t ngx_trylock_fd(ngx_fd_t fd); |
| 245 | ngx_err_t ngx_lock_fd(ngx_fd_t fd); |
| 246 | ngx_err_t ngx_unlock_fd(ngx_fd_t fd); |
| 247 | |
| 248 | #define ngx_trylock_fd_n "fcntl(F_SETLK, F_WRLCK)" |
| 249 | #define ngx_lock_fd_n "fcntl(F_SETLKW, F_WRLCK)" |
| 250 | #define ngx_unlock_fd_n "fcntl(F_SETLK, F_UNLCK)" |
| 251 | |
| 252 | |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 253 | #if (NGX_HAVE_O_DIRECT) |
| 254 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 255 | ngx_int_t ngx_directio_on(ngx_fd_t fd); |
| 256 | #define ngx_directio_on_n "fcntl(O_DIRECT)" |
| 257 | |
| 258 | ngx_int_t ngx_directio_off(ngx_fd_t fd); |
| 259 | #define ngx_directio_off_n "fcntl(!O_DIRECT)" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 260 | |
| 261 | #elif (NGX_HAVE_F_NOCACHE) |
| 262 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 263 | #define ngx_directio_on(fd) fcntl(fd, F_NOCACHE, 1) |
| 264 | #define ngx_directio_on_n "fcntl(F_NOCACHE, 1)" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 265 | |
Igor Sysoev | b83f893 | 2008-08-04 15:32:10 +0000 | [diff] [blame] | 266 | #elif (NGX_HAVE_DIRECTIO) |
| 267 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 268 | #define ngx_directio_on(fd) directio(fd, DIRECTIO_ON) |
| 269 | #define ngx_directio_on_n "directio(DIRECTIO_ON)" |
Igor Sysoev | b83f893 | 2008-08-04 15:32:10 +0000 | [diff] [blame] | 270 | |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 271 | #else |
| 272 | |
Igor Sysoev | fae2c00 | 2008-09-12 13:50:12 +0000 | [diff] [blame] | 273 | #define ngx_directio_on(fd) 0 |
| 274 | #define ngx_directio_on_n "ngx_directio_on_n" |
Igor Sysoev | 385af28 | 2008-07-30 12:34:04 +0000 | [diff] [blame] | 275 | |
| 276 | #endif |
| 277 | |
Igor Sysoev | 1be7419 | 2009-03-30 07:43:06 +0000 | [diff] [blame] | 278 | size_t ngx_fs_bsize(u_char *name); |
| 279 | |
| 280 | |
Igor Sysoev | c28ff71 | 2009-04-23 11:13:12 +0000 | [diff] [blame] | 281 | #define ngx_stderr STDERR_FILENO |
| 282 | #define ngx_set_stderr(fd) dup2(fd, STDERR_FILENO) |
| 283 | #define ngx_set_stderr_n "dup2(STDERR_FILENO)" |
| 284 | |
| 285 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 286 | #endif /* _NGX_FILES_H_INCLUDED_ */ |