2 Supports HFS Plus and HFSX file systems with or without an HFS
5 Apple technical note 1150 documents the file system:
7 http://developer.apple.com/technotes/tn/tn1150.html
9 Briefly an hfs file system comprises a volume header, an
10 optional journal, and a set of forks.
12 Most fs metadata resides in forks including a block allocation
13 bitmap, a tree storing extents (q.v.) for forks and bad disk
14 blocks, and a tree storing catalog (file and directory)
17 An extent comprises a starting block number and block count.
18 The fs maintains a list of k*NEXTENTS extents for each fork.
19 These are used to map fork block numbers to disk block
20 numbers. A fork's initial extents are in its catalog record
21 or (for fs forks) the volume header. The rest are in the
24 Fs trees are layed out (in a fork) as an array of fixed-size
25 nodes. A node comprises a header, a sorted list of
26 variable-size records, and trailing record offsets. The
27 records in interior nodes map keys to (child) node numbers.
28 The records in leaf nodes map keys to data. The nodes at each
29 level in a tree are also sorted via (sibling) node numbers
30 stored in each node header.
33 typedef struct Extent Extent;
34 typedef struct Fork Fork;
35 typedef struct Inode Inode;
36 typedef struct Tree Tree;
37 typedef struct Node Node;
38 typedef struct Treeref Treeref;
39 typedef struct Key Key;
40 typedef struct Extentkey Extentkey;
41 typedef struct Name Name;
42 typedef struct Catalogkey Catalogkey;
43 typedef struct Hfs Hfs;
50 Hfsplusmagic = (Hfsplussig<<16)|4,
51 Hfsxmagic = (Hfsxsig<<16)|5,
54 UTFNAMELEN = NAMELEN*UTFmax,
58 Dfork = 0, Rfork = 255,
61 RootpId = 1, RootId, ExtentsId, CatalogId,
62 BadblockId, AllocId, MinuserId = 16,
64 /* size of a few structures on disk */
65 Extentlen = 8, /* Extent */
66 Ndlen = 14, /* Node */
67 Folderlen = 88, Filelen = 248, /* Inode */
68 Adlen = 82, /* Apple double header */
70 Filen = 32, /* Finder info */
72 /* values in Node.type */
73 LeafNode = -1, IndexNode, HeaderNode, MapNode,
75 /* catalog record types */
76 Folder = 1, File, FolderThread, FileThread,
78 /* some systems have these defined */
95 #define IEXEC HFS_IEXEC
96 #define IWRITE HFS_IWRITE
97 #define IREAD HFS_IREAD
98 #define ISVTX HFS_ISVTX
99 #define ISGID HFS_ISGID
100 #define ISUID HFS_ISUID
101 #define IFMT HFS_IFMT
102 #define IFIFO HFS_IFIFO
103 #define IFCHR HFS_IFCHR
104 #define IFDIR HFS_IFDIR
105 #define IFBLK HFS_IFBLK
106 #define IFREG HFS_IFREG
107 #define IFLNK HFS_IFLNK
108 #define IFSOCK HFS_IFSOCK
109 #define IFWHT HFS_IFWHT
111 /* permissions in Inode.mode */
119 /* type in Inode.mode */
133 u32int start; /* first block in extent */
134 u32int count; /* number of blocks in extent */
139 u32int cnid; /* catalog node id (in memory only) */
140 int type; /* Dfork or Rfork (in memory only) */
141 u64int size; /* size in bytes */
143 Extent extent[NEXTENTS]; /* initial extents */
147 * In-core catalog record for a file or folder.
152 u64int fileid; /* in memory only */
153 u32int mtime; /* modification */
154 u32int ctime; /* attribute modification */
155 u32int atime; /* access */
156 u32int nlink; /* in memory only */
162 u32int nentries; /* directories */
169 int nhdr; /* 0 or Adlen */
170 Fork *fork; /* dfork or rfork */
177 int nodesize; /* node size in bytes */
178 u32int nnodes; /* number of nodes in tree */
179 u32int root; /* node number of the tree's root */
181 int maxkeylen; /* maximum key size in bytes */
182 int indexkeylen; /* 0 or length of index node keys */
183 int sensitive; /* are key strings case sensitive */
190 int type; /* type of this node */
191 u32int next; /* next related node or 0 */
192 int nrec; /* number of records in this node */
198 u32int cnid; /* tree->fork->cnid, for debugging prints */
200 Block *block; /* a node in the tree */
204 int rno; /* a record in the node */
213 int (*_cmp)(uchar *k, int len, int *order, Key *key);
227 Rune name[NAMELEN]; /* only len runes on disk */
235 uchar *b; /* not yet decoded */
243 u32int nfree; /* for debugging */
245 Fork alloc; /* block allocation bitmap */
248 Tree extents; /* Extentkey -> Extent[NEXTENT] */
249 Tree catalog; /* Catalogkey -> Catalogkey + Inode */
250 u32int hlinkparent; /* 0 or cnid */