src/server/public/vfs.h

changeset 59
ab25c0a231d0
child 65
14722c5f8856
equal deleted inserted replaced
58:66c22e54aa90 59:ab25c0a231d0
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 typedef struct VFS_IO VFS_IO;
40 typedef struct VFS_DIRIO VFS_DIRIO;
41 typedef struct VFSFile VFSFile;
42 typedef struct VFSDir VFSDir;
43 typedef struct VFSEntry VFSEntry;
44
45 #define VFS_DIR VFSDir*
46 #define VFS_ENTRY VFSEntry
47
48 struct VFS {
49 SYS_FILE (*open)(VFSContext *ctx, char *path, int oflags);
50 int (*stat)(VFSContext *ctx, char *path, struct stat *buf);
51 int (*fstat)(VFSContext *ctx, SYS_FILE fd, struct stat *buf);
52 VFS_DIR (*opendir)(VFSContext *ctx, char *path);
53 int (*mkdir)(VFSContext *ctx, char *path);
54 int (*unlink)(VFSContext *ctx, char *path);
55 };
56
57 struct VFSContext {
58 Session *sn;
59 Request *rq;
60 VFS *vfs;
61 pool_handle_t *pool;
62 User *user;
63 ACLListHandle *acllist;
64 uint32_t aclreqaccess;
65 int vfs_errno;
66 };
67
68 struct VFSFile {
69 VFSContext *ctx;
70 VFS_IO *io; // IO functions
71 void *data; // private data used by the VFSFile implementation
72 int fd; // native file descriptor if available, or -1
73 };
74
75 struct VFSDir {
76 VFSContext *ctx;
77 VFS_DIRIO *io;
78 void *data; // private data used by the VFSDir implementation
79 int fd; // native file descriptor if available, or -1
80 };
81
82 struct VFSEntry {
83 char *name;
84 struct stat stat;
85 void *stat_extra;
86 int stat_errno;
87 };
88
89 struct VFS_IO {
90 ssize_t (*read)(SYS_FILE fd, void *buf, size_t nbyte);
91 ssize_t (*write)(SYS_FILE fd, const void *buf, size_t nbyte);
92 void (*close)(SYS_FILE fd);
93 };
94
95 struct VFS_DIRIO {
96 int (*readdir)(VFS_DIR dir, VFS_ENTRY *entry, int getstat);
97 void (*close)(VFS_DIR dir);
98 };
99
100 /*
101 * registers a new VFS
102 */
103 void vfs_add(char *name, VFS *vfs);
104
105 /*
106 * creates a VFSContext for a Request
107 * vfs calls will do ACL checks
108 */
109 VFSContext* vfs_request_context(Session *sn, Request *rq);
110
111 SYS_FILE vfs_open(VFSContext *ctx, char *path, int oflags);
112 SYS_FILE vfs_openRO(VFSContext *ctx, char *path);
113 SYS_FILE vfs_openWO(VFSContext *ctx, char *path);
114 SYS_FILE vfs_openRW(VFSContext *ctx, char *path);
115 int vfs_stat(VFSContext *ctx, char *path, struct stat *buf);
116 int vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf);
117 void vfs_close(SYS_FILE fd);
118 VFS_DIR vfs_opendir(VFSContext *ctx, char *path);
119 int vfs_readdir(VFS_DIR dir, VFS_ENTRY *entry);
120 int vfs_readdir_stat(VFS_DIR dir, VFS_ENTRY *entry);
121 void vfs_closedir(VFS_DIR dir);
122 int vfs_mkdir(VFSContext *ctx, char *path);
123 int vfs_unlink(VFSContext *ctx, char *path);
124
125 #ifdef __cplusplus
126 }
127 #endif
128
129 #endif /* WS_VFS_H */
130

mercurial