Bring in the "Port PUFFS from NetBSD/FreeBSD" GSoC 2011 project results.
[dragonfly.git] / lib / libpuffs / puffs.h
1 /*      $NetBSD: puffs.h,v 1.118 2011/07/04 08:07:30 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 <vfs/puffs/puffs_msgif.h>
45
46 #include <mntopts.h>
47 #include <stdbool.h>
48 #include <string.h>
49
50 /* XXXDF */
51 #define _PATH_PUFFS     "/dev/putter"
52 #define MOUNT_PUFFS     "puffs"         /* Pass-to-Userspace filesystem */
53
54 /* forwards */
55 struct puffs_cc;
56
57 struct puffs_getreq;
58 struct puffs_cred;
59 struct puffs_newinfo;
60
61 /* paths */
62 struct puffs_pathobj {
63         void            *po_path;
64         size_t          po_len;
65         uint32_t        po_hash;
66 };
67
68 /* for prefix rename */
69 struct puffs_pathinfo {
70         struct puffs_pathobj *pi_old;
71         struct puffs_pathobj *pi_new;
72 };
73
74 /* describes one segment cached in the kernel */
75 struct puffs_kcache {
76         off_t   pkc_start;
77         off_t   pkc_end;
78
79         LIST_ENTRY(puffs_kcache) pkc_entries;
80 };
81
82 /* XXX: might disappear from here into a private header */
83 struct puffs_node {
84         off_t                   pn_size;
85         int                     pn_flags;
86         struct vattr            pn_va;
87
88         void                    *pn_data;       /* private data         */
89
90         struct puffs_pathobj    pn_po;          /* PUFFS_FLAG_BUILDPATH */
91
92         struct puffs_usermount  *pn_mnt;
93         LIST_ENTRY(puffs_node)  pn_entries;
94
95         LIST_HEAD(,puffs_kcache)pn_cacheinfo;   /* PUFFS_KFLAG_CACHE    */
96
97         void                    *pn_spare[4];
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 #define PUFFS_EXTATTR_LIST_LENPREFIX 1
121 /*
122  * Magic constants
123  */
124 #define PUFFS_CC_STACKSHIFT_DEFAULT 18
125
126 struct puffs_cn {
127         struct puffs_kcn        *pcn_pkcnp;     /* kernel input */
128         struct puffs_cred       *pcn_cred;      /* cred used for lookup */
129
130         struct puffs_pathobj    pcn_po_full;    /* PUFFS_FLAG_BUILDPATH */
131 };
132 #define pcn_name        pcn_pkcnp->pkcn_name
133 #define pcn_namelen     pcn_pkcnp->pkcn_namelen
134
135 /*
136  * Puffs options to mount
137  */
138 /* kernel */
139 #define PUFFSMOPT_NAMECACHE     { "namecache", 1, PUFFS_KFLAG_NOCACHE_NAME, 1 }
140 #define PUFFSMOPT_PAGECACHE     { "pagecache", 1, PUFFS_KFLAG_NOCACHE_PAGE, 1 }
141 #define PUFFSMOPT_ATTRCACHE     { "attrcache", 1, PUFFS_KFLAG_NOCACHE_ATTR, 1 }
142 #define PUFFSMOPT_CACHE         { "cache", 1, PUFFS_KFLAG_NOCACHE, 1 }
143 #define PUFFSMOPT_ALLOPS        { "allops", 0, PUFFS_KFLAG_ALLOPS, 1 }
144
145 /* libpuffs */
146 #define PUFFSMOPT_DUMP          { "dump", 0, PUFFS_FLAG_OPDUMP, 1 }
147
148 #define PUFFSMOPT_STD                                                   \
149         PUFFSMOPT_NAMECACHE,                                            \
150         PUFFSMOPT_PAGECACHE,                                            \
151         PUFFSMOPT_ATTRCACHE,                                            \
152         PUFFSMOPT_CACHE,                                                \
153         PUFFSMOPT_ALLOPS,                                               \
154         PUFFSMOPT_DUMP
155
156 extern const struct mntopt puffsmopts[]; /* puffs.c */
157
158 /* callbacks for operations */
159 struct puffs_ops {
160         int (*puffs_fs_unmount)(struct puffs_usermount *, int);
161         int (*puffs_fs_statvfs)(struct puffs_usermount *, struct statvfs *);
162         int (*puffs_fs_sync)(struct puffs_usermount *, int);
163         int (*puffs_fs_fhtonode)(struct puffs_usermount *, void *, size_t,
164             struct puffs_newinfo *);
165         int (*puffs_fs_nodetofh)(struct puffs_usermount *, puffs_cookie_t,
166             void *, size_t *);
167         int (*puffs_fs_extattrctl)(struct puffs_usermount *, int,
168             puffs_cookie_t, int, int, const char *);
169
170         int (*puffs_node_lookup)(struct puffs_usermount *,
171             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *);
172         int (*puffs_node_lookupdotdot)(struct puffs_usermount *,
173             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *);
174         int (*puffs_node_create)(struct puffs_usermount *,
175             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *,
176             const struct vattr *);
177         int (*puffs_node_mknod)(struct puffs_usermount *,
178             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *,
179             const struct vattr *);
180         int (*puffs_node_open)(struct puffs_usermount *,
181             puffs_cookie_t, int, const struct puffs_cred *);
182         int (*puffs_node_close)(struct puffs_usermount *,
183             puffs_cookie_t, int);
184         int (*puffs_node_access)(struct puffs_usermount *,
185             puffs_cookie_t, int, const struct puffs_cred *);
186         int (*puffs_node_getattr)(struct puffs_usermount *,
187             puffs_cookie_t, struct vattr *, const struct puffs_cred *);
188         int (*puffs_node_setattr)(struct puffs_usermount *,
189             puffs_cookie_t, const struct vattr *, const struct puffs_cred *);
190         int (*puffs_node_poll)(struct puffs_usermount *, puffs_cookie_t, int *);
191         int (*puffs_node_mmap)(struct puffs_usermount *,
192             puffs_cookie_t, vm_prot_t, const struct puffs_cred *);
193         int (*puffs_node_fsync)(struct puffs_usermount *,
194             puffs_cookie_t, int);
195         int (*puffs_node_seek)(struct puffs_usermount *,
196             puffs_cookie_t, off_t, off_t, const struct puffs_cred *);
197         int (*puffs_node_remove)(struct puffs_usermount *,
198             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);
199         int (*puffs_node_link)(struct puffs_usermount *,
200             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);
201         int (*puffs_node_rename)(struct puffs_usermount *,
202             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *,
203             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);
204         int (*puffs_node_mkdir)(struct puffs_usermount *,
205             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *,
206             const struct vattr *);
207         int (*puffs_node_rmdir)(struct puffs_usermount *,
208             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);
209         int (*puffs_node_symlink)(struct puffs_usermount *,
210             puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *,
211             const struct vattr *,
212             const char *);
213         int (*puffs_node_readdir)(struct puffs_usermount *,
214             puffs_cookie_t, struct dirent *, off_t *, size_t *,
215             const struct puffs_cred *, int *, off_t *, size_t *);
216         int (*puffs_node_readlink)(struct puffs_usermount *,
217             puffs_cookie_t, const struct puffs_cred *, char *, size_t *);
218         int (*puffs_node_reclaim)(struct puffs_usermount *, puffs_cookie_t);
219         int (*puffs_node_inactive)(struct puffs_usermount *, puffs_cookie_t);
220         int (*puffs_node_print)(struct puffs_usermount *, puffs_cookie_t);
221         int (*puffs_node_pathconf)(struct puffs_usermount *,
222             puffs_cookie_t, int, register_t *);
223         int (*puffs_node_advlock)(struct puffs_usermount *,
224             puffs_cookie_t, void *, int, struct flock *, int);
225         int (*puffs_node_read)(struct puffs_usermount *, puffs_cookie_t,
226             uint8_t *, off_t, size_t *, const struct puffs_cred *, int);
227         int (*puffs_node_write)(struct puffs_usermount *, puffs_cookie_t,
228             uint8_t *, off_t, size_t *, const struct puffs_cred *, int);
229         int (*puffs_node_abortop)(struct puffs_usermount *, puffs_cookie_t,
230             const struct puffs_cn *);
231         int (*puffs_node_getextattr)(struct puffs_usermount *, puffs_cookie_t,
232             int, const char *, size_t *, uint8_t *, size_t *,
233             const struct puffs_cred *);
234         int (*puffs_node_setextattr)(struct puffs_usermount *, puffs_cookie_t,
235             int, const char *, uint8_t *, size_t *, const struct puffs_cred *);
236         int (*puffs_node_listextattr)(struct puffs_usermount *, puffs_cookie_t,
237             int, size_t *, uint8_t *, size_t *, int, const struct puffs_cred *);
238         int (*puffs_node_deleteextattr)(struct puffs_usermount *,
239             puffs_cookie_t, int, const char *, const struct puffs_cred *);
240
241         void *puffs_ops_spare[32];
242 };
243
244 typedef int (*pu_pathbuild_fn)(struct puffs_usermount *,
245                                const struct puffs_pathobj *,
246                                const struct puffs_pathobj *, size_t,
247                                struct puffs_pathobj *);
248 typedef int (*pu_pathtransform_fn)(struct puffs_usermount *,
249                                    const struct puffs_pathobj *,
250                                    const struct puffs_cn *,
251                                    struct puffs_pathobj *);
252 typedef int (*pu_pathcmp_fn)(struct puffs_usermount *, struct puffs_pathobj *,
253                           struct puffs_pathobj *, size_t, int);
254 typedef void (*pu_pathfree_fn)(struct puffs_usermount *,
255                                struct puffs_pathobj *);
256 typedef int (*pu_namemod_fn)(struct puffs_usermount *,
257                              struct puffs_pathobj *, struct puffs_cn *);
258
259 typedef void (*pu_errnotify_fn)(struct puffs_usermount *,
260                                 uint8_t, int, const char *, puffs_cookie_t);
261
262 typedef void (*pu_prepost_fn)(struct puffs_usermount *);
263
264 typedef struct puffs_node *(*pu_cmap_fn)(struct puffs_usermount *,
265                                          puffs_cookie_t);
266
267 enum {
268         PUFFS_STATE_BEFOREMOUNT,        PUFFS_STATE_RUNNING,
269         PUFFS_STATE_UNMOUNTING,         PUFFS_STATE_UNMOUNTED
270 };
271
272 #define PUFFS_FLAG_BUILDPATH    0x80000000      /* node paths in pnode */
273 #define PUFFS_FLAG_OPDUMP       0x40000000      /* dump all operations */
274 #define PUFFS_FLAG_HASHPATH     0x20000000      /* speedup: hash paths */
275 #define PUFFS_FLAG_MASK         0xe0000000
276
277 #define PUFFS_FLAG_KERN(a)      ((a) & PUFFS_KFLAG_MASK)
278 #define PUFFS_FLAG_LIB(a)       ((a) & PUFFS_FLAG_MASK)
279
280 /* blocking mode argument */
281 #define PUFFSDEV_BLOCK 0
282 #define PUFFSDEV_NONBLOCK 1
283
284 #define PUFFS_STACKSIZE_DEFAULT (1<<PUFFS_CC_STACKSHIFT_DEFAULT)
285 #define PUFFS_STACKSIZE_MIN ((size_t)-1)
286
287 #define         DENT_DOT        0
288 #define         DENT_DOTDOT     1
289 #define         DENT_ADJ(a)     ((a)-2) /* nth request means dir's n-2th */
290
291
292 /*
293  * protos
294  */
295
296 #define PUFFSOP_PROTOS(fsname)                                          \
297         int fsname##_fs_unmount(struct puffs_usermount *, int);         \
298         int fsname##_fs_statvfs(struct puffs_usermount *,               \
299             struct statvfs *);                                          \
300         int fsname##_fs_sync(struct puffs_usermount *, int,             \
301             const struct puffs_cred *cred);                             \
302         int fsname##_fs_fhtonode(struct puffs_usermount *, void *,      \
303             size_t, struct puffs_newinfo *);                            \
304         int fsname##_fs_nodetofh(struct puffs_usermount *,              \
305             puffs_cookie_t, void *, size_t *);                          \
306         int fsname##_fs_extattrctl(struct puffs_usermount *, int,       \
307             puffs_cookie_t, int, int, const char *);                    \
308                                                                         \
309         int fsname##_node_lookup(struct puffs_usermount *,              \
310             puffs_cookie_t, struct puffs_newinfo *,                     \
311             const struct puffs_cn *);                                   \
312         int fsname##_node_lookupdotdot(struct puffs_usermount *,        \
313             puffs_cookie_t, struct puffs_newinfo *,                     \
314             const struct puffs_cn *);                                   \
315         int fsname##_node_create(struct puffs_usermount *,              \
316             puffs_cookie_t, struct puffs_newinfo *,                     \
317             const struct puffs_cn *, const struct vattr *);             \
318         int fsname##_node_mknod(struct puffs_usermount *,               \
319             puffs_cookie_t, struct puffs_newinfo *,                     \
320             const struct puffs_cn *, const struct vattr *);             \
321         int fsname##_node_open(struct puffs_usermount *,                \
322             puffs_cookie_t, int, const struct puffs_cred *);            \
323         int fsname##_node_close(struct puffs_usermount *,               \
324             puffs_cookie_t, int, const struct puffs_cred *);            \
325         int fsname##_node_access(struct puffs_usermount *,              \
326             puffs_cookie_t, int, const struct puffs_cred *);            \
327         int fsname##_node_getattr(struct puffs_usermount *,             \
328             puffs_cookie_t, struct vattr *, const struct puffs_cred *); \
329         int fsname##_node_setattr(struct puffs_usermount *,             \
330             puffs_cookie_t, const struct vattr *,                       \
331             const struct puffs_cred *);                                 \
332         int fsname##_node_poll(struct puffs_usermount *,                \
333             puffs_cookie_t, int *);                                     \
334         int fsname##_node_mmap(struct puffs_usermount *,                \
335             puffs_cookie_t, vm_prot_t, const struct puffs_cred *);      \
336         int fsname##_node_fsync(struct puffs_usermount *,               \
337             puffs_cookie_t,int);                                        \
338         int fsname##_node_seek(struct puffs_usermount *,                \
339             puffs_cookie_t, off_t, off_t, const struct puffs_cred *);   \
340         int fsname##_node_remove(struct puffs_usermount *,              \
341             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);   \
342         int fsname##_node_link(struct puffs_usermount *,                \
343             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);   \
344         int fsname##_node_rename(struct puffs_usermount *,              \
345             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *,    \
346             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);   \
347         int fsname##_node_mkdir(struct puffs_usermount *,               \
348             puffs_cookie_t, struct puffs_newinfo *,                     \
349             const struct puffs_cn *, const struct vattr *);             \
350         int fsname##_node_rmdir(struct puffs_usermount *,               \
351             puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);   \
352         int fsname##_node_symlink(struct puffs_usermount *,             \
353             puffs_cookie_t, struct puffs_newinfo *,                     \
354             const struct puffs_cn *, const struct vattr *,              \
355             const char *);                                              \
356         int fsname##_node_readdir(struct puffs_usermount *,             \
357             puffs_cookie_t, struct dirent *, off_t *, size_t *,         \
358             const struct puffs_cred *, int *, off_t *, size_t *);       \
359         int fsname##_node_readlink(struct puffs_usermount *,            \
360             puffs_cookie_t, const struct puffs_cred *, char *,          \
361             size_t *);                                                  \
362         int fsname##_node_reclaim(struct puffs_usermount *,             \
363             puffs_cookie_t);                                            \
364         int fsname##_node_inactive(struct puffs_usermount *,            \
365             puffs_cookie_t);                                            \
366         int fsname##_node_print(struct puffs_usermount *,               \
367             puffs_cookie_t);                                            \
368         int fsname##_node_pathconf(struct puffs_usermount *,            \
369             puffs_cookie_t, int, register_t *);                         \
370         int fsname##_node_advlock(struct puffs_usermount *,             \
371             puffs_cookie_t, void *, int, struct flock *, int);          \
372         int fsname##_node_read(struct puffs_usermount *, puffs_cookie_t,\
373             uint8_t *, off_t, size_t *, const struct puffs_cred *, int);\
374         int fsname##_node_write(struct puffs_usermount *,               \
375             puffs_cookie_t, uint8_t *, off_t, size_t *,                 \
376             const struct puffs_cred *, int);                            \
377         int fsname##_node_abortop(struct puffs_usermount *,             \
378             puffs_cookie_t, const struct puffs_cn *);                   \
379         int fsname##_node_getextattr(struct puffs_usermount *,          \
380             puffs_cookie_t, int, const char *, size_t *, uint8_t *,     \
381             size_t *, const struct puffs_cred *);                       \
382         int fsname##_node_setextattr(struct puffs_usermount *,          \
383             puffs_cookie_t, int, const char *, uint8_t *, size_t *,     \
384             const struct puffs_cred *);                                 \
385         int fsname##_node_listextattr(struct puffs_usermount *,         \
386             puffs_cookie_t, int, size_t *, uint8_t *, size_t *,         \
387             int, const struct puffs_cred *);                            \
388         int fsname##_node_deleteextattr(struct puffs_usermount *,       \
389             puffs_cookie_t, int, const char *,                          \
390             const struct puffs_cred *);
391
392 #define PUFFSOP_INIT(ops)                                               \
393     ops = malloc(sizeof(struct puffs_ops));                             \
394     memset(ops, 0, sizeof(struct puffs_ops))
395 #define PUFFSOP_SET(ops, fsname, fsornode, opname)                      \
396     (ops)->puffs_##fsornode##_##opname = fsname##_##fsornode##_##opname
397 #define PUFFSOP_SETFSNOP(ops, opname)                                   \
398     (ops)->puffs_fs_##opname = puffs_fsnop_##opname
399
400 PUFFSOP_PROTOS(puffs_null)      /* XXX */
401
402 #define PNPATH(pnode)   ((pnode)->pn_po.po_path)
403 #define PNPLEN(pnode)   ((pnode)->pn_po.po_len)
404 #define PCNPATH(pcnode) ((pcnode)->pcn_po_full.po_path)
405 #define PCNPLEN(pcnode) ((pcnode)->pcn_po_full.po_len)
406
407 #define PUFFS_STORE_DCOOKIE(cp, ncp, off)                               \
408 if (cp) {                                                               \
409         *((cp)++) = off;                                                \
410         (*(ncp))++;                                                     \
411 }
412
413 /* mainloop */
414 typedef void (*puffs_ml_loop_fn)(struct puffs_usermount *);
415
416 /* framebuf stuff */
417 struct puffs_framebuf;
418 typedef int (*puffs_framev_readframe_fn)(struct puffs_usermount *,
419                                            struct puffs_framebuf *,
420                                            int, int *);
421 typedef int (*puffs_framev_writeframe_fn)(struct puffs_usermount *,
422                                             struct puffs_framebuf *,
423                                             int, int *);
424 typedef int (*puffs_framev_cmpframe_fn)(struct puffs_usermount *,
425                                          struct puffs_framebuf *,
426                                          struct puffs_framebuf *,
427                                          int *);
428 typedef void (*puffs_framev_fdnotify_fn)(struct puffs_usermount *, int, int);
429 typedef void (*puffs_framev_gotframe_fn)(struct puffs_usermount *,
430                                         struct puffs_framebuf *);
431 typedef void (*puffs_framev_cb)(struct puffs_usermount *,
432                                 struct puffs_framebuf *,
433                                 void *, int);
434 #define PUFFS_FBIO_READ         0x01
435 #define PUFFS_FBIO_WRITE        0x02
436 #define PUFFS_FBIO_ERROR        0x04
437
438 #define PUFFS_FBQUEUE_URGENT    0x01
439
440
441 __BEGIN_DECLS
442
443 #define PUFFS_DEFER ((void *)-1)
444 struct puffs_usermount *puffs_init(struct puffs_ops *, const char *,
445                                     const char *, void *, uint32_t);
446 int             puffs_mount(struct puffs_usermount *, const char *, int, void*);
447 int             puffs_exit(struct puffs_usermount *, int);
448 void            puffs_cancel(struct puffs_usermount *, int);
449 int             puffs_mainloop(struct puffs_usermount *);
450 int             puffs_daemon(struct puffs_usermount *, int, int);
451
452 int             puffs_unmountonsignal(int, bool);
453
454
455 int     puffs_getselectable(struct puffs_usermount *);
456 int     puffs_setblockingmode(struct puffs_usermount *, int);
457 int     puffs_getstate(struct puffs_usermount *);
458 void    puffs_setstacksize(struct puffs_usermount *, size_t);
459
460 void    puffs_ml_setloopfn(struct puffs_usermount *, puffs_ml_loop_fn);
461 void    puffs_ml_settimeout(struct puffs_usermount *, struct timespec *);
462
463 void                    puffs_setroot(struct puffs_usermount *,
464                                       struct puffs_node *);
465 struct puffs_node       *puffs_getroot(struct puffs_usermount *);
466 void                    puffs_setrootinfo(struct puffs_usermount *,
467                                           enum vtype, vsize_t, dev_t);
468
469 void                    *puffs_getspecific(struct puffs_usermount *);
470 void                    puffs_setspecific(struct puffs_usermount *, void *);
471 void                    puffs_setmaxreqlen(struct puffs_usermount *, size_t);
472 size_t                  puffs_getmaxreqlen(struct puffs_usermount *);
473 void                    puffs_setfhsize(struct puffs_usermount *, size_t, int);
474 void                    puffs_setmntinfo(struct puffs_usermount *,
475                                          const char *, const char *);
476
477 void                    puffs_setncookiehash(struct puffs_usermount *, int);
478
479 struct puffs_pathobj    *puffs_getrootpathobj(struct puffs_usermount *);
480
481 void                    puffs_setback(struct puffs_cc *, int);
482
483 struct puffs_node       *puffs_pn_new(struct puffs_usermount *, void *);
484 void                    puffs_pn_remove(struct puffs_node *);
485 void                    puffs_pn_put(struct puffs_node *);
486 struct vattr            *puffs_pn_getvap(struct puffs_node *);
487 void *                  puffs_pn_getpriv(struct puffs_node *);
488 void                    puffs_pn_setpriv(struct puffs_node *, void *);
489 struct puffs_pathobj    *puffs_pn_getpo(struct puffs_node *);
490 struct puffs_usermount  *puffs_pn_getmnt(struct puffs_node *);
491
492 void    puffs_newinfo_setcookie(struct puffs_newinfo *, puffs_cookie_t);
493 void    puffs_newinfo_setvtype(struct puffs_newinfo *, enum vtype);
494 void    puffs_newinfo_setsize(struct puffs_newinfo *, voff_t);
495
496 void                    *puffs_pn_getmntspecific(struct puffs_node *);
497
498 typedef         void *  (*puffs_nodewalk_fn)(struct puffs_usermount *,
499                                              struct puffs_node *, void *);
500 void                    *puffs_pn_nodewalk(struct puffs_usermount *,
501                                            puffs_nodewalk_fn, void *);
502
503 void                    puffs_setvattr(struct vattr *, const struct vattr *);
504 void                    puffs_vattr_null(struct vattr *);
505
506 void                    puffs_null_setops(struct puffs_ops *);
507
508 int                     puffs_dispatch_create(struct puffs_usermount *,
509                                               struct puffs_framebuf *,
510                                               struct puffs_cc **);
511 int                     puffs_dispatch_exec(struct puffs_cc *,
512                                             struct puffs_framebuf **);
513
514 /*
515  * generic/dummy routines applicable for some file systems
516  */
517 int  puffs_fsnop_unmount(struct puffs_usermount *, int);
518 int  puffs_fsnop_statvfs(struct puffs_usermount *, struct statvfs *);
519 void puffs_zerostatvfs(struct statvfs *);
520 int  puffs_fsnop_sync(struct puffs_usermount *, int waitfor);
521
522 int  puffs_genfs_node_getattr(struct puffs_usermount *, puffs_cookie_t,
523                               struct vattr *, const struct puffs_cred *);
524 int  puffs_genfs_node_reclaim(struct puffs_usermount *, puffs_cookie_t);
525
526 /*
527  * Subroutine stuff
528  */
529
530 int             puffs_gendotdent(struct dirent **, ino_t, int, size_t *);
531 int             puffs_nextdent(struct dirent **, const char *, ino_t,
532                                uint8_t, size_t *);
533 int             puffs_vtype2dt(enum vtype);
534 enum vtype      puffs_mode2vt(mode_t);
535 void            puffs_stat2vattr(struct vattr *va, const struct stat *);
536 mode_t          puffs_addvtype2mode(mode_t, enum vtype);
537
538
539 /*
540  * credentials & permissions
541  */
542
543 /* Credential fetch */
544 int     puffs_cred_getuid(const struct puffs_cred *, uid_t *);
545 int     puffs_cred_getgid(const struct puffs_cred *, gid_t *);
546 int     puffs_cred_getgroups(const struct puffs_cred *, gid_t *, short *);
547
548 /* Credential check */
549 bool    puffs_cred_isuid(const struct puffs_cred *, uid_t);
550 bool    puffs_cred_hasgroup(const struct puffs_cred *, gid_t);
551 bool    puffs_cred_isregular(const struct puffs_cred *);
552 bool    puffs_cred_iskernel(const struct puffs_cred *);
553 bool    puffs_cred_isfs(const struct puffs_cred *);
554 bool    puffs_cred_isjuggernaut(const struct puffs_cred *);
555
556 /* misc */
557 int     puffs_access(enum vtype, mode_t, uid_t, gid_t, mode_t,
558                      const struct puffs_cred *);
559 int     puffs_access_chown(uid_t, gid_t, uid_t, gid_t,
560                            const struct puffs_cred *);
561 int     puffs_access_chmod(uid_t, gid_t, enum vtype, mode_t,
562                            const struct puffs_cred *);
563 int     puffs_access_times(uid_t, gid_t, mode_t, int,
564                            const struct puffs_cred *);
565
566
567 /*
568  * Call Context interfaces relevant for user.
569  */
570
571 void                    puffs_cc_yield(struct puffs_cc *);
572 void                    puffs_cc_continue(struct puffs_cc *);
573 void                    puffs_cc_schedule(struct puffs_cc *);
574 int                     puffs_cc_getcaller(struct puffs_cc *,pid_t *,lwpid_t *);
575 struct puffs_cc         *puffs_cc_getcc(struct puffs_usermount *);
576
577 /*
578  * Flushing / invalidation routines
579  */
580
581 int     puffs_inval_namecache_dir(struct puffs_usermount *, puffs_cookie_t);
582 int     puffs_inval_namecache_all(struct puffs_usermount *);
583
584 int     puffs_inval_pagecache_node(struct puffs_usermount *, puffs_cookie_t);
585 int     puffs_inval_pagecache_node_range(struct puffs_usermount *,
586                                          puffs_cookie_t, off_t, off_t);
587 int     puffs_flush_pagecache_node(struct puffs_usermount *, puffs_cookie_t);
588 int     puffs_flush_pagecache_node_range(struct puffs_usermount *,
589                                          puffs_cookie_t, off_t, off_t);
590
591 /*
592  * Path constructicons
593  */
594
595 int     puffs_stdpath_buildpath(struct puffs_usermount *,
596                              const struct puffs_pathobj *,
597                              const struct puffs_pathobj *, size_t,
598                              struct puffs_pathobj *);
599 int     puffs_stdpath_cmppath(struct puffs_usermount *, struct puffs_pathobj *,
600                            struct puffs_pathobj *, size_t, int);
601 void    puffs_stdpath_freepath(struct puffs_usermount *,struct puffs_pathobj *);
602
603 void    *puffs_path_walkcmp(struct puffs_usermount *,
604                             struct puffs_node *, void *);
605 void    *puffs_path_prefixadj(struct puffs_usermount *,
606                               struct puffs_node *, void *);
607 int     puffs_path_pcnbuild(struct puffs_usermount *,
608                             struct puffs_cn *, void *);
609 void    puffs_path_buildhash(struct puffs_usermount *, struct puffs_pathobj *);
610 void    puffs_set_pathbuild(struct puffs_usermount *, pu_pathbuild_fn); void    puffs_set_pathtransform(struct puffs_usermount *, pu_pathtransform_fn);
611 void    puffs_set_pathcmp(struct puffs_usermount *, pu_pathcmp_fn);
612 void    puffs_set_pathfree(struct puffs_usermount *, pu_pathfree_fn);
613 void    puffs_set_namemod(struct puffs_usermount *, pu_namemod_fn);
614
615 void    puffs_set_errnotify(struct puffs_usermount *, pu_errnotify_fn);
616 void    puffs_kernerr_log(struct puffs_usermount *, uint8_t, int,
617                           const char *, puffs_cookie_t);
618 void    puffs_kernerr_abort(struct puffs_usermount *, uint8_t, int,
619                             const char *, puffs_cookie_t);
620 void    puffs_set_prepost(struct puffs_usermount *,
621                           pu_prepost_fn, pu_prepost_fn);
622 void    puffs_set_cmap(struct puffs_usermount *, pu_cmap_fn);
623
624 /*
625  * Suspension
626  */
627
628 int     puffs_fs_suspend(struct puffs_usermount *);
629
630 /*
631  * Frame buffering
632  */
633
634 void    puffs_framev_init(struct puffs_usermount *,
635                           puffs_framev_readframe_fn,
636                           puffs_framev_writeframe_fn,
637                           puffs_framev_cmpframe_fn,
638                           puffs_framev_gotframe_fn,
639                           puffs_framev_fdnotify_fn);
640
641 struct puffs_framebuf   *puffs_framebuf_make(void);
642 void                    puffs_framebuf_destroy(struct puffs_framebuf *);
643 int                     puffs_framebuf_dup(struct puffs_framebuf *,
644                                            struct puffs_framebuf **);
645 void                    puffs_framebuf_recycle(struct puffs_framebuf *);
646 int                     puffs_framebuf_reserve_space(struct puffs_framebuf *,
647                                                      size_t);
648
649 int     puffs_framebuf_putdata(struct puffs_framebuf *, const void *, size_t);
650 int     puffs_framebuf_putdata_atoff(struct puffs_framebuf *, size_t,
651                                      const void *, size_t);
652 int     puffs_framebuf_getdata(struct puffs_framebuf *, void *, size_t);
653 int     puffs_framebuf_getdata_atoff(struct puffs_framebuf *, size_t,
654                                      void *, size_t);
655
656 size_t  puffs_framebuf_telloff(struct puffs_framebuf *);
657 size_t  puffs_framebuf_tellsize(struct puffs_framebuf *);
658 size_t  puffs_framebuf_remaining(struct puffs_framebuf *);
659 int     puffs_framebuf_seekset(struct puffs_framebuf *, size_t);
660 int     puffs_framebuf_getwindow(struct puffs_framebuf *, size_t,
661                                  void **, size_t *);
662
663 int     puffs_framev_enqueue_cc(struct puffs_cc *, int,
664                                 struct puffs_framebuf *, int);
665 int     puffs_framev_enqueue_cb(struct puffs_usermount *, int,
666                                 struct puffs_framebuf *,
667                                 puffs_framev_cb, void *, int);
668 int     puffs_framev_enqueue_justsend(struct puffs_usermount *, int,
669                                       struct puffs_framebuf *, int, int);
670 int     puffs_framev_enqueue_directreceive(struct puffs_cc *, int,
671                                            struct puffs_framebuf *, int);
672 int     puffs_framev_enqueue_directsend(struct puffs_cc *, int,
673                                            struct puffs_framebuf *, int);
674 int     puffs_framev_enqueue_waitevent(struct puffs_cc *, int, int *);
675 int     puffs_framev_framebuf_ccpromote(struct puffs_framebuf *,
676                                         struct puffs_cc *);
677
678 int     puffs_framev_addfd(struct puffs_usermount *, int, int);
679 int     puffs_framev_enablefd(struct puffs_usermount *, int, int);
680 int     puffs_framev_disablefd(struct puffs_usermount *, int, int);
681 int     puffs_framev_removefd(struct puffs_usermount *, int, int);
682 void    puffs_framev_removeonclose(struct puffs_usermount *, int, int);
683 void    puffs_framev_unmountonclose(struct puffs_usermount *, int, int);
684
685 __END_DECLS
686
687 #endif /* _PUFFS_H_ */