1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * linux/fs/hfs/hfs.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 1995-1997 Paul H. Hargrove 5*4882a593Smuzhiyun * (C) 2003 Ardis Technologies <roman@ardistech.com> 6*4882a593Smuzhiyun * This file may be distributed under the terms of the GNU General Public License. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _HFS_H 10*4882a593Smuzhiyun #define _HFS_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* offsets to various blocks */ 13*4882a593Smuzhiyun #define HFS_DD_BLK 0 /* Driver Descriptor block */ 14*4882a593Smuzhiyun #define HFS_PMAP_BLK 1 /* First block of partition map */ 15*4882a593Smuzhiyun #define HFS_MDB_BLK 2 /* Block (w/i partition) of MDB */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* magic numbers for various disk blocks */ 18*4882a593Smuzhiyun #define HFS_DRVR_DESC_MAGIC 0x4552 /* "ER": driver descriptor map */ 19*4882a593Smuzhiyun #define HFS_OLD_PMAP_MAGIC 0x5453 /* "TS": old-type partition map */ 20*4882a593Smuzhiyun #define HFS_NEW_PMAP_MAGIC 0x504D /* "PM": new-type partition map */ 21*4882a593Smuzhiyun #define HFS_SUPER_MAGIC 0x4244 /* "BD": HFS MDB (super block) */ 22*4882a593Smuzhiyun #define HFS_MFS_SUPER_MAGIC 0xD2D7 /* MFS MDB (super block) */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* various FIXED size parameters */ 25*4882a593Smuzhiyun #define HFS_SECTOR_SIZE 512 /* size of an HFS sector */ 26*4882a593Smuzhiyun #define HFS_SECTOR_SIZE_BITS 9 /* log_2(HFS_SECTOR_SIZE) */ 27*4882a593Smuzhiyun #define HFS_NAMELEN 31 /* maximum length of an HFS filename */ 28*4882a593Smuzhiyun #define HFS_MAX_NAMELEN 128 29*4882a593Smuzhiyun #define HFS_MAX_VALENCE 32767U 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Meanings of the drAtrb field of the MDB, 32*4882a593Smuzhiyun * Reference: _Inside Macintosh: Files_ p. 2-61 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun #define HFS_SB_ATTRIB_HLOCK (1 << 7) 35*4882a593Smuzhiyun #define HFS_SB_ATTRIB_UNMNT (1 << 8) 36*4882a593Smuzhiyun #define HFS_SB_ATTRIB_SPARED (1 << 9) 37*4882a593Smuzhiyun #define HFS_SB_ATTRIB_INCNSTNT (1 << 11) 38*4882a593Smuzhiyun #define HFS_SB_ATTRIB_SLOCK (1 << 15) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* Some special File ID numbers */ 41*4882a593Smuzhiyun #define HFS_POR_CNID 1 /* Parent Of the Root */ 42*4882a593Smuzhiyun #define HFS_ROOT_CNID 2 /* ROOT directory */ 43*4882a593Smuzhiyun #define HFS_EXT_CNID 3 /* EXTents B-tree */ 44*4882a593Smuzhiyun #define HFS_CAT_CNID 4 /* CATalog B-tree */ 45*4882a593Smuzhiyun #define HFS_BAD_CNID 5 /* BAD blocks file */ 46*4882a593Smuzhiyun #define HFS_ALLOC_CNID 6 /* ALLOCation file (HFS+) */ 47*4882a593Smuzhiyun #define HFS_START_CNID 7 /* STARTup file (HFS+) */ 48*4882a593Smuzhiyun #define HFS_ATTR_CNID 8 /* ATTRibutes file (HFS+) */ 49*4882a593Smuzhiyun #define HFS_EXCH_CNID 15 /* ExchangeFiles temp id */ 50*4882a593Smuzhiyun #define HFS_FIRSTUSER_CNID 16 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* values for hfs_cat_rec.cdrType */ 53*4882a593Smuzhiyun #define HFS_CDR_DIR 0x01 /* folder (directory) */ 54*4882a593Smuzhiyun #define HFS_CDR_FIL 0x02 /* file */ 55*4882a593Smuzhiyun #define HFS_CDR_THD 0x03 /* folder (directory) thread */ 56*4882a593Smuzhiyun #define HFS_CDR_FTH 0x04 /* file thread */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* legal values for hfs_ext_key.FkType and hfs_file.fork */ 59*4882a593Smuzhiyun #define HFS_FK_DATA 0x00 60*4882a593Smuzhiyun #define HFS_FK_RSRC 0xFF 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* bits in hfs_fil_entry.Flags */ 63*4882a593Smuzhiyun #define HFS_FIL_LOCK 0x01 /* locked */ 64*4882a593Smuzhiyun #define HFS_FIL_THD 0x02 /* file thread */ 65*4882a593Smuzhiyun #define HFS_FIL_DOPEN 0x04 /* data fork open */ 66*4882a593Smuzhiyun #define HFS_FIL_ROPEN 0x08 /* resource fork open */ 67*4882a593Smuzhiyun #define HFS_FIL_DIR 0x10 /* directory (always clear) */ 68*4882a593Smuzhiyun #define HFS_FIL_NOCOPY 0x40 /* copy-protected file */ 69*4882a593Smuzhiyun #define HFS_FIL_USED 0x80 /* open */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* bits in hfs_dir_entry.Flags. dirflags is 16 bits. */ 72*4882a593Smuzhiyun #define HFS_DIR_LOCK 0x01 /* locked */ 73*4882a593Smuzhiyun #define HFS_DIR_THD 0x02 /* directory thread */ 74*4882a593Smuzhiyun #define HFS_DIR_INEXPFOLDER 0x04 /* in a shared area */ 75*4882a593Smuzhiyun #define HFS_DIR_MOUNTED 0x08 /* mounted */ 76*4882a593Smuzhiyun #define HFS_DIR_DIR 0x10 /* directory (always set) */ 77*4882a593Smuzhiyun #define HFS_DIR_EXPFOLDER 0x20 /* share point */ 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* bits hfs_finfo.fdFlags */ 80*4882a593Smuzhiyun #define HFS_FLG_INITED 0x0100 81*4882a593Smuzhiyun #define HFS_FLG_LOCKED 0x1000 82*4882a593Smuzhiyun #define HFS_FLG_INVISIBLE 0x4000 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /*======== HFS structures as they appear on the disk ========*/ 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* Pascal-style string of up to 31 characters */ 87*4882a593Smuzhiyun struct hfs_name { 88*4882a593Smuzhiyun u8 len; 89*4882a593Smuzhiyun u8 name[HFS_NAMELEN]; 90*4882a593Smuzhiyun } __packed; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct hfs_point { 93*4882a593Smuzhiyun __be16 v; 94*4882a593Smuzhiyun __be16 h; 95*4882a593Smuzhiyun } __packed; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct hfs_rect { 98*4882a593Smuzhiyun __be16 top; 99*4882a593Smuzhiyun __be16 left; 100*4882a593Smuzhiyun __be16 bottom; 101*4882a593Smuzhiyun __be16 right; 102*4882a593Smuzhiyun } __packed; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct hfs_finfo { 105*4882a593Smuzhiyun __be32 fdType; 106*4882a593Smuzhiyun __be32 fdCreator; 107*4882a593Smuzhiyun __be16 fdFlags; 108*4882a593Smuzhiyun struct hfs_point fdLocation; 109*4882a593Smuzhiyun __be16 fdFldr; 110*4882a593Smuzhiyun } __packed; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct hfs_fxinfo { 113*4882a593Smuzhiyun __be16 fdIconID; 114*4882a593Smuzhiyun u8 fdUnused[8]; 115*4882a593Smuzhiyun __be16 fdComment; 116*4882a593Smuzhiyun __be32 fdPutAway; 117*4882a593Smuzhiyun } __packed; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun struct hfs_dinfo { 120*4882a593Smuzhiyun struct hfs_rect frRect; 121*4882a593Smuzhiyun __be16 frFlags; 122*4882a593Smuzhiyun struct hfs_point frLocation; 123*4882a593Smuzhiyun __be16 frView; 124*4882a593Smuzhiyun } __packed; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct hfs_dxinfo { 127*4882a593Smuzhiyun struct hfs_point frScroll; 128*4882a593Smuzhiyun __be32 frOpenChain; 129*4882a593Smuzhiyun __be16 frUnused; 130*4882a593Smuzhiyun __be16 frComment; 131*4882a593Smuzhiyun __be32 frPutAway; 132*4882a593Smuzhiyun } __packed; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun union hfs_finder_info { 135*4882a593Smuzhiyun struct { 136*4882a593Smuzhiyun struct hfs_finfo finfo; 137*4882a593Smuzhiyun struct hfs_fxinfo fxinfo; 138*4882a593Smuzhiyun } file; 139*4882a593Smuzhiyun struct { 140*4882a593Smuzhiyun struct hfs_dinfo dinfo; 141*4882a593Smuzhiyun struct hfs_dxinfo dxinfo; 142*4882a593Smuzhiyun } dir; 143*4882a593Smuzhiyun } __packed; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* Cast to a pointer to a generic bkey */ 146*4882a593Smuzhiyun #define HFS_BKEY(X) (((void)((X)->KeyLen)), ((struct hfs_bkey *)(X))) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* The key used in the catalog b-tree: */ 149*4882a593Smuzhiyun struct hfs_cat_key { 150*4882a593Smuzhiyun u8 key_len; /* number of bytes in the key */ 151*4882a593Smuzhiyun u8 reserved; /* padding */ 152*4882a593Smuzhiyun __be32 ParID; /* CNID of the parent dir */ 153*4882a593Smuzhiyun struct hfs_name CName; /* The filename of the entry */ 154*4882a593Smuzhiyun } __packed; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* The key used in the extents b-tree: */ 157*4882a593Smuzhiyun struct hfs_ext_key { 158*4882a593Smuzhiyun u8 key_len; /* number of bytes in the key */ 159*4882a593Smuzhiyun u8 FkType; /* HFS_FK_{DATA,RSRC} */ 160*4882a593Smuzhiyun __be32 FNum; /* The File ID of the file */ 161*4882a593Smuzhiyun __be16 FABN; /* allocation blocks number*/ 162*4882a593Smuzhiyun } __packed; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun typedef union hfs_btree_key { 165*4882a593Smuzhiyun u8 key_len; /* number of bytes in the key */ 166*4882a593Smuzhiyun struct hfs_cat_key cat; 167*4882a593Smuzhiyun struct hfs_ext_key ext; 168*4882a593Smuzhiyun } hfs_btree_key; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define HFS_MAX_CAT_KEYLEN (sizeof(struct hfs_cat_key) - sizeof(u8)) 171*4882a593Smuzhiyun #define HFS_MAX_EXT_KEYLEN (sizeof(struct hfs_ext_key) - sizeof(u8)) 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun typedef union hfs_btree_key btree_key; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct hfs_extent { 176*4882a593Smuzhiyun __be16 block; 177*4882a593Smuzhiyun __be16 count; 178*4882a593Smuzhiyun }; 179*4882a593Smuzhiyun typedef struct hfs_extent hfs_extent_rec[3]; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* The catalog record for a file */ 182*4882a593Smuzhiyun struct hfs_cat_file { 183*4882a593Smuzhiyun s8 type; /* The type of entry */ 184*4882a593Smuzhiyun u8 reserved; 185*4882a593Smuzhiyun u8 Flags; /* Flags such as read-only */ 186*4882a593Smuzhiyun s8 Typ; /* file version number = 0 */ 187*4882a593Smuzhiyun struct hfs_finfo UsrWds; /* data used by the Finder */ 188*4882a593Smuzhiyun __be32 FlNum; /* The CNID */ 189*4882a593Smuzhiyun __be16 StBlk; /* obsolete */ 190*4882a593Smuzhiyun __be32 LgLen; /* The logical EOF of the data fork*/ 191*4882a593Smuzhiyun __be32 PyLen; /* The physical EOF of the data fork */ 192*4882a593Smuzhiyun __be16 RStBlk; /* obsolete */ 193*4882a593Smuzhiyun __be32 RLgLen; /* The logical EOF of the rsrc fork */ 194*4882a593Smuzhiyun __be32 RPyLen; /* The physical EOF of the rsrc fork */ 195*4882a593Smuzhiyun __be32 CrDat; /* The creation date */ 196*4882a593Smuzhiyun __be32 MdDat; /* The modified date */ 197*4882a593Smuzhiyun __be32 BkDat; /* The last backup date */ 198*4882a593Smuzhiyun struct hfs_fxinfo FndrInfo; /* more data for the Finder */ 199*4882a593Smuzhiyun __be16 ClpSize; /* number of bytes to allocate 200*4882a593Smuzhiyun when extending files */ 201*4882a593Smuzhiyun hfs_extent_rec ExtRec; /* first extent record 202*4882a593Smuzhiyun for the data fork */ 203*4882a593Smuzhiyun hfs_extent_rec RExtRec; /* first extent record 204*4882a593Smuzhiyun for the resource fork */ 205*4882a593Smuzhiyun u32 Resrv; /* reserved by Apple */ 206*4882a593Smuzhiyun } __packed; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /* the catalog record for a directory */ 209*4882a593Smuzhiyun struct hfs_cat_dir { 210*4882a593Smuzhiyun s8 type; /* The type of entry */ 211*4882a593Smuzhiyun u8 reserved; 212*4882a593Smuzhiyun __be16 Flags; /* flags */ 213*4882a593Smuzhiyun __be16 Val; /* Valence: number of files and 214*4882a593Smuzhiyun dirs in the directory */ 215*4882a593Smuzhiyun __be32 DirID; /* The CNID */ 216*4882a593Smuzhiyun __be32 CrDat; /* The creation date */ 217*4882a593Smuzhiyun __be32 MdDat; /* The modification date */ 218*4882a593Smuzhiyun __be32 BkDat; /* The last backup date */ 219*4882a593Smuzhiyun struct hfs_dinfo UsrInfo; /* data used by the Finder */ 220*4882a593Smuzhiyun struct hfs_dxinfo FndrInfo; /* more data used by Finder */ 221*4882a593Smuzhiyun u8 Resrv[16]; /* reserved by Apple */ 222*4882a593Smuzhiyun } __packed; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* the catalog record for a thread */ 225*4882a593Smuzhiyun struct hfs_cat_thread { 226*4882a593Smuzhiyun s8 type; /* The type of entry */ 227*4882a593Smuzhiyun u8 reserved[9]; /* reserved by Apple */ 228*4882a593Smuzhiyun __be32 ParID; /* CNID of parent directory */ 229*4882a593Smuzhiyun struct hfs_name CName; /* The name of this entry */ 230*4882a593Smuzhiyun } __packed; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* A catalog tree record */ 233*4882a593Smuzhiyun typedef union hfs_cat_rec { 234*4882a593Smuzhiyun s8 type; /* The type of entry */ 235*4882a593Smuzhiyun struct hfs_cat_file file; 236*4882a593Smuzhiyun struct hfs_cat_dir dir; 237*4882a593Smuzhiyun struct hfs_cat_thread thread; 238*4882a593Smuzhiyun } hfs_cat_rec; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun struct hfs_mdb { 241*4882a593Smuzhiyun __be16 drSigWord; /* Signature word indicating fs type */ 242*4882a593Smuzhiyun __be32 drCrDate; /* fs creation date/time */ 243*4882a593Smuzhiyun __be32 drLsMod; /* fs modification date/time */ 244*4882a593Smuzhiyun __be16 drAtrb; /* fs attributes */ 245*4882a593Smuzhiyun __be16 drNmFls; /* number of files in root directory */ 246*4882a593Smuzhiyun __be16 drVBMSt; /* location (in 512-byte blocks) 247*4882a593Smuzhiyun of the volume bitmap */ 248*4882a593Smuzhiyun __be16 drAllocPtr; /* location (in allocation blocks) 249*4882a593Smuzhiyun to begin next allocation search */ 250*4882a593Smuzhiyun __be16 drNmAlBlks; /* number of allocation blocks */ 251*4882a593Smuzhiyun __be32 drAlBlkSiz; /* bytes in an allocation block */ 252*4882a593Smuzhiyun __be32 drClpSiz; /* clumpsize, the number of bytes to 253*4882a593Smuzhiyun allocate when extending a file */ 254*4882a593Smuzhiyun __be16 drAlBlSt; /* location (in 512-byte blocks) 255*4882a593Smuzhiyun of the first allocation block */ 256*4882a593Smuzhiyun __be32 drNxtCNID; /* CNID to assign to the next 257*4882a593Smuzhiyun file or directory created */ 258*4882a593Smuzhiyun __be16 drFreeBks; /* number of free allocation blocks */ 259*4882a593Smuzhiyun u8 drVN[28]; /* the volume label */ 260*4882a593Smuzhiyun __be32 drVolBkUp; /* fs backup date/time */ 261*4882a593Smuzhiyun __be16 drVSeqNum; /* backup sequence number */ 262*4882a593Smuzhiyun __be32 drWrCnt; /* fs write count */ 263*4882a593Smuzhiyun __be32 drXTClpSiz; /* clumpsize for the extents B-tree */ 264*4882a593Smuzhiyun __be32 drCTClpSiz; /* clumpsize for the catalog B-tree */ 265*4882a593Smuzhiyun __be16 drNmRtDirs; /* number of directories in 266*4882a593Smuzhiyun the root directory */ 267*4882a593Smuzhiyun __be32 drFilCnt; /* number of files in the fs */ 268*4882a593Smuzhiyun __be32 drDirCnt; /* number of directories in the fs */ 269*4882a593Smuzhiyun u8 drFndrInfo[32]; /* data used by the Finder */ 270*4882a593Smuzhiyun __be16 drEmbedSigWord; /* embedded volume signature */ 271*4882a593Smuzhiyun __be32 drEmbedExtent; /* starting block number (xdrStABN) 272*4882a593Smuzhiyun and number of allocation blocks 273*4882a593Smuzhiyun (xdrNumABlks) occupied by embedded 274*4882a593Smuzhiyun volume */ 275*4882a593Smuzhiyun __be32 drXTFlSize; /* bytes in the extents B-tree */ 276*4882a593Smuzhiyun hfs_extent_rec drXTExtRec; /* extents B-tree's first 3 extents */ 277*4882a593Smuzhiyun __be32 drCTFlSize; /* bytes in the catalog B-tree */ 278*4882a593Smuzhiyun hfs_extent_rec drCTExtRec; /* catalog B-tree's first 3 extents */ 279*4882a593Smuzhiyun } __packed; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /*======== Data structures kept in memory ========*/ 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun struct hfs_readdir_data { 284*4882a593Smuzhiyun struct list_head list; 285*4882a593Smuzhiyun struct file *file; 286*4882a593Smuzhiyun struct hfs_cat_key key; 287*4882a593Smuzhiyun }; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun #endif 290