Project

General

Profile

Statistics
| Revision:

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_ */