11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/fs/hfs/hfs.h 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 1995-1997 Paul H. Hargrove 51da177e4SLinus Torvalds * (C) 2003 Ardis Technologies <roman@ardistech.com> 61da177e4SLinus Torvalds * This file may be distributed under the terms of the GNU General Public License. 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #ifndef _HFS_H 101da177e4SLinus Torvalds #define _HFS_H 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds /* offsets to various blocks */ 131da177e4SLinus Torvalds #define HFS_DD_BLK 0 /* Driver Descriptor block */ 141da177e4SLinus Torvalds #define HFS_PMAP_BLK 1 /* First block of partition map */ 151da177e4SLinus Torvalds #define HFS_MDB_BLK 2 /* Block (w/i partition) of MDB */ 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds /* magic numbers for various disk blocks */ 181da177e4SLinus Torvalds #define HFS_DRVR_DESC_MAGIC 0x4552 /* "ER": driver descriptor map */ 191da177e4SLinus Torvalds #define HFS_OLD_PMAP_MAGIC 0x5453 /* "TS": old-type partition map */ 201da177e4SLinus Torvalds #define HFS_NEW_PMAP_MAGIC 0x504D /* "PM": new-type partition map */ 211da177e4SLinus Torvalds #define HFS_SUPER_MAGIC 0x4244 /* "BD": HFS MDB (super block) */ 221da177e4SLinus Torvalds #define HFS_MFS_SUPER_MAGIC 0xD2D7 /* MFS MDB (super block) */ 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds /* various FIXED size parameters */ 251da177e4SLinus Torvalds #define HFS_SECTOR_SIZE 512 /* size of an HFS sector */ 261da177e4SLinus Torvalds #define HFS_SECTOR_SIZE_BITS 9 /* log_2(HFS_SECTOR_SIZE) */ 271da177e4SLinus Torvalds #define HFS_NAMELEN 31 /* maximum length of an HFS filename */ 28328b9227SRoman Zippel #define HFS_MAX_NAMELEN 128 291da177e4SLinus Torvalds #define HFS_MAX_VALENCE 32767U 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /* Meanings of the drAtrb field of the MDB, 321da177e4SLinus Torvalds * Reference: _Inside Macintosh: Files_ p. 2-61 331da177e4SLinus Torvalds */ 341da177e4SLinus Torvalds #define HFS_SB_ATTRIB_HLOCK (1 << 7) 351da177e4SLinus Torvalds #define HFS_SB_ATTRIB_UNMNT (1 << 8) 361da177e4SLinus Torvalds #define HFS_SB_ATTRIB_SPARED (1 << 9) 371da177e4SLinus Torvalds #define HFS_SB_ATTRIB_INCNSTNT (1 << 11) 381da177e4SLinus Torvalds #define HFS_SB_ATTRIB_SLOCK (1 << 15) 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds /* Some special File ID numbers */ 411da177e4SLinus Torvalds #define HFS_POR_CNID 1 /* Parent Of the Root */ 421da177e4SLinus Torvalds #define HFS_ROOT_CNID 2 /* ROOT directory */ 431da177e4SLinus Torvalds #define HFS_EXT_CNID 3 /* EXTents B-tree */ 441da177e4SLinus Torvalds #define HFS_CAT_CNID 4 /* CATalog B-tree */ 451da177e4SLinus Torvalds #define HFS_BAD_CNID 5 /* BAD blocks file */ 461da177e4SLinus Torvalds #define HFS_ALLOC_CNID 6 /* ALLOCation file (HFS+) */ 471da177e4SLinus Torvalds #define HFS_START_CNID 7 /* STARTup file (HFS+) */ 481da177e4SLinus Torvalds #define HFS_ATTR_CNID 8 /* ATTRibutes file (HFS+) */ 491da177e4SLinus Torvalds #define HFS_EXCH_CNID 15 /* ExchangeFiles temp id */ 501da177e4SLinus Torvalds #define HFS_FIRSTUSER_CNID 16 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds /* values for hfs_cat_rec.cdrType */ 531da177e4SLinus Torvalds #define HFS_CDR_DIR 0x01 /* folder (directory) */ 541da177e4SLinus Torvalds #define HFS_CDR_FIL 0x02 /* file */ 551da177e4SLinus Torvalds #define HFS_CDR_THD 0x03 /* folder (directory) thread */ 561da177e4SLinus Torvalds #define HFS_CDR_FTH 0x04 /* file thread */ 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds /* legal values for hfs_ext_key.FkType and hfs_file.fork */ 591da177e4SLinus Torvalds #define HFS_FK_DATA 0x00 601da177e4SLinus Torvalds #define HFS_FK_RSRC 0xFF 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /* bits in hfs_fil_entry.Flags */ 631da177e4SLinus Torvalds #define HFS_FIL_LOCK 0x01 /* locked */ 641da177e4SLinus Torvalds #define HFS_FIL_THD 0x02 /* file thread */ 651da177e4SLinus Torvalds #define HFS_FIL_DOPEN 0x04 /* data fork open */ 661da177e4SLinus Torvalds #define HFS_FIL_ROPEN 0x08 /* resource fork open */ 671da177e4SLinus Torvalds #define HFS_FIL_DIR 0x10 /* directory (always clear) */ 681da177e4SLinus Torvalds #define HFS_FIL_NOCOPY 0x40 /* copy-protected file */ 691da177e4SLinus Torvalds #define HFS_FIL_USED 0x80 /* open */ 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds /* bits in hfs_dir_entry.Flags. dirflags is 16 bits. */ 721da177e4SLinus Torvalds #define HFS_DIR_LOCK 0x01 /* locked */ 731da177e4SLinus Torvalds #define HFS_DIR_THD 0x02 /* directory thread */ 741da177e4SLinus Torvalds #define HFS_DIR_INEXPFOLDER 0x04 /* in a shared area */ 751da177e4SLinus Torvalds #define HFS_DIR_MOUNTED 0x08 /* mounted */ 761da177e4SLinus Torvalds #define HFS_DIR_DIR 0x10 /* directory (always set) */ 771da177e4SLinus Torvalds #define HFS_DIR_EXPFOLDER 0x20 /* share point */ 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds /* bits hfs_finfo.fdFlags */ 801da177e4SLinus Torvalds #define HFS_FLG_INITED 0x0100 811da177e4SLinus Torvalds #define HFS_FLG_LOCKED 0x1000 821da177e4SLinus Torvalds #define HFS_FLG_INVISIBLE 0x4000 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds /*======== HFS structures as they appear on the disk ========*/ 851da177e4SLinus Torvalds 861da177e4SLinus Torvalds /* Pascal-style string of up to 31 characters */ 871da177e4SLinus Torvalds struct hfs_name { 881da177e4SLinus Torvalds u8 len; 891da177e4SLinus Torvalds u8 name[HFS_NAMELEN]; 901da177e4SLinus Torvalds } __packed; 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds struct hfs_point { 931da177e4SLinus Torvalds __be16 v; 941da177e4SLinus Torvalds __be16 h; 951da177e4SLinus Torvalds } __packed; 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds struct hfs_rect { 981da177e4SLinus Torvalds __be16 top; 991da177e4SLinus Torvalds __be16 left; 1001da177e4SLinus Torvalds __be16 bottom; 1011da177e4SLinus Torvalds __be16 right; 1021da177e4SLinus Torvalds } __packed; 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds struct hfs_finfo { 1051da177e4SLinus Torvalds __be32 fdType; 1061da177e4SLinus Torvalds __be32 fdCreator; 1071da177e4SLinus Torvalds __be16 fdFlags; 1081da177e4SLinus Torvalds struct hfs_point fdLocation; 1091da177e4SLinus Torvalds __be16 fdFldr; 1101da177e4SLinus Torvalds } __packed; 1111da177e4SLinus Torvalds 1121da177e4SLinus Torvalds struct hfs_fxinfo { 1131da177e4SLinus Torvalds __be16 fdIconID; 1141da177e4SLinus Torvalds u8 fdUnused[8]; 1151da177e4SLinus Torvalds __be16 fdComment; 1161da177e4SLinus Torvalds __be32 fdPutAway; 1171da177e4SLinus Torvalds } __packed; 1181da177e4SLinus Torvalds 1191da177e4SLinus Torvalds struct hfs_dinfo { 1201da177e4SLinus Torvalds struct hfs_rect frRect; 1211da177e4SLinus Torvalds __be16 frFlags; 1221da177e4SLinus Torvalds struct hfs_point frLocation; 1231da177e4SLinus Torvalds __be16 frView; 1241da177e4SLinus Torvalds } __packed; 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds struct hfs_dxinfo { 1271da177e4SLinus Torvalds struct hfs_point frScroll; 1281da177e4SLinus Torvalds __be32 frOpenChain; 1291da177e4SLinus Torvalds __be16 frUnused; 1301da177e4SLinus Torvalds __be16 frComment; 1311da177e4SLinus Torvalds __be32 frPutAway; 1321da177e4SLinus Torvalds } __packed; 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds union hfs_finder_info { 1351da177e4SLinus Torvalds struct { 1361da177e4SLinus Torvalds struct hfs_finfo finfo; 1371da177e4SLinus Torvalds struct hfs_fxinfo fxinfo; 1381da177e4SLinus Torvalds } file; 1391da177e4SLinus Torvalds struct { 1401da177e4SLinus Torvalds struct hfs_dinfo dinfo; 1411da177e4SLinus Torvalds struct hfs_dxinfo dxinfo; 1421da177e4SLinus Torvalds } dir; 1431da177e4SLinus Torvalds } __packed; 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds /* Cast to a pointer to a generic bkey */ 1461da177e4SLinus Torvalds #define HFS_BKEY(X) (((void)((X)->KeyLen)), ((struct hfs_bkey *)(X))) 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds /* The key used in the catalog b-tree: */ 1491da177e4SLinus Torvalds struct hfs_cat_key { 1501da177e4SLinus Torvalds u8 key_len; /* number of bytes in the key */ 1511da177e4SLinus Torvalds u8 reserved; /* padding */ 1521da177e4SLinus Torvalds __be32 ParID; /* CNID of the parent dir */ 1531da177e4SLinus Torvalds struct hfs_name CName; /* The filename of the entry */ 1541da177e4SLinus Torvalds } __packed; 1551da177e4SLinus Torvalds 1561da177e4SLinus Torvalds /* The key used in the extents b-tree: */ 1571da177e4SLinus Torvalds struct hfs_ext_key { 1581da177e4SLinus Torvalds u8 key_len; /* number of bytes in the key */ 1591da177e4SLinus Torvalds u8 FkType; /* HFS_FK_{DATA,RSRC} */ 1601da177e4SLinus Torvalds __be32 FNum; /* The File ID of the file */ 1611da177e4SLinus Torvalds __be16 FABN; /* allocation blocks number*/ 1621da177e4SLinus Torvalds } __packed; 1631da177e4SLinus Torvalds 1641da177e4SLinus Torvalds typedef union hfs_btree_key { 1651da177e4SLinus Torvalds u8 key_len; /* number of bytes in the key */ 1661da177e4SLinus Torvalds struct hfs_cat_key cat; 1671da177e4SLinus Torvalds struct hfs_ext_key ext; 1681da177e4SLinus Torvalds } hfs_btree_key; 1691da177e4SLinus Torvalds 170*cf059462SEric Sandeen #define HFS_MAX_CAT_KEYLEN (sizeof(struct hfs_cat_key) - sizeof(u8)) 171*cf059462SEric Sandeen #define HFS_MAX_EXT_KEYLEN (sizeof(struct hfs_ext_key) - sizeof(u8)) 172*cf059462SEric Sandeen 1731da177e4SLinus Torvalds typedef union hfs_btree_key btree_key; 1741da177e4SLinus Torvalds 1751da177e4SLinus Torvalds struct hfs_extent { 1761da177e4SLinus Torvalds __be16 block; 1771da177e4SLinus Torvalds __be16 count; 1781da177e4SLinus Torvalds }; 1791da177e4SLinus Torvalds typedef struct hfs_extent hfs_extent_rec[3]; 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds /* The catalog record for a file */ 1821da177e4SLinus Torvalds struct hfs_cat_file { 1831da177e4SLinus Torvalds s8 type; /* The type of entry */ 1841da177e4SLinus Torvalds u8 reserved; 1851da177e4SLinus Torvalds u8 Flags; /* Flags such as read-only */ 1861da177e4SLinus Torvalds s8 Typ; /* file version number = 0 */ 1871da177e4SLinus Torvalds struct hfs_finfo UsrWds; /* data used by the Finder */ 1881da177e4SLinus Torvalds __be32 FlNum; /* The CNID */ 1891da177e4SLinus Torvalds __be16 StBlk; /* obsolete */ 1901da177e4SLinus Torvalds __be32 LgLen; /* The logical EOF of the data fork*/ 1911da177e4SLinus Torvalds __be32 PyLen; /* The physical EOF of the data fork */ 1921da177e4SLinus Torvalds __be16 RStBlk; /* obsolete */ 1931da177e4SLinus Torvalds __be32 RLgLen; /* The logical EOF of the rsrc fork */ 1941da177e4SLinus Torvalds __be32 RPyLen; /* The physical EOF of the rsrc fork */ 1951da177e4SLinus Torvalds __be32 CrDat; /* The creation date */ 1961da177e4SLinus Torvalds __be32 MdDat; /* The modified date */ 1971da177e4SLinus Torvalds __be32 BkDat; /* The last backup date */ 1981da177e4SLinus Torvalds struct hfs_fxinfo FndrInfo; /* more data for the Finder */ 1991da177e4SLinus Torvalds __be16 ClpSize; /* number of bytes to allocate 2001da177e4SLinus Torvalds when extending files */ 2011da177e4SLinus Torvalds hfs_extent_rec ExtRec; /* first extent record 2021da177e4SLinus Torvalds for the data fork */ 2031da177e4SLinus Torvalds hfs_extent_rec RExtRec; /* first extent record 2041da177e4SLinus Torvalds for the resource fork */ 2051da177e4SLinus Torvalds u32 Resrv; /* reserved by Apple */ 2061da177e4SLinus Torvalds } __packed; 2071da177e4SLinus Torvalds 2081da177e4SLinus Torvalds /* the catalog record for a directory */ 2091da177e4SLinus Torvalds struct hfs_cat_dir { 2101da177e4SLinus Torvalds s8 type; /* The type of entry */ 2111da177e4SLinus Torvalds u8 reserved; 2121da177e4SLinus Torvalds __be16 Flags; /* flags */ 2131da177e4SLinus Torvalds __be16 Val; /* Valence: number of files and 2141da177e4SLinus Torvalds dirs in the directory */ 2151da177e4SLinus Torvalds __be32 DirID; /* The CNID */ 2161da177e4SLinus Torvalds __be32 CrDat; /* The creation date */ 2171da177e4SLinus Torvalds __be32 MdDat; /* The modification date */ 2181da177e4SLinus Torvalds __be32 BkDat; /* The last backup date */ 2191da177e4SLinus Torvalds struct hfs_dinfo UsrInfo; /* data used by the Finder */ 2201da177e4SLinus Torvalds struct hfs_dxinfo FndrInfo; /* more data used by Finder */ 2211da177e4SLinus Torvalds u8 Resrv[16]; /* reserved by Apple */ 2221da177e4SLinus Torvalds } __packed; 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds /* the catalog record for a thread */ 2251da177e4SLinus Torvalds struct hfs_cat_thread { 2261da177e4SLinus Torvalds s8 type; /* The type of entry */ 2271da177e4SLinus Torvalds u8 reserved[9]; /* reserved by Apple */ 2281da177e4SLinus Torvalds __be32 ParID; /* CNID of parent directory */ 2291da177e4SLinus Torvalds struct hfs_name CName; /* The name of this entry */ 2301da177e4SLinus Torvalds } __packed; 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds /* A catalog tree record */ 2331da177e4SLinus Torvalds typedef union hfs_cat_rec { 2341da177e4SLinus Torvalds s8 type; /* The type of entry */ 2351da177e4SLinus Torvalds struct hfs_cat_file file; 2361da177e4SLinus Torvalds struct hfs_cat_dir dir; 2371da177e4SLinus Torvalds struct hfs_cat_thread thread; 2381da177e4SLinus Torvalds } hfs_cat_rec; 2391da177e4SLinus Torvalds 2401da177e4SLinus Torvalds struct hfs_mdb { 2411da177e4SLinus Torvalds __be16 drSigWord; /* Signature word indicating fs type */ 2421da177e4SLinus Torvalds __be32 drCrDate; /* fs creation date/time */ 2431da177e4SLinus Torvalds __be32 drLsMod; /* fs modification date/time */ 2441da177e4SLinus Torvalds __be16 drAtrb; /* fs attributes */ 2451da177e4SLinus Torvalds __be16 drNmFls; /* number of files in root directory */ 2461da177e4SLinus Torvalds __be16 drVBMSt; /* location (in 512-byte blocks) 2471da177e4SLinus Torvalds of the volume bitmap */ 2481da177e4SLinus Torvalds __be16 drAllocPtr; /* location (in allocation blocks) 2491da177e4SLinus Torvalds to begin next allocation search */ 2501da177e4SLinus Torvalds __be16 drNmAlBlks; /* number of allocation blocks */ 2511da177e4SLinus Torvalds __be32 drAlBlkSiz; /* bytes in an allocation block */ 2521da177e4SLinus Torvalds __be32 drClpSiz; /* clumpsize, the number of bytes to 2531da177e4SLinus Torvalds allocate when extending a file */ 2541da177e4SLinus Torvalds __be16 drAlBlSt; /* location (in 512-byte blocks) 2551da177e4SLinus Torvalds of the first allocation block */ 2561da177e4SLinus Torvalds __be32 drNxtCNID; /* CNID to assign to the next 2571da177e4SLinus Torvalds file or directory created */ 2581da177e4SLinus Torvalds __be16 drFreeBks; /* number of free allocation blocks */ 2591da177e4SLinus Torvalds u8 drVN[28]; /* the volume label */ 2601da177e4SLinus Torvalds __be32 drVolBkUp; /* fs backup date/time */ 2611da177e4SLinus Torvalds __be16 drVSeqNum; /* backup sequence number */ 2621da177e4SLinus Torvalds __be32 drWrCnt; /* fs write count */ 2631da177e4SLinus Torvalds __be32 drXTClpSiz; /* clumpsize for the extents B-tree */ 2641da177e4SLinus Torvalds __be32 drCTClpSiz; /* clumpsize for the catalog B-tree */ 2651da177e4SLinus Torvalds __be16 drNmRtDirs; /* number of directories in 2661da177e4SLinus Torvalds the root directory */ 2671da177e4SLinus Torvalds __be32 drFilCnt; /* number of files in the fs */ 2681da177e4SLinus Torvalds __be32 drDirCnt; /* number of directories in the fs */ 2691da177e4SLinus Torvalds u8 drFndrInfo[32]; /* data used by the Finder */ 2701da177e4SLinus Torvalds __be16 drEmbedSigWord; /* embedded volume signature */ 2711da177e4SLinus Torvalds __be32 drEmbedExtent; /* starting block number (xdrStABN) 2721da177e4SLinus Torvalds and number of allocation blocks 2731da177e4SLinus Torvalds (xdrNumABlks) occupied by embedded 2741da177e4SLinus Torvalds volume */ 2751da177e4SLinus Torvalds __be32 drXTFlSize; /* bytes in the extents B-tree */ 2761da177e4SLinus Torvalds hfs_extent_rec drXTExtRec; /* extents B-tree's first 3 extents */ 2771da177e4SLinus Torvalds __be32 drCTFlSize; /* bytes in the catalog B-tree */ 2781da177e4SLinus Torvalds hfs_extent_rec drCTExtRec; /* catalog B-tree's first 3 extents */ 2791da177e4SLinus Torvalds } __packed; 2801da177e4SLinus Torvalds 2811da177e4SLinus Torvalds /*======== Data structures kept in memory ========*/ 2821da177e4SLinus Torvalds 2831da177e4SLinus Torvalds struct hfs_readdir_data { 2841da177e4SLinus Torvalds struct list_head list; 2851da177e4SLinus Torvalds struct file *file; 2861da177e4SLinus Torvalds struct hfs_cat_key key; 2871da177e4SLinus Torvalds }; 2881da177e4SLinus Torvalds 2891da177e4SLinus Torvalds #endif 290