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_rename(nxt_file_name_t *old_name, 181 nxt_file_name_t *new_name); 182 183 NXT_EXPORT nxt_int_t nxt_fd_nonblocking(nxt_task_t *task, nxt_fd_t fd); 184 NXT_EXPORT nxt_int_t nxt_fd_blocking(nxt_task_t *task, nxt_fd_t fd); 185 NXT_EXPORT ssize_t nxt_fd_write(nxt_fd_t fd, u_char *buf, size_t size); 186 NXT_EXPORT ssize_t nxt_fd_read(nxt_fd_t fd, u_char *buf, size_t size); 187 NXT_EXPORT void nxt_fd_close(nxt_fd_t fd); 188 189 NXT_EXPORT FILE *nxt_file_fopen(nxt_task_t *task, const char *pathname, 190 const char *mode); 191 NXT_EXPORT void nxt_file_fclose(nxt_task_t *task, FILE *fp); 192 193 NXT_EXPORT nxt_int_t nxt_file_redirect(nxt_file_t *file, nxt_fd_t fd); 194 NXT_EXPORT nxt_int_t nxt_file_stdout(nxt_file_t *file); 195 NXT_EXPORT nxt_int_t nxt_file_stderr(nxt_file_t *file); 196 NXT_EXPORT nxt_int_t nxt_stderr_start(void); 197 198 199 #define nxt_stdout STDOUT_FILENO 200 #define nxt_stderr STDERR_FILENO 201 202 203 #define nxt_write_console(fd, buf, size) \ 204 write(fd, buf, size) 205 206 #define nxt_write_syslog(priority, message) \ 207 syslog(priority, "%s", message) 208 209 210 NXT_EXPORT nxt_int_t nxt_pipe_create(nxt_task_t *task, nxt_fd_t *pp, 211 nxt_bool_t nbread, nxt_bool_t nbwrite); 212 NXT_EXPORT void nxt_pipe_close(nxt_task_t *task, nxt_fd_t *pp); 213 214 NXT_EXPORT size_t nxt_dir_current(char *buf, size_t len); 215 216 217 #endif /* _NXT_UNIX_FILE_H_INCLUDED_ */ 218