1272343Sngie/* $NetBSD: dtfs.h,v 1.2 2010/07/14 13:09:52 pooka Exp $ */ 2272343Sngie 3272343Sngie/* 4272343Sngie * Copyright (c) 2006 Antti Kantee. All Rights Reserved. 5272343Sngie * 6272343Sngie * Redistribution and use in source and binary forms, with or without 7272343Sngie * modification, are permitted provided that the following conditions 8272343Sngie * are met: 9272343Sngie * 1. Redistributions of source code must retain the above copyright 10272343Sngie * notice, this list of conditions and the following disclaimer. 11272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 12272343Sngie * notice, this list of conditions and the following disclaimer in the 13272343Sngie * documentation and/or other materials provided with the distribution. 14272343Sngie * 15272343Sngie * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16272343Sngie * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17272343Sngie * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18272343Sngie * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19272343Sngie * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20272343Sngie * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21272343Sngie * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22272343Sngie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23272343Sngie * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24272343Sngie * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25272343Sngie * SUCH DAMAGE. 26272343Sngie */ 27272343Sngie 28272343Sngie#ifndef DTFS_H_ 29272343Sngie#define DTFS_H_ 30272343Sngie 31272343Sngie#include <sys/types.h> 32272343Sngie 33272343Sngie#include <puffs.h> 34272343Sngie 35272343SngiePUFFSOP_PROTOS(dtfs); 36272343Sngieint dtfs_domount(struct puffs_usermount *, const char *); 37272343Sngie 38272343Sngie#define DTFS_BLOCKSHIFT (12) 39272343Sngie#define DTFS_BLOCKSIZE (1<<DTFS_BLOCKSHIFT) 40272343Sngie 41272343Sngie#define ROUNDUP(a,b) ((a) & ((b)-1)) 42272343Sngie#define BLOCKNUM(a,b) (((a) & ~((1<<(b))-1)) >> (b)) 43272343Sngie 44272343Sngiestruct dtfs_fid; 45272343Sngiestruct dtfs_mount { 46272343Sngie ino_t dtm_nextfileid; /* running number for file id */ 47272343Sngie 48272343Sngie size_t dtm_fsizes; /* sum of file sizes in bytes */ 49272343Sngie fsfilcnt_t dtm_nfiles; /* number of files */ 50272343Sngie 51272343Sngie LIST_HEAD(, dtfs_poll) dtm_pollent; 52272343Sngie int dtm_needwakeup; 53272343Sngie vm_prot_t dtm_allowprot; 54272343Sngie}; 55272343Sngie 56272343Sngiestruct dtfs_file { 57272343Sngie union { 58272343Sngie struct { 59272343Sngie uint8_t **blocks; 60272343Sngie size_t numblocks; 61272343Sngie size_t datalen; 62272343Sngie } reg; 63272343Sngie struct { 64272343Sngie struct puffs_node *dotdot; 65272343Sngie LIST_HEAD(, dtfs_dirent) dirents; 66272343Sngie } dir; 67272343Sngie struct { 68272343Sngie char *target; 69272343Sngie } link; 70272343Sngie } u; 71272343Sngie#define df_blocks u.reg.blocks 72272343Sngie#define df_numblocks u.reg.numblocks 73272343Sngie#define df_datalen u.reg.datalen 74272343Sngie#define df_dotdot u.dir.dotdot 75272343Sngie#define df_dirents u.dir.dirents 76272343Sngie#define df_linktarget u.link.target 77272343Sngie}; 78272343Sngie 79272343Sngiestruct dtfs_dirent { 80272343Sngie struct puffs_node *dfd_node; 81272343Sngie struct puffs_node *dfd_parent; 82272343Sngie char *dfd_name; 83272343Sngie size_t dfd_namelen; 84272343Sngie 85272343Sngie LIST_ENTRY(dtfs_dirent) dfd_entries; 86272343Sngie}; 87272343Sngie 88272343Sngiestruct dtfs_fid { 89272343Sngie struct puffs_node *dfid_addr; 90272343Sngie 91272343Sngie /* best^Wsome-effort extra sanity check */ 92272343Sngie ino_t dfid_fileid; 93272343Sngie u_long dfid_gen; 94272343Sngie}; 95272343Sngie#define DTFS_FIDSIZE (sizeof(struct dtfs_fid)) 96272343Sngie 97272343Sngiestruct dtfs_poll { 98272343Sngie struct puffs_cc *dp_pcc; 99272343Sngie LIST_ENTRY(dtfs_poll) dp_entries; 100272343Sngie}; 101272343Sngie 102272343Sngiestruct puffs_node * dtfs_genfile(struct puffs_node *, 103272343Sngie const struct puffs_cn *, enum vtype); 104272343Sngiestruct dtfs_file * dtfs_newdir(void); 105272343Sngiestruct dtfs_file * dtfs_newfile(void); 106272343Sngiestruct dtfs_dirent * dtfs_dirgetnth(struct dtfs_file *, int); 107272343Sngiestruct dtfs_dirent * dtfs_dirgetbyname(struct dtfs_file *, 108272343Sngie const char *, size_t); 109272343Sngie 110272343Sngievoid dtfs_nukenode(struct puffs_node *, struct puffs_node *, 111272343Sngie const char *, size_t); 112272343Sngievoid dtfs_freenode(struct puffs_node *); 113272343Sngievoid dtfs_setsize(struct puffs_node *, off_t); 114272343Sngie 115272343Sngievoid dtfs_adddent(struct puffs_node *, struct dtfs_dirent *); 116272343Sngievoid dtfs_removedent(struct puffs_node *, struct dtfs_dirent *); 117272343Sngie 118272343Sngievoid dtfs_baseattrs(struct vattr *, enum vtype, ino_t); 119272343Sngievoid dtfs_updatetimes(struct puffs_node *, int, int, int); 120272343Sngie 121272343Sngiebool dtfs_isunder(struct puffs_node *, struct puffs_node *); 122272343Sngie 123272343Sngie 124272343Sngie#define DTFS_CTOF(a) ((struct dtfs_file *)(((struct puffs_node *)a)->pn_data)) 125272343Sngie#define DTFS_PTOF(a) ((struct dtfs_file *)(a->pn_data)) 126272343Sngie 127272343Sngie#endif /* DTFS_H_ */ 128