1 /* $NetBSD: adosfs.h,v 1.13 2014/08/05 08:50:54 hannken Exp $ */ 2 3 /* 4 * Copyright (c) 1994 Christian E. Hopps 5 * Copyright (c) 1996 Matthias Scheler 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Christian E. Hopps. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #ifndef _ADOSFS_ADOSFS_H_ 35 #define _ADOSFS_ADOSFS_H_ 36 /* 37 * Arguments to mount amigados filesystems. 38 */ 39 struct adosfs_args { 40 char *fspec; /* blocks special holding the fs to mount */ 41 struct export_args30 _pad1; /* compat with old userland tools */ 42 uid_t uid; /* uid that owns adosfs files */ 43 gid_t gid; /* gid that owns adosfs files */ 44 mode_t mask; /* mask to be applied for adosfs perms */ 45 }; 46 47 #ifdef _KERNEL 48 #include <sys/mallocvar.h> 49 #include <miscfs/genfs/genfs_node.h> 50 51 MALLOC_DECLARE(M_ANODE); 52 53 /* 54 * Amigados datestamp. (from 1/1/1978 00:00:00 local) 55 */ 56 struct datestamp { 57 u_int32_t days; 58 u_int32_t mins; 59 u_int32_t ticks; /* 20000 * (ticks % 50) = useconds */ 60 /* ticks / 50 = seconds */ 61 }; 62 63 enum anode_type { AROOT, ADIR, AFILE, ALDIR, ALFILE, ASLINK }; 64 65 /* Maximum file/directory name */ 66 #define ADMAXNAMELEN 30 67 68 /* 69 * similar to inode's, we use to represent: 70 * the root dir, reg dirs, reg files and extension blocks 71 * note the ``tab'' is a hash table for r/d, and a data block 72 * table for f/e. it is always ANODETABSZ(ap) bytes in size. 73 */ 74 struct anode { 75 struct genfs_node gnode; 76 enum anode_type type; 77 char name[ADMAXNAMELEN+1]; /* (r/d/f) name for object */ 78 struct datestamp mtimev; /* (r) volume modified */ 79 struct datestamp created; /* (r) volume created */ 80 struct datestamp mtime; /* (r/d/f) last modified */ 81 struct adosfsmount *amp; /* owner file system */ 82 struct vnode *vp; /* owner vnode */ 83 u_long fsize; /* (f) size of file in bytes */ 84 u_long block; /* block num */ 85 u_long pblock; /* (d/f/e) parent block */ 86 u_long hashf; /* (d/f) hash forward */ 87 u_long extb; /* (f/e) extension block number */ 88 u_long linkto; /* (hd/hf) header this link points at */ 89 u_long linknext; /* (d/f/hd/hf) next link (or head) in chain */ 90 u_long lastlindblk; /* (f/hf) last logical indirect block */ 91 u_long lastindblk; /* (f/hf) last indirect block read */ 92 u_long *tab; /* (r/d) hash table */ 93 int *tabi; /* (r/d) table info */ 94 int ntabent; /* (r/d) number of entries in table */ 95 int nwords; /* size of blocks in long words */ 96 int adprot; /* (d/f) amigados protection bits */ 97 uid_t uid; /* (d/f) uid of directory/file */ 98 gid_t gid; /* (d/f) gid of directory/file */ 99 int flags; /* misc flags */ 100 char *slinkto; /* name of file or dir */ 101 }; 102 #define VTOA(vp) ((struct anode *)(vp)->v_data) 103 #define ATOV(ap) ((ap)->vp) 104 #define ANODETABSZ(ap) (((ap)->nwords - 56) * sizeof(long)) 105 #define ANODETABENT(ap) ((ap)->nwords - 56) 106 #define ANODENDATBLKENT(ap) ((ap)->nwords - 56) 107 108 /* 109 * mount data 110 */ 111 #define ANODEHASHSZ (512) 112 113 struct adosfsmount { 114 struct mount *mp; /* owner mount */ 115 u_int32_t dostype; /* type of volume */ 116 u_long rootb; /* root block number */ 117 u_long bsize; /* size of blocks */ 118 u_long nwords; /* size of blocks in long words */ 119 u_long dbsize; /* data bytes per block */ 120 uid_t uid; /* uid of mounting user */ 121 gid_t gid; /* gid of mounting user */ 122 u_long mask; /* mode mask */ 123 struct vnode *devvp; /* blk device mounted on */ 124 struct vnode *rootvp; /* out root vnode */ 125 u_long *bitmap; /* allocation bitmap */ 126 u_long numblks; /* number of usable blocks */ 127 u_long freeblks; /* number of free blocks */ 128 }; 129 130 #define VFSTOADOSFS(mp) ((struct adosfsmount *)(mp)->mnt_data) 131 132 #define IS_FFS(amp) ((amp)->dostype & 1) 133 #define IS_INTER(amp) (((amp)->dostype & 7) > 1) 134 135 /* 136 * AmigaDOS block stuff. 137 */ 138 #define BBOFF (0) 139 140 #define BPT_SHORT ((u_int32_t)2) 141 #define BPT_DATA ((u_int32_t)8) 142 #define BPT_LIST ((u_int32_t)16) 143 144 #define BST_RDIR ((u_int32_t)1) 145 #define BST_UDIR ((u_int32_t)2) 146 #define BST_SLINK ((u_int32_t)3) 147 #define BST_LDIR ((u_int32_t)4) 148 #define BST_FILE ((u_int32_t)-3) 149 #define BST_LFILE ((u_int32_t)-4) 150 151 #define OFS_DATA_OFFSET (24) 152 153 extern struct pool adosfs_node_pool; 154 155 /* 156 * utility protos 157 */ 158 #if BYTE_ORDER != BIG_ENDIAN 159 u_int32_t adoswordn(struct buf *, int); 160 #else 161 #define adoswordn(bp,wn) (*((u_int32_t *)(bp)->b_data + (wn))) 162 #endif 163 164 u_int32_t adoscksum(struct buf *, int); 165 int adoscaseequ(const u_char *, const u_char *, int, int); 166 int adoshash(const u_char *, int, int, int); 167 int adunixprot(int); 168 int adosfs_getblktype(struct adosfsmount *, struct buf *); 169 170 int adosfs_lookup(void *); 171 172 extern int (**adosfs_vnodeop_p)(void *); 173 174 /* Should print a vnode or the vnode-op's arguments? */ 175 #define advopprint(p) /* XXX */ 176 177 #endif /* _KERNEL */ 178 #endif /* _ADOSFS_ADOSFS_H_ */ 179