root / lab4 / .minix-src / include / puffs.h @ 14
History | View | Annotate | Download (28.3 KB)
1 |
/* $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_ */ |