104 lines
4.2 KiB
C
104 lines
4.2 KiB
C
#ifndef VESSEL_FILE_H_
|
|
#define VESSEL_FILE_H_
|
|
|
|
#include "conf.h"
|
|
|
|
#include "def.h"
|
|
|
|
#include <time.h>
|
|
#include <sys/time.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
typedef uint8_t vs_FileFlags;
|
|
typedef uint16_t vs_FileMode;
|
|
typedef uint8_t vs_FileSeekFlag;
|
|
|
|
typedef int vs_FileSocket;
|
|
typedef int vs_FileDescriptor;
|
|
|
|
typedef struct {
|
|
size_t size;
|
|
time_t last_modification_time;
|
|
time_t last_access_time;
|
|
vs_FileMode mode;
|
|
} vs_FileStat;
|
|
|
|
/* TODO: Thread safety? */
|
|
|
|
typedef struct {
|
|
vs_FileDescriptor _fd;
|
|
vs_FileSocket _fs;
|
|
bool _error;
|
|
} vs_File;
|
|
|
|
#ifndef VS_FILE_TMPDIR
|
|
# define VS_FILE_TMPDIR "/tmp/"
|
|
#endif /* VS_FILE_TMPDIR */
|
|
|
|
#ifndef VS_FILE_SEP
|
|
# define VS_FILE_SEP "/"
|
|
#endif /* VS_FILE_SEP */
|
|
|
|
#ifndef VS_FILE_MAX_LEN
|
|
# define VS_FILE_MAX_LEN 256 /* Max path length with NULL byte */
|
|
#endif /* VS_FILE_MAX_LEN */
|
|
|
|
#define VS_FILEF_NONE ((vs_FileFlags)(0x0)) /* 0000 0000 */
|
|
#define VS_FILEF_RD ((vs_FileFlags)(0x80)) /* 1000 0000 */
|
|
#define VS_FILEF_WR ((vs_FileFlags)(0x40)) /* 0100 0000 */
|
|
#define VS_FILEF_RDWR ((vs_FileFlags)((VS_FILEF_RD | VS_FILEF_WR))) /* 1100 0000 */
|
|
#define VS_FILEF_CREAT ((vs_FileFlags)(0x20)) /* 0010 0000 */
|
|
#define VS_FILEF_APPEND ((vs_FileFlags)(0x10)) /* 0001 0000 */
|
|
#define VS_FILEF_NONBLOCK ((vs_FileFlags)(0x8)) /* 0000 1000 */
|
|
#define VS_FILEF_TRUNC ((vs_FileFlags)(0x4)) /* 0000 0100 */
|
|
|
|
#define VS_FILEM_NONE ((vs_FileMode)(0x0)) /* 0000 0000 0000 0000 */
|
|
#define VS_FILEM_ORD ((vs_FileMode)(0x8000)) /* 1000 0000 0000 0000 */
|
|
#define VS_FILEM_OWR ((vs_FileMode)(0x4000)) /* 0100 0000 0000 0000 */
|
|
#define VS_FILEM_OEX ((vs_FileMode)(0x2000)) /* 0010 0000 0000 0000 */
|
|
#define VS_FILEM_GRD ((vs_FileMode)(0x1000)) /* 0001 0000 0000 0000 */
|
|
#define VS_FILEM_GWR ((vs_FileMode)(0x800)) /* 0000 1000 0000 0000 */
|
|
#define VS_FILEM_GEX ((vs_FileMode)(0x400)) /* 0000 0100 0000 0000 */
|
|
#define VS_FILEM_ARD ((vs_FileMode)(0x200)) /* 0000 0010 0000 0000 */
|
|
#define VS_FILEM_AWR ((vs_FileMode)(0x100)) /* 0000 0001 0000 0000 */
|
|
#define VS_FILEM_AEX ((vs_FileMode)(0x80)) /* 0000 0000 1000 0000 */
|
|
/* clang-format off */
|
|
|
|
#define VS_FILEM_ONX ((vs_FileMode)(VS_FILEM_ORD | VS_FILEM_OWR)) /* 1100 0000 0000 0000 */
|
|
#define VS_FILEM_GNX ((vs_FileMode)(VS_FILEM_GRD | VS_FILEM_GWR)) /* 0001 1000 0000 0000 */
|
|
#define VS_FILEM_ANX ((vs_FileMode)(VS_FILEM_ARD | VS_FILEM_AWR)) /* 0000 0011 0000 0000 */
|
|
|
|
#define VS_FILEM_OALL ((vs_FileMode)(VS_FILEM_ORD | VS_FILEM_OWR | VS_FILEM_OEX)) /* 1110 0000 0000 0000 */
|
|
#define VS_FILEM_GALL ((vs_FileMode)(VS_FILEM_GRD | VS_FILEM_GWR | VS_FILEM_GEX)) /* 0001 1100 0000 0000 */
|
|
#define VS_FILEM_AALL ((vs_FileMode)(VS_FILEM_ARD | VS_FILEM_AWR | VS_FILEM_AEX)) /* 0000 0011 1000 0000 */
|
|
#define VS_FILEM_ALL ((vs_FileMode)(VS_FILEM_OALL | VS_FILEM_GALL | VS_FILEM_AALL)) /* 111111111 1000 0000 */
|
|
|
|
/* clang-format on */
|
|
|
|
#define VS_FILES_SET ((vs_FileSeekFlag)(0x80)) /* 1000 0000 */
|
|
#define VS_FILES_CUR ((vs_FileSeekFlag)(0x40)) /* 0100 0000 */
|
|
#define VS_FILES_END ((vs_FileSeekFlag)(0x20)) /* 0010 0000 */
|
|
|
|
bool vs_File_init(vs_File *file, vs_File *src);
|
|
bool vs_File_open(vs_File *file, const char *filename, vs_FileFlags flags, vs_FileMode mode);
|
|
bool vs_File_create_tmp(vs_File *file);
|
|
bool vs_File_isfile(vs_File *file);
|
|
bool vs_File_issock(vs_File *file);
|
|
bool vs_File_isopen(vs_File *file);
|
|
bool vs_File_usesock(vs_File *file, vs_FileSocket sock);
|
|
bool vs_File_iserr(vs_File *file);
|
|
bool vs_File_clearerr(vs_File *file);
|
|
bool vs_File_seterr(vs_File *file);
|
|
int vs_File_poll(vs_File *file, const struct timeval *timeout);
|
|
size_t vs_File_read(vs_File *file, void *buf, size_t count);
|
|
size_t vs_File_write(vs_File *file, const void *buf, size_t count);
|
|
off_t vs_File_seek(vs_File *file, off_t off, vs_FileSeekFlag flag);
|
|
uint64_t vs_File_identity(vs_File *file);
|
|
bool vs_File_close(vs_File *file);
|
|
bool vs_File_destroy(vs_File *file);
|
|
bool vs_File_clear(vs_File *file);
|
|
bool vs_File_stat(vs_File *file, vs_FileStat *statbuf);
|
|
bool vs_File_ok(const char *path);
|
|
|
|
#endif /* VESSEL_FILE_H_ */
|