1*58d9a550Spooka /* $NetBSD: dtfs.h,v 1.2 2010/07/14 13:09:52 pooka Exp $ */ 23626443eSpooka 33626443eSpooka /* 43626443eSpooka * Copyright (c) 2006 Antti Kantee. All Rights Reserved. 53626443eSpooka * 63626443eSpooka * Redistribution and use in source and binary forms, with or without 73626443eSpooka * modification, are permitted provided that the following conditions 83626443eSpooka * are met: 93626443eSpooka * 1. Redistributions of source code must retain the above copyright 103626443eSpooka * notice, this list of conditions and the following disclaimer. 113626443eSpooka * 2. Redistributions in binary form must reproduce the above copyright 123626443eSpooka * notice, this list of conditions and the following disclaimer in the 133626443eSpooka * documentation and/or other materials provided with the distribution. 143626443eSpooka * 153626443eSpooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 163626443eSpooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 173626443eSpooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 183626443eSpooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 193626443eSpooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 203626443eSpooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 213626443eSpooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 223626443eSpooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 233626443eSpooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 243626443eSpooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 253626443eSpooka * SUCH DAMAGE. 263626443eSpooka */ 273626443eSpooka 283626443eSpooka #ifndef DTFS_H_ 293626443eSpooka #define DTFS_H_ 303626443eSpooka 313626443eSpooka #include <sys/types.h> 323626443eSpooka 333626443eSpooka #include <puffs.h> 343626443eSpooka 353626443eSpooka PUFFSOP_PROTOS(dtfs); 363626443eSpooka int dtfs_domount(struct puffs_usermount *, const char *); 373626443eSpooka 383626443eSpooka #define DTFS_BLOCKSHIFT (12) 393626443eSpooka #define DTFS_BLOCKSIZE (1<<DTFS_BLOCKSHIFT) 403626443eSpooka 413626443eSpooka #define ROUNDUP(a,b) ((a) & ((b)-1)) 423626443eSpooka #define BLOCKNUM(a,b) (((a) & ~((1<<(b))-1)) >> (b)) 433626443eSpooka 443626443eSpooka struct dtfs_fid; 453626443eSpooka struct dtfs_mount { 463626443eSpooka ino_t dtm_nextfileid; /* running number for file id */ 473626443eSpooka 483626443eSpooka size_t dtm_fsizes; /* sum of file sizes in bytes */ 493626443eSpooka fsfilcnt_t dtm_nfiles; /* number of files */ 503626443eSpooka 513626443eSpooka LIST_HEAD(, dtfs_poll) dtm_pollent; 523626443eSpooka int dtm_needwakeup; 533626443eSpooka vm_prot_t dtm_allowprot; 543626443eSpooka }; 553626443eSpooka 563626443eSpooka struct dtfs_file { 573626443eSpooka union { 583626443eSpooka struct { 593626443eSpooka uint8_t **blocks; 603626443eSpooka size_t numblocks; 613626443eSpooka size_t datalen; 623626443eSpooka } reg; 633626443eSpooka struct { 643626443eSpooka struct puffs_node *dotdot; 653626443eSpooka LIST_HEAD(, dtfs_dirent) dirents; 663626443eSpooka } dir; 673626443eSpooka struct { 683626443eSpooka char *target; 693626443eSpooka } link; 703626443eSpooka } u; 713626443eSpooka #define df_blocks u.reg.blocks 723626443eSpooka #define df_numblocks u.reg.numblocks 733626443eSpooka #define df_datalen u.reg.datalen 743626443eSpooka #define df_dotdot u.dir.dotdot 753626443eSpooka #define df_dirents u.dir.dirents 763626443eSpooka #define df_linktarget u.link.target 773626443eSpooka }; 783626443eSpooka 793626443eSpooka struct dtfs_dirent { 803626443eSpooka struct puffs_node *dfd_node; 813626443eSpooka struct puffs_node *dfd_parent; 823626443eSpooka char *dfd_name; 833626443eSpooka size_t dfd_namelen; 843626443eSpooka 853626443eSpooka LIST_ENTRY(dtfs_dirent) dfd_entries; 863626443eSpooka }; 873626443eSpooka 883626443eSpooka struct dtfs_fid { 893626443eSpooka struct puffs_node *dfid_addr; 903626443eSpooka 913626443eSpooka /* best^Wsome-effort extra sanity check */ 923626443eSpooka ino_t dfid_fileid; 933626443eSpooka u_long dfid_gen; 943626443eSpooka }; 953626443eSpooka #define DTFS_FIDSIZE (sizeof(struct dtfs_fid)) 963626443eSpooka 973626443eSpooka struct dtfs_poll { 983626443eSpooka struct puffs_cc *dp_pcc; 993626443eSpooka LIST_ENTRY(dtfs_poll) dp_entries; 1003626443eSpooka }; 1013626443eSpooka 1023626443eSpooka struct puffs_node * dtfs_genfile(struct puffs_node *, 1033626443eSpooka const struct puffs_cn *, enum vtype); 1043626443eSpooka struct dtfs_file * dtfs_newdir(void); 1053626443eSpooka struct dtfs_file * dtfs_newfile(void); 1063626443eSpooka struct dtfs_dirent * dtfs_dirgetnth(struct dtfs_file *, int); 1073626443eSpooka struct dtfs_dirent * dtfs_dirgetbyname(struct dtfs_file *, 1083626443eSpooka const char *, size_t); 1093626443eSpooka 1103626443eSpooka void dtfs_nukenode(struct puffs_node *, struct puffs_node *, 1113626443eSpooka const char *, size_t); 1123626443eSpooka void dtfs_freenode(struct puffs_node *); 1133626443eSpooka void dtfs_setsize(struct puffs_node *, off_t); 1143626443eSpooka 1153626443eSpooka void dtfs_adddent(struct puffs_node *, struct dtfs_dirent *); 1163626443eSpooka void dtfs_removedent(struct puffs_node *, struct dtfs_dirent *); 1173626443eSpooka 1183626443eSpooka void dtfs_baseattrs(struct vattr *, enum vtype, ino_t); 1193626443eSpooka void dtfs_updatetimes(struct puffs_node *, int, int, int); 1203626443eSpooka 121*58d9a550Spooka bool dtfs_isunder(struct puffs_node *, struct puffs_node *); 122*58d9a550Spooka 1233626443eSpooka 1243626443eSpooka #define DTFS_CTOF(a) ((struct dtfs_file *)(((struct puffs_node *)a)->pn_data)) 1253626443eSpooka #define DTFS_PTOF(a) ((struct dtfs_file *)(a->pn_data)) 1263626443eSpooka 1273626443eSpooka #endif /* DTFS_H_ */ 128