2 * linux/include/linux/hfsplus_raw.h
5 * Brad Boyer (flar@pants.nu)
6 * (C) 2003 Ardis Technologies <roman@ardistech.com>
8 * Format of structures on disk
9 * Information taken from Apple Technote #1150 (HFS Plus Volume Format)
13 #ifndef _LINUX_HFSPLUS_RAW_H
14 #define _LINUX_HFSPLUS_RAW_H
16 #include <linux/types.h>
18 #define __packed __attribute__ ((packed))
21 #define HFSPLUS_SECTOR_SIZE 512
22 #define HFSPLUS_VOLHEAD_SECTOR 2
23 #define HFSPLUS_VOLHEAD_SIG 0x482b
24 #define HFSPLUS_SUPER_MAGIC 0x482b
25 #define HFSPLUS_CURRENT_VERSION 4
27 #define HFSP_WRAP_MAGIC 0x4244
28 #define HFSP_WRAP_ATTRIB_SLOCK 0x8000
29 #define HFSP_WRAP_ATTRIB_SPARED 0x0200
31 #define HFSP_WRAPOFF_SIG 0x00
32 #define HFSP_WRAPOFF_ATTRIB 0x0A
33 #define HFSP_WRAPOFF_ABLKSIZE 0x14
34 #define HFSP_WRAPOFF_ABLKSTART 0x1C
35 #define HFSP_WRAPOFF_EMBEDSIG 0x7C
36 #define HFSP_WRAPOFF_EMBEDEXT 0x7E
38 #define HFSP_HIDDENDIR_NAME "\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data"
40 #define HFSP_HARDLINK_TYPE 0x686c6e6b /* 'hlnk' */
41 #define HFSP_HFSPLUS_CREATOR 0x6866732b /* 'hfs+' */
43 #define HFSP_MOUNT_VERSION 0x482b4c78 /* 'H+Lx' */
45 /* Structures used on disk */
47 typedef u32 hfsplus_cnid;
48 typedef u16 hfsplus_unichr;
50 /* A "string" as used in filenames, etc. */
53 hfsplus_unichr unicode[255];
54 } __packed hfsplus_unistr;
56 #define HFSPLUS_MAX_STRLEN 255
58 /* POSIX permissions */
64 } __packed hfsplus_perm;
66 /* A single contiguous area of a file */
70 } __packed hfsplus_extent;
71 typedef hfsplus_extent hfsplus_extent_rec[8];
73 /* Information for a "Fork" in a file */
78 hfsplus_extent_rec extents;
79 } __packed hfsplus_fork_raw;
81 /* HFS+ Volume Header */
82 typedef struct hfsplus_vh {
104 hfsplus_cnid next_cnid;
111 hfsplus_fork_raw alloc_file;
112 hfsplus_fork_raw ext_file;
113 hfsplus_fork_raw cat_file;
114 hfsplus_fork_raw attr_file;
115 hfsplus_fork_raw start_file;
116 } __packed hfsplus_vh;
118 /* HFS+ volume attributes */
119 #define HFSPLUS_VOL_UNMNT (1 << 8)
120 #define HFSPLUS_VOL_SPARE_BLK (1 << 9)
121 #define HFSPLUS_VOL_NOCACHE (1 << 10)
122 #define HFSPLUS_VOL_INCNSTNT (1 << 11)
123 #define HFSPLUS_VOL_SOFTLOCK (1 << 15)
125 /* HFS+ BTree node descriptor */
133 } __packed hfsplus_btree_node_desc;
135 /* HFS+ BTree node types */
136 #define HFSPLUS_NODE_NDX 0x00
137 #define HFSPLUS_NODE_HEAD 0x01
138 #define HFSPLUS_NODE_MAP 0x02
139 #define HFSPLUS_NODE_LEAF 0xFF
141 /* HFS+ BTree header */
158 } __packed hfsplus_btree_head;
160 /* BTree attributes */
161 #define HFSPLUS_TREE_BIGKEYS 2
162 #define HFSPLUS_TREE_VAR_NDXKEY_SIZE 4
164 /* HFS+ BTree misc info */
165 #define HFSPLUS_TREE_HEAD 0
166 #define HFSPLUS_NODE_MXSZ 32768
168 /* Some special File ID numbers (stolen from hfs.h) */
169 #define HFSPLUS_POR_CNID 1 /* Parent Of the Root */
170 #define HFSPLUS_ROOT_CNID 2 /* ROOT directory */
171 #define HFSPLUS_EXT_CNID 3 /* EXTents B-tree */
172 #define HFSPLUS_CAT_CNID 4 /* CATalog B-tree */
173 #define HFSPLUS_BAD_CNID 5 /* BAD blocks file */
174 #define HFSPLUS_ALLOC_CNID 6 /* ALLOCation file */
175 #define HFSPLUS_START_CNID 7 /* STARTup file */
176 #define HFSPLUS_ATTR_CNID 8 /* ATTRibutes file */
177 #define HFSPLUS_EXCH_CNID 15 /* ExchangeFiles temp id */
178 #define HFSPLUS_FIRSTUSER_CNID 16 /* first available user id */
180 /* HFS+ catalog entry key */
185 } __packed hfsplus_cat_key;
188 /* Structs from hfs.h */
192 } __packed hfsp_point;
199 } __packed hfsp_rect;
202 /* HFS directory info (stolen from hfs.h */
206 hfsp_point frLocation;
218 /* HFS+ folder data (part of an hfsplus_cat_entry) */
225 u32 content_mod_date;
226 u32 attribute_mod_date;
229 hfsplus_perm permissions;
234 } __packed hfsplus_cat_folder;
236 /* HFS file info (stolen from hfs.h) */
241 hfsp_point fdLocation;
252 /* HFS+ file data (part of a cat_entry) */
259 u32 content_mod_date;
260 u32 attribute_mod_date;
263 hfsplus_perm permissions;
269 hfsplus_fork_raw data_fork;
270 hfsplus_fork_raw rsrc_fork;
271 } __packed hfsplus_cat_file;
273 /* File attribute bits */
274 #define kHFSFileLockedBit 0x0000
275 #define kHFSFileLockedMask 0x0001
276 #define kHFSThreadExistsBit 0x0001
277 #define kHFSThreadExistsMask 0x0002
279 /* HFS+ catalog thread (part of a cat_entry) */
283 hfsplus_cnid parentID;
284 hfsplus_unistr nodeName;
285 } __packed hfsplus_cat_thread;
287 #define HFSPLUS_MIN_THREAD_SZ 10
289 /* A data record in the catalog tree */
292 hfsplus_cat_folder folder;
293 hfsplus_cat_file file;
294 hfsplus_cat_thread thread;
295 } __packed hfsplus_cat_entry;
297 /* HFS+ catalog entry type */
298 #define HFSPLUS_FOLDER 0x0001
299 #define HFSPLUS_FILE 0x0002
300 #define HFSPLUS_FOLDER_THREAD 0x0003
301 #define HFSPLUS_FILE_THREAD 0x0004
303 /* HFS+ extents tree key */
310 } __packed hfsplus_ext_key;
312 #define HFSPLUS_EXT_KEYLEN 12
314 /* HFS+ generic BTree key */
319 } __packed hfsplus_btree_key;