1*57718be8SEnji Cooper /* $NetBSD: dtfs.h,v 1.2 2010/07/14 13:09:52 pooka Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /* 4*57718be8SEnji Cooper * Copyright (c) 2006 Antti Kantee. All Rights Reserved. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 7*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 8*57718be8SEnji Cooper * are met: 9*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 10*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 11*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 12*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 13*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 14*57718be8SEnji Cooper * 15*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16*57718be8SEnji Cooper * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17*57718be8SEnji Cooper * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18*57718be8SEnji Cooper * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*57718be8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*57718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21*57718be8SEnji Cooper * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*57718be8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*57718be8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*57718be8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*57718be8SEnji Cooper * SUCH DAMAGE. 26*57718be8SEnji Cooper */ 27*57718be8SEnji Cooper 28*57718be8SEnji Cooper #ifndef DTFS_H_ 29*57718be8SEnji Cooper #define DTFS_H_ 30*57718be8SEnji Cooper 31*57718be8SEnji Cooper #include <sys/types.h> 32*57718be8SEnji Cooper 33*57718be8SEnji Cooper #include <puffs.h> 34*57718be8SEnji Cooper 35*57718be8SEnji Cooper PUFFSOP_PROTOS(dtfs); 36*57718be8SEnji Cooper int dtfs_domount(struct puffs_usermount *, const char *); 37*57718be8SEnji Cooper 38*57718be8SEnji Cooper #define DTFS_BLOCKSHIFT (12) 39*57718be8SEnji Cooper #define DTFS_BLOCKSIZE (1<<DTFS_BLOCKSHIFT) 40*57718be8SEnji Cooper 41*57718be8SEnji Cooper #define ROUNDUP(a,b) ((a) & ((b)-1)) 42*57718be8SEnji Cooper #define BLOCKNUM(a,b) (((a) & ~((1<<(b))-1)) >> (b)) 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper struct dtfs_fid; 45*57718be8SEnji Cooper struct dtfs_mount { 46*57718be8SEnji Cooper ino_t dtm_nextfileid; /* running number for file id */ 47*57718be8SEnji Cooper 48*57718be8SEnji Cooper size_t dtm_fsizes; /* sum of file sizes in bytes */ 49*57718be8SEnji Cooper fsfilcnt_t dtm_nfiles; /* number of files */ 50*57718be8SEnji Cooper 51*57718be8SEnji Cooper LIST_HEAD(, dtfs_poll) dtm_pollent; 52*57718be8SEnji Cooper int dtm_needwakeup; 53*57718be8SEnji Cooper vm_prot_t dtm_allowprot; 54*57718be8SEnji Cooper }; 55*57718be8SEnji Cooper 56*57718be8SEnji Cooper struct dtfs_file { 57*57718be8SEnji Cooper union { 58*57718be8SEnji Cooper struct { 59*57718be8SEnji Cooper uint8_t **blocks; 60*57718be8SEnji Cooper size_t numblocks; 61*57718be8SEnji Cooper size_t datalen; 62*57718be8SEnji Cooper } reg; 63*57718be8SEnji Cooper struct { 64*57718be8SEnji Cooper struct puffs_node *dotdot; 65*57718be8SEnji Cooper LIST_HEAD(, dtfs_dirent) dirents; 66*57718be8SEnji Cooper } dir; 67*57718be8SEnji Cooper struct { 68*57718be8SEnji Cooper char *target; 69*57718be8SEnji Cooper } link; 70*57718be8SEnji Cooper } u; 71*57718be8SEnji Cooper #define df_blocks u.reg.blocks 72*57718be8SEnji Cooper #define df_numblocks u.reg.numblocks 73*57718be8SEnji Cooper #define df_datalen u.reg.datalen 74*57718be8SEnji Cooper #define df_dotdot u.dir.dotdot 75*57718be8SEnji Cooper #define df_dirents u.dir.dirents 76*57718be8SEnji Cooper #define df_linktarget u.link.target 77*57718be8SEnji Cooper }; 78*57718be8SEnji Cooper 79*57718be8SEnji Cooper struct dtfs_dirent { 80*57718be8SEnji Cooper struct puffs_node *dfd_node; 81*57718be8SEnji Cooper struct puffs_node *dfd_parent; 82*57718be8SEnji Cooper char *dfd_name; 83*57718be8SEnji Cooper size_t dfd_namelen; 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper LIST_ENTRY(dtfs_dirent) dfd_entries; 86*57718be8SEnji Cooper }; 87*57718be8SEnji Cooper 88*57718be8SEnji Cooper struct dtfs_fid { 89*57718be8SEnji Cooper struct puffs_node *dfid_addr; 90*57718be8SEnji Cooper 91*57718be8SEnji Cooper /* best^Wsome-effort extra sanity check */ 92*57718be8SEnji Cooper ino_t dfid_fileid; 93*57718be8SEnji Cooper u_long dfid_gen; 94*57718be8SEnji Cooper }; 95*57718be8SEnji Cooper #define DTFS_FIDSIZE (sizeof(struct dtfs_fid)) 96*57718be8SEnji Cooper 97*57718be8SEnji Cooper struct dtfs_poll { 98*57718be8SEnji Cooper struct puffs_cc *dp_pcc; 99*57718be8SEnji Cooper LIST_ENTRY(dtfs_poll) dp_entries; 100*57718be8SEnji Cooper }; 101*57718be8SEnji Cooper 102*57718be8SEnji Cooper struct puffs_node * dtfs_genfile(struct puffs_node *, 103*57718be8SEnji Cooper const struct puffs_cn *, enum vtype); 104*57718be8SEnji Cooper struct dtfs_file * dtfs_newdir(void); 105*57718be8SEnji Cooper struct dtfs_file * dtfs_newfile(void); 106*57718be8SEnji Cooper struct dtfs_dirent * dtfs_dirgetnth(struct dtfs_file *, int); 107*57718be8SEnji Cooper struct dtfs_dirent * dtfs_dirgetbyname(struct dtfs_file *, 108*57718be8SEnji Cooper const char *, size_t); 109*57718be8SEnji Cooper 110*57718be8SEnji Cooper void dtfs_nukenode(struct puffs_node *, struct puffs_node *, 111*57718be8SEnji Cooper const char *, size_t); 112*57718be8SEnji Cooper void dtfs_freenode(struct puffs_node *); 113*57718be8SEnji Cooper void dtfs_setsize(struct puffs_node *, off_t); 114*57718be8SEnji Cooper 115*57718be8SEnji Cooper void dtfs_adddent(struct puffs_node *, struct dtfs_dirent *); 116*57718be8SEnji Cooper void dtfs_removedent(struct puffs_node *, struct dtfs_dirent *); 117*57718be8SEnji Cooper 118*57718be8SEnji Cooper void dtfs_baseattrs(struct vattr *, enum vtype, ino_t); 119*57718be8SEnji Cooper void dtfs_updatetimes(struct puffs_node *, int, int, int); 120*57718be8SEnji Cooper 121*57718be8SEnji Cooper bool dtfs_isunder(struct puffs_node *, struct puffs_node *); 122*57718be8SEnji Cooper 123*57718be8SEnji Cooper 124*57718be8SEnji Cooper #define DTFS_CTOF(a) ((struct dtfs_file *)(((struct puffs_node *)a)->pn_data)) 125*57718be8SEnji Cooper #define DTFS_PTOF(a) ((struct dtfs_file *)(a->pn_data)) 126*57718be8SEnji Cooper 127*57718be8SEnji Cooper #endif /* DTFS_H_ */ 128