#ifndef WS_VFS_H
#define WS_VFS_H
#include "nsapi.h"
#include "acl.h"
#ifdef __cplusplus
extern "C" {
#endif
#define VFS_CHECKS_ACL 0x0001
typedef struct VFS_IO VFS_IO;
typedef struct VFS_DIRIO VFS_DIRIO;
typedef struct VFSFile VFSFile;
typedef struct VFSDir VFSDir;
typedef struct VFSEntry VFSEntry;
#define VFS_DIR VFSDir*
#define VFS_ENTRY VFSEntry
struct VFS {
SYS_FILE (*open)(VFSContext *ctx,
const char *path,
int oflags);
int (*stat)(VFSContext *ctx,
const char *path,
struct stat *buf);
int (*fstat)(VFSContext *ctx,
SYS_FILE fd,
struct stat *buf);
VFS_DIR (*opendir)(VFSContext *ctx,
const char *path);
VFS_DIR (*fdopendir)(VFSContext *ctx,
SYS_FILE fd);
int (*mkdir)(VFSContext *ctx,
const char *path);
int (*unlink)(VFSContext *ctx,
const char *path);
int (*rmdir)(VFSContext *Ctx,
const char *path);
uint32_t flags;
void *instance;
};
struct VFSContext {
pool_handle_t *pool;
Session *sn;
Request *rq;
VFS *vfs;
User *user;
ACLListHandle *acllist;
uint32_t aclreqaccess;
int vfs_errno;
WSBool error_response_set;
};
struct VFSFile {
VFSContext *ctx;
VFS_IO *io;
void *data;
int fd;
};
struct VFSDir {
VFSContext *ctx;
VFS_DIRIO *io;
void *data;
int fd;
};
struct VFSEntry {
char *name;
struct stat stat;
void *stat_extra;
int stat_errno;
};
struct VFS_IO {
ssize_t (*read)(
SYS_FILE fd,
void *buf,
size_t nbyte);
ssize_t (*write)(
SYS_FILE fd,
const void *buf,
size_t nbyte);
ssize_t (*pread)(
SYS_FILE fd,
void *buf,
size_t nbyte,
off_t offset);
ssize_t (*pwrite)(
SYS_FILE fd,
const void *buf,
size_t nbyte,
off_t offset);
off_t (*seek)(
SYS_FILE fd,
off_t offset,
int whence);
void (*close)(
SYS_FILE fd);
int (*opt_aioread)(aiocb_s *aiocb);
int (*opt_aiowrite)(aiocb_s *aiocb);
const char* (*opt_getetag)(
SYS_FILE fd);
};
struct VFS_DIRIO {
int (*readdir)(
VFS_DIR dir,
VFS_ENTRY *entry,
int getstat);
void (*close)(
VFS_DIR dir);
};
typedef void*(*vfs_init_func)(ServerConfiguration *cfg,
pool_handle_t *pool, WSConfigNode *config);
typedef VFS*(*vfs_create_func)(Session *sn, Request *rq, pblock *pb,
void *initData);
int vfs_register_type(
const char *name, vfs_init_func vfsInit, vfs_create_func vfsCreate);
VFS* vfs_create(Session *sn, Request *rq,
const char *vfs_class, pblock *pb,
void *initData);
VFSContext* vfs_request_context(Session *sn, Request *rq);
SYS_FILE vfs_open(VFSContext *ctx,
const char *path,
int oflags);
SYS_FILE vfs_openRO(VFSContext *ctx,
const char *path);
SYS_FILE vfs_openWO(VFSContext *ctx,
const char *path);
SYS_FILE vfs_openRW(VFSContext *ctx,
const char *path);
int vfs_stat(VFSContext *ctx,
const char *path,
struct stat *buf);
int vfs_fstat(VFSContext *ctx,
SYS_FILE fd,
struct stat *buf);
const char * vfs_getetag(
SYS_FILE fd);
void vfs_close(
SYS_FILE fd);
VFS_DIR vfs_opendir(VFSContext *ctx,
const char *path);
VFS_DIR vfs_fdopendir(VFSContext *ctx,
SYS_FILE fd);
int vfs_readdir(
VFS_DIR dir,
VFS_ENTRY *entry);
int vfs_readdir_stat(
VFS_DIR dir,
VFS_ENTRY *entry);
void vfs_closedir(
VFS_DIR dir);
int vfs_mkdir(VFSContext *ctx,
const char *path);
int vfs_unlink(VFSContext *ctx,
const char *path);
int vfs_rmdir(VFSContext *ctx,
const char *path);
#ifdef __cplusplus
}
#endif
#endif