--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server/public/vfs.h Mon May 06 13:44:27 2013 +0200 @@ -0,0 +1,130 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WS_VFS_H +#define WS_VFS_H + +#include "nsapi.h" +#include "acl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +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, char *path, int oflags); + int (*stat)(VFSContext *ctx, char *path, struct stat *buf); + int (*fstat)(VFSContext *ctx, SYS_FILE fd, struct stat *buf); + VFS_DIR (*opendir)(VFSContext *ctx, char *path); + int (*mkdir)(VFSContext *ctx, char *path); + int (*unlink)(VFSContext *ctx, char *path); +}; + +struct VFSContext { + Session *sn; + Request *rq; + VFS *vfs; + pool_handle_t *pool; + User *user; + ACLListHandle *acllist; + uint32_t aclreqaccess; + int vfs_errno; +}; + +struct VFSFile { + VFSContext *ctx; + VFS_IO *io; // IO functions + void *data; // private data used by the VFSFile implementation + int fd; // native file descriptor if available, or -1 +}; + +struct VFSDir { + VFSContext *ctx; + VFS_DIRIO *io; + void *data; // private data used by the VFSDir implementation + int fd; // native file descriptor if available, or -1 +}; + +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); + void (*close)(SYS_FILE fd); +}; + +struct VFS_DIRIO { + int (*readdir)(VFS_DIR dir, VFS_ENTRY *entry, int getstat); + void (*close)(VFS_DIR dir); +}; + +/* + * registers a new VFS + */ +void vfs_add(char *name, VFS *vfs); + +/* + * creates a VFSContext for a Request + * vfs calls will do ACL checks + */ +VFSContext* vfs_request_context(Session *sn, Request *rq); + +SYS_FILE vfs_open(VFSContext *ctx, char *path, int oflags); +SYS_FILE vfs_openRO(VFSContext *ctx, char *path); +SYS_FILE vfs_openWO(VFSContext *ctx, char *path); +SYS_FILE vfs_openRW(VFSContext *ctx, char *path); +int vfs_stat(VFSContext *ctx, char *path, struct stat *buf); +int vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf); +void vfs_close(SYS_FILE fd); +VFS_DIR vfs_opendir(VFSContext *ctx, char *path); +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, char *path); +int vfs_unlink(VFSContext *ctx, char *path); + +#ifdef __cplusplus +} +#endif + +#endif /* WS_VFS_H */ +