vessel/core/include/file.h
2025-06-21 16:26:31 +03:00

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_ */