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 /* permissions in Inode.mode */
86 /* type in Inode.mode */
100 u32int start; /* first block in extent */
101 u32int count; /* number of blocks in extent */
106 u32int cnid; /* catalog node id (in memory only) */
107 int type; /* Dfork or Rfork (in memory only) */
108 u64int size; /* size in bytes */
110 Extent extent[NEXTENTS]; /* initial extents */
114 * In-core catalog record for a file or folder.
119 u64int fileid; /* in memory only */
120 u32int mtime; /* modification */
121 u32int ctime; /* attribute modification */
122 u32int atime; /* access */
123 u32int nlink; /* in memory only */
129 u32int nentries; /* directories */
136 int nhdr; /* 0 or Adlen */
137 Fork *fork; /* dfork or rfork */
144 int nodesize; /* node size in bytes */
145 u32int nnodes; /* number of nodes in tree */
146 u32int root; /* node number of the tree's root */
148 int maxkeylen; /* maximum key size in bytes */
149 int indexkeylen; /* 0 or length of index node keys */
150 int sensitive; /* are key strings case sensitive */
157 int type; /* type of this node */
158 u32int next; /* next related node or 0 */
159 int nrec; /* number of records in this node */
165 u32int cnid; /* tree->fork->cnid, for debugging prints */
167 Block *block; /* a node in the tree */
171 int rno; /* a record in the node */
180 int (*_cmp)(uchar *k, int len, int *order, Key *key);
194 Rune name[NAMELEN]; /* only len runes on disk */
202 uchar *b; /* not yet decoded */
210 u32int nfree; /* for debugging */
212 Fork alloc; /* block allocation bitmap */
215 Tree extents; /* Extentkey -> Extent[NEXTENT] */
216 Tree catalog; /* Catalogkey -> Catalogkey + Inode */
217 u32int hlinkparent; /* 0 or cnid */