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