UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2013 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef WS_VFS_H 30 #define WS_VFS_H 31 32 #include "nsapi.h" 33 #include "acl.h" 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 #define VFS_CHECKS_ACL 0x0001 40 41 typedef struct VFS_IO VFS_IO; 42 typedef struct VFS_DIRIO VFS_DIRIO; 43 typedef struct VFSFile VFSFile; 44 typedef struct VFSDir VFSDir; 45 typedef struct VFSEntry VFSEntry; 46 47 #define VFS_DIR VFSDir* 48 #define VFS_ENTRY VFSEntry 49 50 struct VFS { 51 SYS_FILE (*open)(VFSContext *ctx, char *path, int oflags); 52 int (*stat)(VFSContext *ctx, char *path, struct stat *buf); 53 int (*fstat)(VFSContext *ctx, SYS_FILE fd, struct stat *buf); 54 VFS_DIR (*opendir)(VFSContext *ctx, char *path); 55 int (*mkdir)(VFSContext *ctx, char *path); 56 int (*unlink)(VFSContext *ctx, char *path); 57 uint32_t flags; 58 }; 59 60 struct VFSContext { 61 pool_handle_t *pool; 62 Session *sn; 63 Request *rq; 64 VFS *vfs; 65 User *user; 66 ACLListHandle *acllist; 67 uint32_t aclreqaccess; 68 int vfs_errno; 69 }; 70 71 struct VFSFile { 72 VFSContext *ctx; 73 VFS_IO *io; // IO functions 74 void *data; // private data used by the VFSFile implementation 75 int fd; // native file descriptor if available, or -1 76 }; 77 78 struct VFSDir { 79 VFSContext *ctx; 80 VFS_DIRIO *io; 81 void *data; // private data used by the VFSDir implementation 82 int fd; // native file descriptor if available, or -1 83 }; 84 85 struct VFSEntry { 86 char *name; 87 struct stat stat; 88 void *stat_extra; 89 int stat_errno; 90 }; 91 92 struct VFS_IO { 93 ssize_t (*read)(SYS_FILE fd, void *buf, size_t nbyte); 94 ssize_t (*write)(SYS_FILE fd, const void *buf, size_t nbyte); 95 ssize_t (*pread)(SYS_FILE fd, void *buf, size_t nbyte, off_t offset); 96 ssize_t (*pwrite)(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset); 97 off_t (*seek)(SYS_FILE fd, off_t offset, int whence); 98 void (*close)(SYS_FILE fd); 99 int (*opt_aioread)(aiocb_s *aiocb); 100 int (*opt_aiowrite)(aiocb_s *aiocb); 101 }; 102 103 struct VFS_DIRIO { 104 int (*readdir)(VFS_DIR dir, VFS_ENTRY *entry, int getstat); 105 void (*close)(VFS_DIR dir); 106 }; 107 108 /* 109 * registers a new VFS 110 */ 111 void vfs_add(char *name, VFS *vfs); 112 113 /* 114 * creates a VFSContext for a Request 115 * vfs calls will do ACL checks 116 */ 117 VFSContext* vfs_request_context(Session *sn, Request *rq); 118 119 SYS_FILE vfs_open(VFSContext *ctx, char *path, int oflags); 120 SYS_FILE vfs_openRO(VFSContext *ctx, char *path); 121 SYS_FILE vfs_openWO(VFSContext *ctx, char *path); 122 SYS_FILE vfs_openRW(VFSContext *ctx, char *path); 123 int vfs_stat(VFSContext *ctx, char *path, struct stat *buf); 124 int vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf); 125 void vfs_close(SYS_FILE fd); 126 VFS_DIR vfs_opendir(VFSContext *ctx, char *path); 127 int vfs_readdir(VFS_DIR dir, VFS_ENTRY *entry); 128 int vfs_readdir_stat(VFS_DIR dir, VFS_ENTRY *entry); 129 void vfs_closedir(VFS_DIR dir); 130 int vfs_mkdir(VFSContext *ctx, char *path); 131 int vfs_unlink(VFSContext *ctx, char *path); 132 133 #ifdef __cplusplus 134 } 135 #endif 136 137 #endif /* WS_VFS_H */ 138 139