#ifndef DAV_SYSTEM_H
#define DAV_SYSTEM_H
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef _WIN32
#include <Windows.h>
#define mode_t unsigned int
#else
#include <dirent.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct SysDirEnt {
char *name;
} SysDirEnt;
#ifdef _WIN32
struct WinDir {
int first;
HANDLE handle;
WIN32_FIND_DATAW finddata;
SysDirEnt *ent;
};
#define SYS_DIR struct WinDir*
#define SYS_STAT struct __stat64
typedef int uid_t;
typedef int gid_t;
#define SYS_ISLINK(path, mode) sys_islink(path)
#define SYS_LINK_EXT ".lnk"
#else
typedef struct SysDir {
DIR *dir;
SysDirEnt *ent;
} SysDir;
#define SYS_DIR SysDir*
#define SYS_STAT struct stat
#define SYS_ISLINK(p, s) S_ISLNK(s.st_mode)
#endif
#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#ifdef _WIN32
#ifndef S_ISDIR
#define S_ISDIR(mode) ((mode) & _S_IFMT) == _S_IFDIR
#define S_ISREG(mode) ((mode) & _S_IFMT) == _S_IFREG
#endif
#endif
typedef int(*stat_func)(const char*, SYS_STAT *);
void sys_init(void);
void sys_uninit(void);
void sys_freedirent(SysDirEnt *ent);
SYS_DIR sys_opendir(const char *path);
SysDirEnt* sys_readdir(SYS_DIR dir);
void sys_closedir(SYS_DIR dir);
FILE* sys_fopen(const char *path, const char *mode);
int sys_stat(const char *path, SYS_STAT *s);
int sys_lstat(const char *path, SYS_STAT *s);
int sys_islink(const char *path);
int sys_rename(const char *oldpath, const char *newpath);
int sys_unlink(const char *path);
int sys_mkdir(const char *path);
char* sys_readlink(const char *path, SYS_STAT *s);
int sys_symlink(const char *target, const char *linkpath);
int sys_truncate(const char* path, off_t length);
#ifdef __cplusplus
}
#endif
#endif