root / lab4 / .minix-src / include / puffs.h @ 14
History | View | Annotate | Download (28.3 KB)
1 | 13 | up20180614 | /* $NetBSD: puffs.h,v 1.126 2014/10/31 13:56:04 manu Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
|
||
5 | *
|
||
6 | * Development of this software was supported by the
|
||
7 | * Google Summer of Code program and the Ulla Tuominen Foundation.
|
||
8 | * The Google SoC project was mentored by Bill Studenmund.
|
||
9 | *
|
||
10 | * Redistribution and use in source and binary forms, with or without
|
||
11 | * modification, are permitted provided that the following conditions
|
||
12 | * are met:
|
||
13 | * 1. Redistributions of source code must retain the above copyright
|
||
14 | * notice, this list of conditions and the following disclaimer.
|
||
15 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
16 | * notice, this list of conditions and the following disclaimer in the
|
||
17 | * documentation and/or other materials provided with the distribution.
|
||
18 | *
|
||
19 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||
20 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
22 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||
25 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
29 | * SUCH DAMAGE.
|
||
30 | */
|
||
31 | |||
32 | #ifndef _PUFFS_H_
|
||
33 | #define _PUFFS_H_
|
||
34 | |||
35 | #include <sys/param.h> |
||
36 | #include <sys/types.h> |
||
37 | #include <sys/mount.h> |
||
38 | #include <sys/namei.h> |
||
39 | #include <sys/stat.h> |
||
40 | #include <sys/statvfs.h> |
||
41 | #include <sys/time.h> |
||
42 | #include <sys/vnode.h> |
||
43 | |||
44 | #include <fs/puffs/puffs_msgif.h> |
||
45 | |||
46 | #include <mntopts.h> |
||
47 | #include <stdbool.h> |
||
48 | #include <string.h> |
||
49 | |||
50 | /* forwards */
|
||
51 | struct puffs_cc;
|
||
52 | |||
53 | struct puffs_getreq;
|
||
54 | struct puffs_cred;
|
||
55 | struct puffs_newinfo;
|
||
56 | |||
57 | /* paths */
|
||
58 | struct puffs_pathobj {
|
||
59 | void *po_path;
|
||
60 | size_t po_len; |
||
61 | uint32_t po_hash; |
||
62 | }; |
||
63 | |||
64 | /* for prefix rename */
|
||
65 | struct puffs_pathinfo {
|
||
66 | struct puffs_pathobj *pi_old;
|
||
67 | struct puffs_pathobj *pi_new;
|
||
68 | }; |
||
69 | |||
70 | /* describes one segment cached in the kernel */
|
||
71 | struct puffs_kcache {
|
||
72 | off_t pkc_start; |
||
73 | off_t pkc_end; |
||
74 | |||
75 | LIST_ENTRY(puffs_kcache) pkc_entries; |
||
76 | }; |
||
77 | |||
78 | /* XXX: might disappear from here into a private header */
|
||
79 | struct puffs_node {
|
||
80 | off_t pn_size; |
||
81 | int pn_flags;
|
||
82 | int pn_nlookup;
|
||
83 | struct vattr pn_va;
|
||
84 | |||
85 | void *pn_data; /* private data */ |
||
86 | |||
87 | struct puffs_pathobj pn_po; /* PUFFS_FLAG_BUILDPATH */ |
||
88 | |||
89 | struct puffs_usermount *pn_mnt;
|
||
90 | LIST_ENTRY(puffs_node) pn_entries; |
||
91 | |||
92 | LIST_HEAD(,puffs_kcache)pn_cacheinfo; /* PUFFS_KFLAG_CACHE */
|
||
93 | #if defined(__minix)
|
||
94 | /* MINIX fields */
|
||
95 | char pn_mountpoint; /* true if mounted on */ |
||
96 | unsigned int pn_count; /* # times inode used */ |
||
97 | #endif /* defined(__minix) */ |
||
98 | }; |
||
99 | #define PUFFS_NODE_REMOVED 0x01 /* not on entry list */ |
||
100 | |||
101 | |||
102 | struct puffs_usermount;
|
||
103 | |||
104 | /*
|
||
105 | * megaXXX: these are values from inside _KERNEL
|
||
106 | * need to work on the translation for ALL the necessary values.
|
||
107 | */
|
||
108 | #define PUFFS_VNOVAL (-1) |
||
109 | |||
110 | #define PUFFS_IO_APPEND 0x020 |
||
111 | #define PUFFS_IO_NDELAY 0x100 |
||
112 | |||
113 | #define PUFFS_VEXEC 01 |
||
114 | #define PUFFS_VWRITE 02 |
||
115 | #define PUFFS_VREAD 04 |
||
116 | |||
117 | #define PUFFS_FSYNC_DATAONLY 0x0002 |
||
118 | #define PUFFS_FSYNC_CACHE 0x0100 |
||
119 | |||
120 | /*
|
||
121 | * xflags for setattr_ttl and write2
|
||
122 | */
|
||
123 | #define PUFFS_SETATTR_FAF 0x1 |
||
124 | #define PUFFS_WRITE_FAF 0x1 |
||
125 | |||
126 | #define PUFFS_EXTATTR_LIST_LENPREFIX 1 |
||
127 | /*
|
||
128 | * Magic constants
|
||
129 | */
|
||
130 | #define PUFFS_CC_STACKSHIFT_DEFAULT 18 |
||
131 | |||
132 | struct puffs_cn {
|
||
133 | struct puffs_kcn *pcn_pkcnp; /* kernel input */ |
||
134 | struct puffs_cred *pcn_cred; /* cred used for lookup */ |
||
135 | |||
136 | struct puffs_pathobj pcn_po_full; /* PUFFS_FLAG_BUILDPATH */ |
||
137 | }; |
||
138 | #define pcn_nameiop pcn_pkcnp->pkcn_nameiop
|
||
139 | #define pcn_flags pcn_pkcnp->pkcn_flags
|
||
140 | #define pcn_name pcn_pkcnp->pkcn_name
|
||
141 | #define pcn_namelen pcn_pkcnp->pkcn_namelen
|
||
142 | #define pcn_consume pcn_pkcnp->pkcn_consume
|
||
143 | |||
144 | /*
|
||
145 | * Puffs options to mount
|
||
146 | */
|
||
147 | /* kernel */
|
||
148 | #define PUFFSMOPT_NAMECACHE { "namecache", 1, PUFFS_KFLAG_NOCACHE_NAME, 1 } |
||
149 | #define PUFFSMOPT_PAGECACHE { "pagecache", 1, PUFFS_KFLAG_NOCACHE_PAGE, 1 } |
||
150 | #define PUFFSMOPT_ATTRCACHE { "attrcache", 1, PUFFS_KFLAG_NOCACHE_ATTR, 1 } |
||
151 | #define PUFFSMOPT_CACHE { "cache", 1, PUFFS_KFLAG_NOCACHE, 1 } |
||
152 | #define PUFFSMOPT_ALLOPS { "allops", 0, PUFFS_KFLAG_ALLOPS, 1 } |
||
153 | |||
154 | /* libpuffs */
|
||
155 | #define PUFFSMOPT_DUMP { "dump", 0, PUFFS_FLAG_OPDUMP, 1 } |
||
156 | |||
157 | #define PUFFSMOPT_STD \
|
||
158 | PUFFSMOPT_NAMECACHE, \ |
||
159 | PUFFSMOPT_PAGECACHE, \ |
||
160 | PUFFSMOPT_ATTRCACHE, \ |
||
161 | PUFFSMOPT_CACHE, \ |
||
162 | PUFFSMOPT_ALLOPS, \ |
||
163 | PUFFSMOPT_DUMP |
||
164 | |||
165 | extern const struct mntopt puffsmopts[]; /* puffs.c */ |
||
166 | |||
167 | /* callbacks for operations */
|
||
168 | struct puffs_ops {
|
||
169 | int (*puffs_fs_unmount)(struct puffs_usermount *, int); |
||
170 | int (*puffs_fs_statvfs)(struct puffs_usermount *, struct statvfs *); |
||
171 | int (*puffs_fs_sync)(struct puffs_usermount *, int, |
||
172 | const struct puffs_cred *); |
||
173 | int (*puffs_fs_fhtonode)(struct puffs_usermount *, void *, size_t, |
||
174 | struct puffs_newinfo *);
|
||
175 | int (*puffs_fs_nodetofh)(struct puffs_usermount *, puffs_cookie_t, |
||
176 | void *, size_t *);
|
||
177 | int (*puffs_fs_extattrctl)(struct puffs_usermount *, int, |
||
178 | puffs_cookie_t, int, int, const char *); |
||
179 | |||
180 | int (*puffs_node_lookup)(struct puffs_usermount *, |
||
181 | puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *); |
||
182 | int (*puffs_node_create)(struct puffs_usermount *, |
||
183 | puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *, |
||
184 | const struct vattr *); |
||
185 | int (*puffs_node_mknod)(struct puffs_usermount *, |
||
186 | puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *, |
||
187 | const struct vattr *); |
||
188 | int (*puffs_node_open)(struct puffs_usermount *, |
||
189 | puffs_cookie_t, int, const struct puffs_cred *); |
||
190 | int (*puffs_node_close)(struct puffs_usermount *, |
||
191 | puffs_cookie_t, int, const struct puffs_cred *); |
||
192 | int (*puffs_node_access)(struct puffs_usermount *, |
||
193 | puffs_cookie_t, int, const struct puffs_cred *); |
||
194 | int (*puffs_node_getattr)(struct puffs_usermount *, |
||
195 | puffs_cookie_t, struct vattr *, const struct puffs_cred *); |
||
196 | int (*puffs_node_setattr)(struct puffs_usermount *, |
||
197 | puffs_cookie_t, const struct vattr *, const struct puffs_cred *); |
||
198 | int (*puffs_node_poll)(struct puffs_usermount *, puffs_cookie_t, int *); |
||
199 | int (*puffs_node_mmap)(struct puffs_usermount *, |
||
200 | puffs_cookie_t, vm_prot_t, const struct puffs_cred *); |
||
201 | int (*puffs_node_fsync)(struct puffs_usermount *, |
||
202 | puffs_cookie_t, const struct puffs_cred *, int, off_t, off_t); |
||
203 | int (*puffs_node_seek)(struct puffs_usermount *, |
||
204 | puffs_cookie_t, off_t, off_t, const struct puffs_cred *); |
||
205 | int (*puffs_node_remove)(struct puffs_usermount *, |
||
206 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); |
||
207 | int (*puffs_node_link)(struct puffs_usermount *, |
||
208 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); |
||
209 | int (*puffs_node_rename)(struct puffs_usermount *, |
||
210 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *, |
||
211 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); |
||
212 | int (*puffs_node_mkdir)(struct puffs_usermount *, |
||
213 | puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *, |
||
214 | const struct vattr *); |
||
215 | int (*puffs_node_rmdir)(struct puffs_usermount *, |
||
216 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); |
||
217 | int (*puffs_node_symlink)(struct puffs_usermount *, |
||
218 | puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *, |
||
219 | const struct vattr *, |
||
220 | const char *); |
||
221 | int (*puffs_node_readdir)(struct puffs_usermount *, |
||
222 | puffs_cookie_t, struct dirent *, off_t *, size_t *,
|
||
223 | const struct puffs_cred *, int *, off_t *, size_t *); |
||
224 | int (*puffs_node_readlink)(struct puffs_usermount *, |
||
225 | puffs_cookie_t, const struct puffs_cred *, char *, size_t *); |
||
226 | int (*puffs_node_reclaim)(struct puffs_usermount *, puffs_cookie_t); |
||
227 | int (*puffs_node_inactive)(struct puffs_usermount *, puffs_cookie_t); |
||
228 | int (*puffs_node_print)(struct puffs_usermount *, puffs_cookie_t); |
||
229 | int (*puffs_node_pathconf)(struct puffs_usermount *, |
||
230 | puffs_cookie_t, int, register_t *);
|
||
231 | int (*puffs_node_advlock)(struct puffs_usermount *, |
||
232 | puffs_cookie_t, void *, int, struct flock *, int); |
||
233 | int (*puffs_node_read)(struct puffs_usermount *, puffs_cookie_t, |
||
234 | uint8_t *, off_t, size_t *, const struct puffs_cred *, int); |
||
235 | int (*puffs_node_write)(struct puffs_usermount *, puffs_cookie_t, |
||
236 | uint8_t *, off_t, size_t *, const struct puffs_cred *, int); |
||
237 | int (*puffs_node_abortop)(struct puffs_usermount *, puffs_cookie_t, |
||
238 | const struct puffs_cn *); |
||
239 | int (*puffs_node_getextattr)(struct puffs_usermount *, puffs_cookie_t, |
||
240 | int, const char *, size_t *, uint8_t *, size_t *, |
||
241 | const struct puffs_cred *); |
||
242 | int (*puffs_node_setextattr)(struct puffs_usermount *, puffs_cookie_t, |
||
243 | int, const char *, uint8_t *, size_t *, const struct puffs_cred *); |
||
244 | int (*puffs_node_listextattr)(struct puffs_usermount *, puffs_cookie_t, |
||
245 | int, size_t *, uint8_t *, size_t *, int, const struct puffs_cred *); |
||
246 | int (*puffs_node_deleteextattr)(struct puffs_usermount *, |
||
247 | puffs_cookie_t, int, const char *, const struct puffs_cred *); |
||
248 | int (*puffs_node_getattr_ttl)(struct puffs_usermount *, |
||
249 | puffs_cookie_t, struct vattr *, const struct puffs_cred *, |
||
250 | struct timespec *);
|
||
251 | int (*puffs_node_setattr_ttl)(struct puffs_usermount *, |
||
252 | puffs_cookie_t, struct vattr *, const struct puffs_cred *, |
||
253 | struct timespec *, int); |
||
254 | int (*puffs_node_write2)(struct puffs_usermount *, puffs_cookie_t, |
||
255 | uint8_t *, off_t, size_t *, const struct puffs_cred *, int, int); |
||
256 | int (*puffs_node_reclaim2)(struct puffs_usermount *, |
||
257 | puffs_cookie_t, int);
|
||
258 | int (*puffs_node_open2)(struct puffs_usermount *, |
||
259 | puffs_cookie_t, int, const struct puffs_cred *, int *); |
||
260 | int (*puffs_node_fallocate)(struct puffs_usermount *, |
||
261 | puffs_cookie_t, off_t, off_t); |
||
262 | int (*puffs_node_fdiscard)(struct puffs_usermount *, |
||
263 | puffs_cookie_t, off_t, off_t); |
||
264 | |||
265 | void *puffs_ops_spare[26]; |
||
266 | }; |
||
267 | |||
268 | typedef int (*pu_pathbuild_fn)(struct puffs_usermount *, |
||
269 | const struct puffs_pathobj *, |
||
270 | const struct puffs_pathobj *, size_t, |
||
271 | struct puffs_pathobj *);
|
||
272 | typedef int (*pu_pathtransform_fn)(struct puffs_usermount *, |
||
273 | const struct puffs_pathobj *, |
||
274 | const struct puffs_cn *, |
||
275 | struct puffs_pathobj *);
|
||
276 | typedef int (*pu_pathcmp_fn)(struct puffs_usermount *, struct puffs_pathobj *, |
||
277 | struct puffs_pathobj *, size_t, int); |
||
278 | typedef void (*pu_pathfree_fn)(struct puffs_usermount *, |
||
279 | struct puffs_pathobj *);
|
||
280 | typedef int (*pu_namemod_fn)(struct puffs_usermount *, |
||
281 | struct puffs_pathobj *, struct puffs_cn *); |
||
282 | |||
283 | typedef void (*pu_errnotify_fn)(struct puffs_usermount *, |
||
284 | uint8_t, int, const char *, puffs_cookie_t); |
||
285 | |||
286 | typedef void (*pu_prepost_fn)(struct puffs_usermount *); |
||
287 | |||
288 | typedef struct puffs_node *(*pu_cmap_fn)(struct puffs_usermount *, |
||
289 | puffs_cookie_t); |
||
290 | |||
291 | enum {
|
||
292 | PUFFS_STATE_BEFOREMOUNT, PUFFS_STATE_RUNNING, |
||
293 | PUFFS_STATE_UNMOUNTING, PUFFS_STATE_UNMOUNTED |
||
294 | }; |
||
295 | |||
296 | #define PUFFS_FLAG_BUILDPATH 0x80000000 /* node paths in pnode */ |
||
297 | #define PUFFS_FLAG_OPDUMP 0x40000000 /* dump all operations */ |
||
298 | #define PUFFS_FLAG_HASHPATH 0x20000000 /* speedup: hash paths */ |
||
299 | #define PUFFS_FLAG_PNCOOKIE 0x10000000 /* cookies are pnodes */ |
||
300 | #define PUFFS_FLAG_MASK 0xf0000000 |
||
301 | |||
302 | #define PUFFS_FLAG_KERN(a) ((a) & PUFFS_KFLAG_MASK)
|
||
303 | #define PUFFS_FLAG_LIB(a) ((a) & PUFFS_FLAG_MASK)
|
||
304 | |||
305 | /* blocking mode argument */
|
||
306 | #define PUFFSDEV_BLOCK 0 |
||
307 | #define PUFFSDEV_NONBLOCK 1 |
||
308 | |||
309 | #define PUFFS_STACKSIZE_DEFAULT (1<<PUFFS_CC_STACKSHIFT_DEFAULT) |
||
310 | #define PUFFS_STACKSIZE_MIN ((size_t)-1) |
||
311 | |||
312 | #define DENT_DOT 0 |
||
313 | #define DENT_DOTDOT 1 |
||
314 | #define DENT_ADJ(a) ((a)-2) /* nth request means dir's n-2th */ |
||
315 | |||
316 | |||
317 | /*
|
||
318 | * protos
|
||
319 | */
|
||
320 | |||
321 | #define PUFFSOP_PROTOS(fsname) \
|
||
322 | int fsname##_fs_unmount(struct puffs_usermount *, int); \ |
||
323 | int fsname##_fs_statvfs(struct puffs_usermount *, \ |
||
324 | struct statvfs *); \
|
||
325 | int fsname##_fs_sync(struct puffs_usermount *, int, \ |
||
326 | const struct puffs_cred *cred); \ |
||
327 | int fsname##_fs_fhtonode(struct puffs_usermount *, void *, \ |
||
328 | size_t, struct puffs_newinfo *); \
|
||
329 | int fsname##_fs_nodetofh(struct puffs_usermount *, \ |
||
330 | puffs_cookie_t, void *, size_t *); \
|
||
331 | int fsname##_fs_extattrctl(struct puffs_usermount *, int, \ |
||
332 | puffs_cookie_t, int, int, const char *); \ |
||
333 | \ |
||
334 | int fsname##_node_lookup(struct puffs_usermount *, \ |
||
335 | puffs_cookie_t, struct puffs_newinfo *, \
|
||
336 | const struct puffs_cn *); \ |
||
337 | int fsname##_node_create(struct puffs_usermount *, \ |
||
338 | puffs_cookie_t, struct puffs_newinfo *, \
|
||
339 | const struct puffs_cn *, const struct vattr *); \ |
||
340 | int fsname##_node_mknod(struct puffs_usermount *, \ |
||
341 | puffs_cookie_t, struct puffs_newinfo *, \
|
||
342 | const struct puffs_cn *, const struct vattr *); \ |
||
343 | int fsname##_node_open(struct puffs_usermount *, \ |
||
344 | puffs_cookie_t, int, const struct puffs_cred *); \ |
||
345 | int fsname##_node_close(struct puffs_usermount *, \ |
||
346 | puffs_cookie_t, int, const struct puffs_cred *); \ |
||
347 | int fsname##_node_access(struct puffs_usermount *, \ |
||
348 | puffs_cookie_t, int, const struct puffs_cred *); \ |
||
349 | int fsname##_node_getattr(struct puffs_usermount *, \ |
||
350 | puffs_cookie_t, struct vattr *, const struct puffs_cred *); \ |
||
351 | int fsname##_node_setattr(struct puffs_usermount *, \ |
||
352 | puffs_cookie_t, const struct vattr *, \ |
||
353 | const struct puffs_cred *); \ |
||
354 | int fsname##_node_poll(struct puffs_usermount *, \ |
||
355 | puffs_cookie_t, int *); \
|
||
356 | int fsname##_node_mmap(struct puffs_usermount *, \ |
||
357 | puffs_cookie_t, vm_prot_t, const struct puffs_cred *); \ |
||
358 | int fsname##_node_fsync(struct puffs_usermount *, \ |
||
359 | puffs_cookie_t, const struct puffs_cred *, int, \ |
||
360 | off_t, off_t); \ |
||
361 | int fsname##_node_seek(struct puffs_usermount *, \ |
||
362 | puffs_cookie_t, off_t, off_t, const struct puffs_cred *); \ |
||
363 | int fsname##_node_remove(struct puffs_usermount *, \ |
||
364 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); \ |
||
365 | int fsname##_node_link(struct puffs_usermount *, \ |
||
366 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); \ |
||
367 | int fsname##_node_rename(struct puffs_usermount *, \ |
||
368 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *, \ |
||
369 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); \ |
||
370 | int fsname##_node_mkdir(struct puffs_usermount *, \ |
||
371 | puffs_cookie_t, struct puffs_newinfo *, \
|
||
372 | const struct puffs_cn *, const struct vattr *); \ |
||
373 | int fsname##_node_rmdir(struct puffs_usermount *, \ |
||
374 | puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *); \ |
||
375 | int fsname##_node_symlink(struct puffs_usermount *, \ |
||
376 | puffs_cookie_t, struct puffs_newinfo *, \
|
||
377 | const struct puffs_cn *, const struct vattr *, \ |
||
378 | const char *); \ |
||
379 | int fsname##_node_readdir(struct puffs_usermount *, \ |
||
380 | puffs_cookie_t, struct dirent *, off_t *, size_t *, \
|
||
381 | const struct puffs_cred *, int *, off_t *, size_t *); \ |
||
382 | int fsname##_node_readlink(struct puffs_usermount *, \ |
||
383 | puffs_cookie_t, const struct puffs_cred *, char *, \ |
||
384 | size_t *); \ |
||
385 | int fsname##_node_reclaim(struct puffs_usermount *, \ |
||
386 | puffs_cookie_t); \ |
||
387 | int fsname##_node_inactive(struct puffs_usermount *, \ |
||
388 | puffs_cookie_t); \ |
||
389 | int fsname##_node_print(struct puffs_usermount *, \ |
||
390 | puffs_cookie_t); \ |
||
391 | int fsname##_node_pathconf(struct puffs_usermount *, \ |
||
392 | puffs_cookie_t, int, register_t *); \
|
||
393 | int fsname##_node_advlock(struct puffs_usermount *, \ |
||
394 | puffs_cookie_t, void *, int, struct flock *, int); \ |
||
395 | int fsname##_node_read(struct puffs_usermount *, puffs_cookie_t,\ |
||
396 | uint8_t *, off_t, size_t *, const struct puffs_cred *, int);\ |
||
397 | int fsname##_node_write(struct puffs_usermount *, \ |
||
398 | puffs_cookie_t, uint8_t *, off_t, size_t *, \ |
||
399 | const struct puffs_cred *, int); \ |
||
400 | int fsname##_node_abortop(struct puffs_usermount *, \ |
||
401 | puffs_cookie_t, const struct puffs_cn *); \ |
||
402 | int fsname##_node_getextattr(struct puffs_usermount *, \ |
||
403 | puffs_cookie_t, int, const char *, size_t *, uint8_t *, \ |
||
404 | size_t *, const struct puffs_cred *); \ |
||
405 | int fsname##_node_setextattr(struct puffs_usermount *, \ |
||
406 | puffs_cookie_t, int, const char *, uint8_t *, size_t *, \ |
||
407 | const struct puffs_cred *); \ |
||
408 | int fsname##_node_listextattr(struct puffs_usermount *, \ |
||
409 | puffs_cookie_t, int, size_t *, uint8_t *, size_t *, \
|
||
410 | int, const struct puffs_cred *); \ |
||
411 | int fsname##_node_deleteextattr(struct puffs_usermount *, \ |
||
412 | puffs_cookie_t, int, const char *, \ |
||
413 | const struct puffs_cred *); \ |
||
414 | int fsname##_node_getattr_ttl(struct puffs_usermount *, \ |
||
415 | puffs_cookie_t, struct vattr *, const struct puffs_cred *, \ |
||
416 | struct timespec *); \
|
||
417 | int fsname##_node_setattr_ttl(struct puffs_usermount *, \ |
||
418 | puffs_cookie_t, struct vattr *, const struct puffs_cred *, \ |
||
419 | struct timespec *, int); \ |
||
420 | int fsname##_node_write2(struct puffs_usermount *, \ |
||
421 | puffs_cookie_t, uint8_t *, off_t, size_t *, \ |
||
422 | const struct puffs_cred *, int, int); \ |
||
423 | int fsname##_node_reclaim2(struct puffs_usermount *, \ |
||
424 | puffs_cookie_t, int); \
|
||
425 | int fsname##_node_open2(struct puffs_usermount *, \ |
||
426 | puffs_cookie_t, int, const struct puffs_cred *, int *); \ |
||
427 | int fsname##_node_fallocate(struct puffs_usermount *, \ |
||
428 | puffs_cookie_t, int, off_t, off_t); \
|
||
429 | int fsname##_node_fdiscard(struct puffs_usermount *, \ |
||
430 | puffs_cookie_t, int, off_t, off_t);
|
||
431 | |||
432 | |||
433 | #define PUFFSOP_INIT(ops) \
|
||
434 | ops = malloc(sizeof(struct puffs_ops)); \ |
||
435 | memset(ops, 0, sizeof(struct puffs_ops)) |
||
436 | #define PUFFSOP_SET(ops, fsname, fsornode, opname) \
|
||
437 | (ops)->puffs_##fsornode##_##opname = fsname##_##fsornode##_##opname |
||
438 | #define PUFFSOP_SETFSNOP(ops, opname) \
|
||
439 | (ops)->puffs_fs_##opname = puffs_fsnop_##opname |
||
440 | |||
441 | PUFFSOP_PROTOS(puffs_null) /* XXX */
|
||
442 | |||
443 | #define PNPATH(pnode) ((pnode)->pn_po.po_path)
|
||
444 | #define PNPLEN(pnode) ((pnode)->pn_po.po_len)
|
||
445 | #define PCNPATH(pcnode) ((pcnode)->pcn_po_full.po_path)
|
||
446 | #define PCNPLEN(pcnode) ((pcnode)->pcn_po_full.po_len)
|
||
447 | #define PCNISDOTDOT(pcnode) \
|
||
448 | ((pcnode)->pcn_namelen == 2 && strcmp((pcnode)->pcn_name, "..") == 0) |
||
449 | |||
450 | #define PUFFS_STORE_DCOOKIE(cp, ncp, off) \
|
||
451 | if (cp) { \
|
||
452 | *((cp)++) = off; \ |
||
453 | (*(ncp))++; \ |
||
454 | } |
||
455 | |||
456 | /* mainloop */
|
||
457 | typedef void (*puffs_ml_loop_fn)(struct puffs_usermount *); |
||
458 | |||
459 | /* framebuf stuff */
|
||
460 | struct puffs_framebuf;
|
||
461 | typedef int (*puffs_framev_readframe_fn)(struct puffs_usermount *, |
||
462 | struct puffs_framebuf *,
|
||
463 | int, int *); |
||
464 | typedef int (*puffs_framev_writeframe_fn)(struct puffs_usermount *, |
||
465 | struct puffs_framebuf *,
|
||
466 | int, int *); |
||
467 | typedef int (*puffs_framev_cmpframe_fn)(struct puffs_usermount *, |
||
468 | struct puffs_framebuf *,
|
||
469 | struct puffs_framebuf *,
|
||
470 | int *);
|
||
471 | typedef void (*puffs_framev_fdnotify_fn)(struct puffs_usermount *, int, int); |
||
472 | typedef void (*puffs_framev_gotframe_fn)(struct puffs_usermount *, |
||
473 | struct puffs_framebuf *);
|
||
474 | typedef void (*puffs_framev_cb)(struct puffs_usermount *, |
||
475 | struct puffs_framebuf *,
|
||
476 | void *, int); |
||
477 | #define PUFFS_FBIO_READ 0x01 |
||
478 | #define PUFFS_FBIO_WRITE 0x02 |
||
479 | #define PUFFS_FBIO_ERROR 0x04 |
||
480 | |||
481 | #define PUFFS_FBQUEUE_URGENT 0x01 |
||
482 | |||
483 | |||
484 | __BEGIN_DECLS |
||
485 | |||
486 | #define PUFFS_DEFER ((void *)-1) |
||
487 | struct puffs_usermount *puffs_init(struct puffs_ops *, const char *, |
||
488 | const char *, void *, uint32_t); |
||
489 | int puffs_mount(struct puffs_usermount *, const char *, int, void*); |
||
490 | int puffs_exit(struct puffs_usermount *, int); |
||
491 | void puffs_cancel(struct puffs_usermount *, int); |
||
492 | int puffs_mainloop(struct puffs_usermount *); |
||
493 | int puffs_daemon(struct puffs_usermount *, int, int); |
||
494 | |||
495 | int puffs_unmountonsignal(int, bool); |
||
496 | |||
497 | |||
498 | int puffs_getselectable(struct puffs_usermount *); |
||
499 | int puffs_setblockingmode(struct puffs_usermount *, int); |
||
500 | int puffs_getstate(struct puffs_usermount *); |
||
501 | void puffs_setstacksize(struct puffs_usermount *, size_t); |
||
502 | |||
503 | void puffs_ml_setloopfn(struct puffs_usermount *, puffs_ml_loop_fn); |
||
504 | void puffs_ml_settimeout(struct puffs_usermount *, struct timespec *); |
||
505 | |||
506 | void puffs_setroot(struct puffs_usermount *, |
||
507 | struct puffs_node *);
|
||
508 | struct puffs_node *puffs_getroot(struct puffs_usermount *); |
||
509 | void puffs_setrootinfo(struct puffs_usermount *, |
||
510 | enum vtype, vsize_t, dev_t);
|
||
511 | |||
512 | void *puffs_getspecific(struct puffs_usermount *); |
||
513 | void puffs_setspecific(struct puffs_usermount *, void *); |
||
514 | void puffs_setmaxreqlen(struct puffs_usermount *, size_t); |
||
515 | size_t puffs_getmaxreqlen(struct puffs_usermount *);
|
||
516 | void puffs_setfhsize(struct puffs_usermount *, size_t, int); |
||
517 | void puffs_setmntinfo(struct puffs_usermount *, |
||
518 | const char *, const char *); |
||
519 | |||
520 | void puffs_setncookiehash(struct puffs_usermount *, int); |
||
521 | |||
522 | struct puffs_pathobj *puffs_getrootpathobj(struct puffs_usermount *); |
||
523 | |||
524 | void puffs_setback(struct puffs_cc *, int); |
||
525 | |||
526 | struct puffs_node *puffs_pn_new(struct puffs_usermount *, void *); |
||
527 | void puffs_pn_remove(struct puffs_node *); |
||
528 | void puffs_pn_put(struct puffs_node *); |
||
529 | struct vattr *puffs_pn_getvap(struct puffs_node *); |
||
530 | void * puffs_pn_getpriv(struct puffs_node *); |
||
531 | void puffs_pn_setpriv(struct puffs_node *, void *); |
||
532 | struct puffs_pathobj *puffs_pn_getpo(struct puffs_node *); |
||
533 | struct puffs_usermount *puffs_pn_getmnt(struct puffs_node *); |
||
534 | struct timespec *puffs_pn_getvattl(struct puffs_node *); |
||
535 | struct timespec *puffs_pn_getcnttl(struct puffs_node *); |
||
536 | |||
537 | void puffs_newinfo_setcookie(struct puffs_newinfo *, puffs_cookie_t); |
||
538 | void puffs_newinfo_setvtype(struct puffs_newinfo *, enum vtype); |
||
539 | void puffs_newinfo_setsize(struct puffs_newinfo *, voff_t); |
||
540 | void puffs_newinfo_setrdev(struct puffs_newinfo *, dev_t); |
||
541 | void puffs_newinfo_setva(struct puffs_newinfo *, struct vattr *); |
||
542 | void puffs_newinfo_setvattl(struct puffs_newinfo *, struct timespec *); |
||
543 | void puffs_newinfo_setcnttl(struct puffs_newinfo *, struct timespec *); |
||
544 | |||
545 | void *puffs_pn_getmntspecific(struct puffs_node *); |
||
546 | |||
547 | typedef void * (*puffs_nodewalk_fn)(struct puffs_usermount *, |
||
548 | struct puffs_node *, void *); |
||
549 | void *puffs_pn_nodewalk(struct puffs_usermount *, |
||
550 | puffs_nodewalk_fn, void *);
|
||
551 | |||
552 | void puffs_setvattr(struct vattr *, const struct vattr *); |
||
553 | void puffs_vattr_null(struct vattr *); |
||
554 | |||
555 | void puffs_null_setops(struct puffs_ops *); |
||
556 | |||
557 | int puffs_dispatch_create(struct puffs_usermount *, |
||
558 | struct puffs_framebuf *,
|
||
559 | struct puffs_cc **);
|
||
560 | int puffs_dispatch_exec(struct puffs_cc *, |
||
561 | struct puffs_framebuf **);
|
||
562 | |||
563 | /*
|
||
564 | * generic/dummy routines applicable for some file systems
|
||
565 | */
|
||
566 | int puffs_fsnop_unmount(struct puffs_usermount *, int); |
||
567 | int puffs_fsnop_statvfs(struct puffs_usermount *, struct statvfs *); |
||
568 | void puffs_zerostatvfs(struct statvfs *); |
||
569 | int puffs_fsnop_sync(struct puffs_usermount *, int waitfor, |
||
570 | const struct puffs_cred *); |
||
571 | |||
572 | int puffs_genfs_node_getattr(struct puffs_usermount *, puffs_cookie_t, |
||
573 | struct vattr *, const struct puffs_cred *); |
||
574 | int puffs_genfs_node_reclaim(struct puffs_usermount *, puffs_cookie_t); |
||
575 | |||
576 | /*
|
||
577 | * Subroutine stuff
|
||
578 | */
|
||
579 | |||
580 | int puffs_gendotdent(struct dirent **, ino_t, int, size_t *); |
||
581 | int puffs_nextdent(struct dirent **, const char *, ino_t, |
||
582 | uint8_t, size_t *); |
||
583 | int puffs_vtype2dt(enum vtype); |
||
584 | enum vtype puffs_mode2vt(mode_t);
|
||
585 | void puffs_stat2vattr(struct vattr *va, const struct stat *); |
||
586 | mode_t puffs_addvtype2mode(mode_t, enum vtype);
|
||
587 | |||
588 | |||
589 | /*
|
||
590 | * credentials & permissions
|
||
591 | */
|
||
592 | |||
593 | /* Credential fetch */
|
||
594 | int puffs_cred_getuid(const struct puffs_cred *, uid_t *); |
||
595 | int puffs_cred_getgid(const struct puffs_cred *, gid_t *); |
||
596 | int puffs_cred_getgroups(const struct puffs_cred *, gid_t *, short *); |
||
597 | |||
598 | /* Credential check */
|
||
599 | bool puffs_cred_isuid(const struct puffs_cred *, uid_t); |
||
600 | bool puffs_cred_hasgroup(const struct puffs_cred *, gid_t); |
||
601 | bool puffs_cred_isregular(const struct puffs_cred *); |
||
602 | bool puffs_cred_iskernel(const struct puffs_cred *); |
||
603 | bool puffs_cred_isfs(const struct puffs_cred *); |
||
604 | bool puffs_cred_isjuggernaut(const struct puffs_cred *); |
||
605 | |||
606 | /* misc */
|
||
607 | int puffs_access(enum vtype, mode_t, uid_t, gid_t, mode_t, |
||
608 | const struct puffs_cred *); |
||
609 | int puffs_access_chown(uid_t, gid_t, uid_t, gid_t,
|
||
610 | const struct puffs_cred *); |
||
611 | int puffs_access_chmod(uid_t, gid_t, enum vtype, mode_t, |
||
612 | const struct puffs_cred *); |
||
613 | int puffs_access_times(uid_t, gid_t, mode_t, int, |
||
614 | const struct puffs_cred *); |
||
615 | |||
616 | |||
617 | /*
|
||
618 | * Call Context interfaces relevant for user.
|
||
619 | */
|
||
620 | |||
621 | void puffs_cc_yield(struct puffs_cc *); |
||
622 | void puffs_cc_continue(struct puffs_cc *); |
||
623 | void puffs_cc_schedule(struct puffs_cc *); |
||
624 | int puffs_cc_getcaller(struct puffs_cc *,pid_t *,lwpid_t *); |
||
625 | struct puffs_cc *puffs_cc_getcc(struct puffs_usermount *); |
||
626 | |||
627 | /*
|
||
628 | * Flushing / invalidation routines
|
||
629 | */
|
||
630 | |||
631 | int puffs_inval_namecache_dir(struct puffs_usermount *, puffs_cookie_t); |
||
632 | int puffs_inval_namecache_all(struct puffs_usermount *); |
||
633 | |||
634 | int puffs_inval_pagecache_node(struct puffs_usermount *, puffs_cookie_t); |
||
635 | int puffs_inval_pagecache_node_range(struct puffs_usermount *, |
||
636 | puffs_cookie_t, off_t, off_t); |
||
637 | int puffs_flush_pagecache_node(struct puffs_usermount *, puffs_cookie_t); |
||
638 | int puffs_flush_pagecache_node_range(struct puffs_usermount *, |
||
639 | puffs_cookie_t, off_t, off_t); |
||
640 | |||
641 | /*
|
||
642 | * Path constructicons
|
||
643 | */
|
||
644 | |||
645 | int puffs_stdpath_buildpath(struct puffs_usermount *, |
||
646 | const struct puffs_pathobj *, |
||
647 | const struct puffs_pathobj *, size_t, |
||
648 | struct puffs_pathobj *);
|
||
649 | int puffs_stdpath_cmppath(struct puffs_usermount *, struct puffs_pathobj *, |
||
650 | struct puffs_pathobj *, size_t, int); |
||
651 | void puffs_stdpath_freepath(struct puffs_usermount *,struct puffs_pathobj *); |
||
652 | |||
653 | void *puffs_path_walkcmp(struct puffs_usermount *, |
||
654 | struct puffs_node *, void *); |
||
655 | void *puffs_path_prefixadj(struct puffs_usermount *, |
||
656 | struct puffs_node *, void *); |
||
657 | int puffs_path_pcnbuild(struct puffs_usermount *, |
||
658 | struct puffs_cn *, void *); |
||
659 | void puffs_path_buildhash(struct puffs_usermount *, struct puffs_pathobj *); |
||
660 | void puffs_set_pathbuild(struct puffs_usermount *, pu_pathbuild_fn); void puffs_set_pathtransform(struct puffs_usermount *, pu_pathtransform_fn); |
||
661 | void puffs_set_pathcmp(struct puffs_usermount *, pu_pathcmp_fn); |
||
662 | void puffs_set_pathfree(struct puffs_usermount *, pu_pathfree_fn); |
||
663 | void puffs_set_namemod(struct puffs_usermount *, pu_namemod_fn); |
||
664 | |||
665 | void puffs_set_errnotify(struct puffs_usermount *, pu_errnotify_fn); |
||
666 | void puffs_kernerr_log(struct puffs_usermount *, uint8_t, int, |
||
667 | const char *, puffs_cookie_t); |
||
668 | __dead void puffs_kernerr_abort(struct puffs_usermount *, uint8_t, int, |
||
669 | const char *, puffs_cookie_t); |
||
670 | void puffs_set_prepost(struct puffs_usermount *, |
||
671 | pu_prepost_fn, pu_prepost_fn); |
||
672 | void puffs_set_cmap(struct puffs_usermount *, pu_cmap_fn); |
||
673 | |||
674 | /*
|
||
675 | * Suspension
|
||
676 | */
|
||
677 | |||
678 | int puffs_fs_suspend(struct puffs_usermount *); |
||
679 | |||
680 | /*
|
||
681 | * Frame buffering
|
||
682 | */
|
||
683 | |||
684 | void puffs_framev_init(struct puffs_usermount *, |
||
685 | puffs_framev_readframe_fn, |
||
686 | puffs_framev_writeframe_fn, |
||
687 | puffs_framev_cmpframe_fn, |
||
688 | puffs_framev_gotframe_fn, |
||
689 | puffs_framev_fdnotify_fn); |
||
690 | |||
691 | struct puffs_framebuf *puffs_framebuf_make(void); |
||
692 | void puffs_framebuf_destroy(struct puffs_framebuf *); |
||
693 | int puffs_framebuf_dup(struct puffs_framebuf *, |
||
694 | struct puffs_framebuf **);
|
||
695 | void puffs_framebuf_recycle(struct puffs_framebuf *); |
||
696 | int puffs_framebuf_reserve_space(struct puffs_framebuf *, |
||
697 | size_t); |
||
698 | |||
699 | int puffs_framebuf_putdata(struct puffs_framebuf *, const void *, size_t); |
||
700 | int puffs_framebuf_putdata_atoff(struct puffs_framebuf *, size_t, |
||
701 | const void *, size_t); |
||
702 | int puffs_framebuf_getdata(struct puffs_framebuf *, void *, size_t); |
||
703 | int puffs_framebuf_getdata_atoff(struct puffs_framebuf *, size_t, |
||
704 | void *, size_t);
|
||
705 | |||
706 | size_t puffs_framebuf_telloff(struct puffs_framebuf *);
|
||
707 | size_t puffs_framebuf_tellsize(struct puffs_framebuf *);
|
||
708 | size_t puffs_framebuf_remaining(struct puffs_framebuf *);
|
||
709 | int puffs_framebuf_seekset(struct puffs_framebuf *, size_t); |
||
710 | int puffs_framebuf_getwindow(struct puffs_framebuf *, size_t, |
||
711 | void **, size_t *);
|
||
712 | |||
713 | int puffs_framev_enqueue_cc(struct puffs_cc *, int, |
||
714 | struct puffs_framebuf *, int); |
||
715 | int puffs_framev_enqueue_cb(struct puffs_usermount *, int, |
||
716 | struct puffs_framebuf *,
|
||
717 | puffs_framev_cb, void *, int); |
||
718 | int puffs_framev_enqueue_justsend(struct puffs_usermount *, int, |
||
719 | struct puffs_framebuf *, int, int); |
||
720 | int puffs_framev_enqueue_directreceive(struct puffs_cc *, int, |
||
721 | struct puffs_framebuf *, int); |
||
722 | int puffs_framev_enqueue_directsend(struct puffs_cc *, int, |
||
723 | struct puffs_framebuf *, int); |
||
724 | int puffs_framev_enqueue_waitevent(struct puffs_cc *, int, int *); |
||
725 | int puffs_framev_framebuf_ccpromote(struct puffs_framebuf *, |
||
726 | struct puffs_cc *);
|
||
727 | |||
728 | int puffs_framev_addfd(struct puffs_usermount *, int, int); |
||
729 | int puffs_framev_enablefd(struct puffs_usermount *, int, int); |
||
730 | int puffs_framev_disablefd(struct puffs_usermount *, int, int); |
||
731 | int puffs_framev_removefd(struct puffs_usermount *, int, int); |
||
732 | void puffs_framev_removeonclose(struct puffs_usermount *, int, int); |
||
733 | void puffs_framev_unmountonclose(struct puffs_usermount *, int, int); |
||
734 | |||
735 | __END_DECLS |
||
736 | |||
737 | #endif /* _PUFFS_H_ */ |