1 /*
2  *  linux/include/linux/hfsplus_raw.h
3  *
4  * Copyright (C) 1999
5  * Brad Boyer (flar@pants.nu)
6  * (C) 2003 Ardis Technologies <roman@ardistech.com>
7  *
8  * Format of structures on disk
9  * Information taken from Apple Technote #1150 (HFS Plus Volume Format)
10  *
11  */
12 
13 #ifndef _LINUX_HFSPLUS_RAW_H
14 #define _LINUX_HFSPLUS_RAW_H
15 
16 #include <linux/types.h>
17 
18 #define __packed __attribute__ ((packed))
19 
20 /* Some constants */
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
26 
27 #define HFSP_WRAP_MAGIC         0x4244
28 #define HFSP_WRAP_ATTRIB_SLOCK  0x8000
29 #define HFSP_WRAP_ATTRIB_SPARED 0x0200
30 
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
37 
38 #define HFSP_HIDDENDIR_NAME	"\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data"
39 
40 #define HFSP_HARDLINK_TYPE	0x686c6e6b	/* 'hlnk' */
41 #define HFSP_HFSPLUS_CREATOR	0x6866732b	/* 'hfs+' */
42 
43 #define HFSP_MOUNT_VERSION	0x482b4c78	/* 'H+Lx' */
44 
45 /* Structures used on disk */
46 
47 typedef u32 hfsplus_cnid;
48 typedef u16 hfsplus_unichr;
49 
50 /* A "string" as used in filenames, etc. */
51 typedef struct {
52 	u16 length;
53 	hfsplus_unichr unicode[255];
54 } __packed hfsplus_unistr;
55 
56 #define HFSPLUS_MAX_STRLEN 255
57 
58 /* POSIX permissions */
59 typedef struct {
60 	u32 owner;
61 	u32 group;
62 	u32 mode;
63 	u32 dev;
64 } __packed hfsplus_perm;
65 
66 /* A single contiguous area of a file */
67 typedef struct {
68 	u32 start_block;
69 	u32 block_count;
70 } __packed hfsplus_extent;
71 typedef hfsplus_extent hfsplus_extent_rec[8];
72 
73 /* Information for a "Fork" in a file */
74 typedef struct {
75 	u64 total_size;
76 	u32 clump_size;
77 	u32 total_blocks;
78 	hfsplus_extent_rec extents;
79 } __packed hfsplus_fork_raw;
80 
81 /* HFS+ Volume Header */
82 typedef struct hfsplus_vh {
83 	u16 signature;
84 	u16 version;
85 	u32 attributes;
86 	u32 last_mount_vers;
87 	u32 reserved;
88 
89 	u32 create_date;
90 	u32 modify_date;
91 	u32 backup_date;
92 	u32 checked_date;
93 
94 	u32 file_count;
95 	u32 folder_count;
96 
97 	u32 blocksize;
98 	u32 total_blocks;
99 	u32 free_blocks;
100 
101 	u32 next_alloc;
102 	u32 rsrc_clump_sz;
103 	u32 data_clump_sz;
104 	hfsplus_cnid next_cnid;
105 
106 	u32 write_count;
107 	u64 encodings_bmp;
108 
109 	u8 finder_info[32];
110 
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;
117 
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)
124 
125 /* HFS+ BTree node descriptor */
126 typedef struct {
127 	u32 next;
128 	u32 prev;
129 	s8 kind;
130 	u8 height;
131 	u16 num_rec;
132 	u16 reserved;
133 } __packed hfsplus_btree_node_desc;
134 
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
140 
141 /* HFS+ BTree header */
142 typedef struct {
143 	u16 depth;
144 	u32 root;
145 	u32 leaf_count;
146 	u32 leaf_head;
147 	u32 leaf_tail;
148 	u16 node_size;
149 	u16 max_key_len;
150 	u32 node_count;
151 	u32 free_nodes;
152 	u16 reserved1;
153 	u32 clump_size;
154 	u8 btree_type;
155 	u8 reserved2;
156 	u32 attributes;
157 	u32 reserved3[16];
158 } __packed hfsplus_btree_head;
159 
160 /* BTree attributes */
161 #define HFSPLUS_TREE_BIGKEYS         2
162 #define HFSPLUS_TREE_VAR_NDXKEY_SIZE 4
163 
164 /* HFS+ BTree misc info */
165 #define HFSPLUS_TREE_HEAD 0
166 #define HFSPLUS_NODE_MXSZ 32768
167 
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 */
179 
180 /* HFS+ catalog entry key */
181 typedef struct {
182 	u16 key_len;
183 	hfsplus_cnid parent;
184 	hfsplus_unistr name;
185 } __packed hfsplus_cat_key;
186 
187 
188 /* Structs from hfs.h */
189 typedef struct {
190 	u16 v;
191 	u16 h;
192 } __packed hfsp_point;
193 
194 typedef struct {
195 	u16 top;
196 	u16 left;
197 	u16 bottom;
198 	u16 right;
199 } __packed hfsp_rect;
200 
201 
202 /* HFS directory info (stolen from hfs.h */
203 typedef struct {
204 	hfsp_rect frRect;
205 	u16 frFlags;
206 	hfsp_point frLocation;
207 	u16 frView;
208 } __packed DInfo;
209 
210 typedef struct {
211 	hfsp_point frScroll;
212 	u32 frOpenChain;
213 	u16 frUnused;
214 	u16 frComment;
215 	u32 frPutAway;
216 } __packed DXInfo;
217 
218 /* HFS+ folder data (part of an hfsplus_cat_entry) */
219 typedef struct {
220 	s16 type;
221 	u16 flags;
222 	u32 valence;
223 	hfsplus_cnid id;
224 	u32 create_date;
225 	u32 content_mod_date;
226 	u32 attribute_mod_date;
227 	u32 access_date;
228 	u32 backup_date;
229 	hfsplus_perm permissions;
230 	DInfo user_info;
231 	DXInfo finder_info;
232 	u32 text_encoding;
233 	u32 reserved;
234 } __packed hfsplus_cat_folder;
235 
236 /* HFS file info (stolen from hfs.h) */
237 typedef struct {
238 	u32 fdType;
239 	u32 fdCreator;
240 	u16 fdFlags;
241 	hfsp_point fdLocation;
242 	u16 fdFldr;
243 } __packed FInfo;
244 
245 typedef struct {
246 	u16 fdIconID;
247 	u8 fdUnused[8];
248 	u16 fdComment;
249 	u32 fdPutAway;
250 } __packed FXInfo;
251 
252 /* HFS+ file data (part of a cat_entry) */
253 typedef struct {
254 	s16 type;
255 	u16 flags;
256 	u32 reserved1;
257 	hfsplus_cnid id;
258 	u32 create_date;
259 	u32 content_mod_date;
260 	u32 attribute_mod_date;
261 	u32 access_date;
262 	u32 backup_date;
263 	hfsplus_perm permissions;
264 	FInfo user_info;
265 	FXInfo finder_info;
266 	u32 text_encoding;
267 	u32 reserved2;
268 
269 	hfsplus_fork_raw data_fork;
270 	hfsplus_fork_raw rsrc_fork;
271 } __packed hfsplus_cat_file;
272 
273 /* File attribute bits */
274 #define kHFSFileLockedBit       0x0000
275 #define kHFSFileLockedMask      0x0001
276 #define kHFSThreadExistsBit     0x0001
277 #define kHFSThreadExistsMask    0x0002
278 
279 /* HFS+ catalog thread (part of a cat_entry) */
280 typedef struct {
281 	s16 type;
282 	s16 reserved;
283 	hfsplus_cnid parentID;
284 	hfsplus_unistr nodeName;
285 } __packed hfsplus_cat_thread;
286 
287 #define HFSPLUS_MIN_THREAD_SZ 10
288 
289 /* A data record in the catalog tree */
290 typedef union {
291 	s16 type;
292 	hfsplus_cat_folder folder;
293 	hfsplus_cat_file file;
294 	hfsplus_cat_thread thread;
295 } __packed hfsplus_cat_entry;
296 
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
302 
303 /* HFS+ extents tree key */
304 typedef struct {
305 	u16 key_len;
306 	u8 fork_type;
307 	u8 pad;
308 	hfsplus_cnid cnid;
309 	u32 start_block;
310 } __packed hfsplus_ext_key;
311 
312 #define HFSPLUS_EXT_KEYLEN 12
313 
314 /* HFS+ generic BTree key */
315 typedef union {
316 	u16 key_len;
317 	hfsplus_cat_key cat;
318 	hfsplus_ext_key ext;
319 } __packed hfsplus_btree_key;
320 
321 #endif
322