diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_file.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/nxt_file.h b/src/nxt_file.h new file mode 100644 index 00000000..3ef5fbfb --- /dev/null +++ b/src/nxt_file.h @@ -0,0 +1,195 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NXT_UNIX_FILE_H_INCLUDED_ +#define _NXT_UNIX_FILE_H_INCLUDED_ + + +typedef int nxt_fd_t; + +#define NXT_FILE_INVALID -1 + +typedef nxt_uint_t nxt_file_access_t; +typedef struct stat nxt_file_info_t; + + +#define NXT_FILE_SYSTEM_NAME_UTF8 1 + +typedef u_char nxt_file_name_t; + + +typedef struct { + size_t len; + nxt_file_name_t *start; +} nxt_file_name_str_t; + + +#define \ +nxt_file_name_str_set(file_name, mem_pool, name) \ + ((file_name) = (nxt_file_name_t *) (name), NXT_OK) + + +#define \ +nxt_file_name_alloc(mem_pool, len) \ + nxt_mem_nalloc(mem_pool, len) + + +#define \ +nxt_file_name_copy(dst, src, len) \ + nxt_cpymem(dst, src, len) + + +#define \ +nxt_file_name_add(dst, src, len) \ + nxt_cpymem(dst, src, len) + + +#if (NXT_HAVE_CASELESS_FILESYSTEM) + +/* MacOSX, Cygwin. */ + +#define \ +nxt_file_name_eq(fn1, fn2) \ + (nxt_strcasecmp(fn1, fn2) == 0) + +#else + +#define \ +nxt_file_name_eq(fn1, fn2) \ + (nxt_strcmp(fn1, fn2) == 0) + +#endif + + +#define \ +nxt_file_name_is_absolute(name) \ + (name[0] == '/') + + +#define NXT_MAX_PATH_LEN MAXPATHLEN + + +typedef enum { + NXT_FILE_UNKNOWN = 0, + NXT_FILE_REGULAR, + NXT_FILE_DIRECTORY, +} nxt_file_type_t; + + +typedef struct { + nxt_file_name_t *name; + + /* Both are int's. */ + nxt_fd_t fd; + nxt_err_t error; + +#define NXT_FILE_ACCESSED_LONG_AGO 0xffff + /* + * Number of seconds ago the file content was last + * read. The maximum value is about 18 hours. + */ + uint16_t accessed; + + uint8_t type; /* nxt_file_type_t */ + + /* + * Log open() file error with given log level if it is non zero. + * Note that zero log level is NXT_LOG_EMERG. + */ + uint8_t log_level; + + nxt_time_t mtime; + nxt_off_t size; +} nxt_file_t; + + +NXT_EXPORT nxt_int_t nxt_file_open(nxt_file_t *file, nxt_uint_t mode, + nxt_uint_t create, nxt_file_access_t access); + +#define nxt_file_open_n "open" + + +/* The file open access modes. */ +#define NXT_FILE_RDONLY O_RDONLY +#define NXT_FILE_WRONLY O_WRONLY +#define NXT_FILE_RDWR O_RDWR +#define NXT_FILE_APPEND (O_WRONLY | O_APPEND) + +/* The file creation modes. */ +#define NXT_FILE_CREATE_OR_OPEN O_CREAT +#define NXT_FILE_OPEN 0 +#define NXT_FILE_TRUNCATE (O_CREAT | O_TRUNC) + +/* The file access rights. */ +#define NXT_FILE_DEFAULT_ACCESS 0644 +#define NXT_FILE_OWNER_ACCESS 0600 + + +NXT_EXPORT void nxt_file_close(nxt_file_t *file); +NXT_EXPORT ssize_t nxt_file_write(nxt_file_t *file, const u_char *buf, + size_t size, nxt_off_t offset); +NXT_EXPORT ssize_t nxt_file_read(nxt_file_t *file, u_char *buf, size_t size, + nxt_off_t offset); +NXT_EXPORT void nxt_file_read_ahead(nxt_file_t *file, nxt_off_t offset, + size_t size); +NXT_EXPORT nxt_int_t nxt_file_info(nxt_file_t *file, nxt_file_info_t *fi); + + +#define \ +nxt_is_dir(fi) \ + (S_ISDIR((fi)->st_mode)) + +#define \ +nxt_is_file(fi) \ + (S_ISREG((fi)->st_mode)) + +#define \ +nxt_file_size(fi) \ + (fi)->st_size + +#define \ +nxt_file_mtime(fi) \ + (fi)->st_mtime + + +NXT_EXPORT nxt_int_t nxt_file_delete(nxt_file_name_t *name); +NXT_EXPORT nxt_int_t nxt_file_set_access(nxt_file_name_t *name, + nxt_file_access_t access); +NXT_EXPORT nxt_int_t nxt_file_rename(nxt_file_name_t *old_name, + nxt_file_name_t *new_name); + +NXT_EXPORT nxt_int_t nxt_fd_nonblocking(nxt_fd_t fd); +NXT_EXPORT nxt_int_t nxt_fd_blocking(nxt_fd_t fd); +NXT_EXPORT ssize_t nxt_fd_write(nxt_fd_t fd, u_char *buf, size_t size); +NXT_EXPORT ssize_t nxt_fd_read(nxt_fd_t fd, u_char *buf, size_t size); +NXT_EXPORT void nxt_fd_close(nxt_fd_t fd); + +NXT_EXPORT nxt_int_t nxt_file_redirect(nxt_file_t *file, nxt_fd_t fd); +NXT_EXPORT nxt_int_t nxt_file_stderr(nxt_file_t *file); +NXT_EXPORT nxt_int_t nxt_stderr_start(void); + + +#define nxt_stdout STDOUT_FILENO +#define nxt_stderr STDERR_FILENO + + +#define \ +nxt_write_console(fd, buf, size) \ + write(fd, buf, size) + +#define \ +nxt_write_syslog(priority, message) \ + syslog(priority, "%s", message) + + +NXT_EXPORT nxt_int_t nxt_pipe_create(nxt_fd_t *pp, nxt_bool_t nbread, + nxt_bool_t nbwrite); +NXT_EXPORT void nxt_pipe_close(nxt_fd_t *pp); + +NXT_EXPORT size_t nxt_dir_current(char *buf, size_t len); + + +#endif /* _NXT_UNIX_FILE_H_INCLUDED_ */ |