/[pearpc]/src/io/prom/fs/hfsplus/hfsp.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /src/io/prom/fs/hfsplus/hfsp.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/plain
File size: 11353 byte(s)
import upstream CVS
1 /*
2 * libhfsp - library for reading and writing Macintosh HFS+ volumes
3 *
4 * This file includes definitions for the structures found on
5 * HFS+ Volumes. The structures are further wrapped by struct
6 * found in libhfsp.h. fucntions on those enhanced structures
7 * are found in files mentioned in comments below.
8 *
9 * Copyright (C) 2000 Klaus Halfmann <klaus.halfmann@feri.de>
10 * Original code 1996-1998 by Robert Leslie <rob@mars.rog>
11 * other work 2000 from Brad Boyer (flar@pants.nu)
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 */
28
29 /* # include <time.h> */
30
31 #define HFSP_BLOCKSZ 512 /* A sector for Apple is always 512 bytes */
32 #define HFSP_BLOCKSZ_BITS 9 /* 1<<9 == 512 */
33 #define HFSP_VOLHEAD_SIG 0x482B /* 'H+' */
34
35 // Minimum Key size for all btrees
36 #define HFSP_CAT_KEY_MIN_LEN 6
37
38 // Maximum Key size for all btrees
39 #define HFSP_CAT_KEY_MAX_LEN 516
40
41 /* HFS+ includes POSIX permissions , although marked as reserved they will be
42 * used as such. Is ignored by MacOS 8-9 but probably not by MacOS X.
43 */
44 typedef struct {
45 UInt32 owner;
46 UInt32 group;
47 UInt32 mode;
48 UInt32 dev;
49 } hfsp_perm;
50
51 /* A single contiguous area (fragment) of a file */
52 typedef struct {
53 UInt32 start_block;
54 UInt32 block_count;
55 } hfsp_extent;
56
57 /* A file may contain up to 8 normale extents, all other
58 are found in some extra extent area */
59 typedef hfsp_extent hfsp_extent_rec[8];
60
61 /* Information for a "Fork" in a file
62 * Forks are the "usual" DATA and RSRC forks or special files
63 * (e.g. the Volume Bitmap)
64 */
65 typedef struct {
66 APPLEUInt64 total_size; // logical size
67 UInt32 clump_size; // number of bytes to preallocate
68 UInt32 total_blocks;
69 hfsp_extent_rec extents; // initial (8) extents
70 } hfsp_fork_raw;
71
72 /* HFS+ Volume Header
73 * Always found at block 2 of the disk, a copy is stored
74 * at the second to last block of the disk.
75 */
76 typedef struct hfsp_vh {
77 UInt16 signature; // must be HFSPLUS_VOLHEAD_SIG 'H+'
78 UInt16 version; // currently 4, ignored
79 UInt32 attributes; // See bit constants below
80 UInt32 last_mount_vers;
81 // Use a registered creator code here (See libhfsp.h)
82 // Mac OS uses '8.10' well
83 UInt32 reserved;
84
85 UInt32 create_date; // local time !
86 UInt32 modify_date; // GMT (?)
87 UInt32 backup_date; // GMT (?)
88 UInt32 checked_date; // GMT (?) fsck ?
89
90 UInt32 file_count;
91 // not including special files but including DATA and RSRC forks
92 UInt32 folder_count; // excluding the root folder
93
94 UInt32 blocksize;
95 // must be multiple of HFSPLUS_SECTOR_SIZE,
96 // should be a multiple of 4k for harddisk
97 UInt32 total_blocks;
98 UInt32 free_blocks;
99 // The total number of unused allocation blocks on the disk.
100
101 UInt32 next_alloc;
102 // hint where to search for next allocation blocks
103 UInt32 rsrc_clump_sz;
104 // default clump size for rsrc forks
105 UInt32 data_clump_sz;
106 // default clump size for data forks
107 UInt32 next_cnid;
108 // next unused catalog id
109 UInt32 write_count;
110 // increment on every mount (and write ?)
111 APPLEUInt64 encodings_bmp;
112 // for every encoding used on the disk a bit is set
113 // ignored but eventually must be cared for
114 Char finder_info[32];
115 hfsp_fork_raw alloc_file;
116 // stores bitmap of use/free blocks
117 hfsp_fork_raw ext_file;
118 // stores oferflow extents
119 hfsp_fork_raw cat_file;
120 // This contains the root directory
121 hfsp_fork_raw attr_file;
122 hfsp_fork_raw start_file;
123 // a special startup file may be described here (used by ?)
124 } hfsp_vh;
125
126 /* HFS+ volume attributes */
127 /* 0-6 reserved, may be used in memory only */
128 #define HFSPLUS_VOL_RESERVED1 0x000000FF
129 #define HFSPLUS_VOL_HARDLOCK 0x00000080 // Used in Memory by finder only
130 #define HFSPLUS_VOL_UNMNT 0x00000100
131 // clear this bit when mounting, set as last step of unmounting
132 // This is checked by (slower) ROM code
133 #define HFSPLUS_VOL_SPARE_BLK 0x00000200
134 #define HFSPLUS_VOL_NOCACHE 0x00000400
135 // in case of RAM or ROM disk (try a HFS+ Ramdisk :)
136 #define HFSPLUS_VOL_INCNSTNT 0x00000800
137 // Reverse meaning as of HFSPLUS_VOL_UNMNT
138 // This is checked by (faster) Mac OS code
139 /* 12-14 reserved */
140 #define HFSPLUS_VOL_RESERVED2 0x00007000
141 #define HFSPLUS_VOL_SOFTLOCK 0x00008000
142 #define HFSPLUS_VOL_RESERVED3 0xFFFF0000
143
144 /* HFS+ Btree node descriptor */
145 typedef struct {
146 UInt32 next; /* pointer to next node of this kind, or 0 */
147 /* Header Node points to first MAP node */
148 UInt32 prev; /* pointer to previous node of this kind, or 0 */
149 UInt8 kind; /* see below */
150 UInt8 height; /* root node starts with 0 */
151 UInt16 num_rec; /* number of records in this node */
152 UInt16 reserved; /* fill up to 4 byte alignment */
153 } btree_node_desc;
154
155 /* HFS+ Btree Node types */
156 #define HFSP_NODE_NDX 0x00
157 #define HFSP_NODE_HEAD 0x01
158 #define HFSP_NODE_MAP 0x02
159 #define HFSP_NODE_LEAF 0xFF
160
161 #define HFSP_CATALOG_MIN_NODE_SIZE 0x1000
162 #define HFSP_ATTRMIN_DOE_SIZE 0x1000
163
164 /* The record offsets are found at the end of the fork
165 * containing the Btree */
166
167 typedef UInt16 btree_record_offset;
168
169 typedef struct {
170 UInt16 depth;
171 // equal to height of btree_node_desc
172 UInt32 root;
173 // root node of the hierarchy
174 UInt32 leaf_count;
175 // number of leaf Records (not nodes)
176 UInt32 leaf_head;
177 // first leaf node
178 UInt32 leaf_tail;
179 // last leaf node
180 UInt16 node_size;
181 // node size of _all_ nodes in this fork
182 UInt16 max_key_len;
183 // maximum (or fixed) length of keys in this btree
184 UInt32 node_count;
185 // count of all (free and used) nodes in tree
186 UInt32 free_nodes;
187 UInt16 reserved1;
188 UInt32 clump_size;
189 // ignored my MacOS used by ?
190 UInt8 btree_type;
191 // always 0 for HFS+
192 UInt8 reserved2;
193 UInt32 attributes;
194 // see below
195 UInt32 reserved3[16];
196 } btree_head;
197
198 /* BTree attributes */
199 #define HFSPLUS_BAD_CLOSE 0x01
200 // Btree was not properly closed and should be checked
201 // not used for HFS+ but reserved
202 #define HFSPLUS_TREE_BIGKEYS 0x02
203 // always set for HFS+
204 #define HFSPLUS_TREE_VAR_NDXKEY_SIZE 0x04
205 // use variable length index nodes, always set for catalog btree,
206 // always cleared for extents btree.
207 #define HFSPLUS_TREE_RESERVED 0xFFFFFFF8
208 // Reserved bits in Attributes
209
210 #define HFSPLUS_TREE_UNUSED 0xFFFFFFF8
211
212 /* Some special File ID numbers */
213 #define HFSP_POR_CNID 1 /* Parent Of the Root */
214 #define HFSP_ROOT_CNID 2 /* ROOT directory */
215 #define HFSP_EXT_CNID 3 /* EXTents B-tree */
216 #define HFSP_CAT_CNID 4 /* CATalog B-tree */
217 #define HFSP_BAD_CNID 5 /* BAD blocks file */
218 #define HFSP_ALLOC_CNID 6 /* ALLOCation file */
219 #define HFSP_START_CNID 7 /* STARTup file */
220 #define HFSP_ATTR_CNID 8 /* ATTRibutes file */
221 #define HFSP_EXCH_CNID 15 /* ExchangeFiles temp id */
222 #define HFSP_MIN_CNID 15 /* Minimum expected value */
223
224 /* Unicode String */
225 typedef struct {
226 UInt16 strlen;
227 UInt16 name[255]; // unicode characters
228 } hfsp_unistr255;
229
230 /* HFS+ key "superclass" for follwoing keys ...*/
231 typedef struct {
232 UInt16 key_length; /* excluding length */
233 char data[0];
234 } hfsp_key;
235
236 /* HFS+ catalog entry key */
237 typedef struct {
238 UInt16 key_length; /* excluding length */
239 UInt32 parent_cnid;
240 hfsp_unistr255 name;
241 } hfsp_cat_key;
242
243 /* HFS+ extends entry key */
244 typedef struct {
245 UInt16 key_length; /* excluding length */
246 UInt8 fork_type; /* Seee below */
247 UInt8 filler;
248 UInt32 file_id;
249 UInt32 start_block;
250 } hfsp_extent_key;
251
252 #define HFSP_EXTENT_DATA 0x00
253 #define HFSP_EXTENT_RSRC 0xFF
254
255 /* The key is followed by a record, an index or some other data */
256
257 /* The types of these records are defined as follows */
258
259 #define HFSP_FOLDER 0x0001 // entry fo a Folder
260 #define HFSP_FILE 0x0002 // entry for a File
261 #define HFSP_FOLDER_THREAD 0x0003
262 // Like '.' in unix, identifies the folder by its id, only
263 #define HFSP_FILE_THREAD 0x0004
264
265 #define HFSP_THREAD_OFFSET 0x0002
266 // add to create a thread type from a simple type
267
268 /* HFS+ folder data (part of an hfsp_cat_entry) */
269 typedef struct {
270 UInt16 flags; /* no flags defined yet */
271 UInt32 valence; /* Numer of files and folders contained in folder */
272 UInt32 id;
273 UInt32 create_date; // GMT
274 UInt32 content_mod_date; // GMT
275 UInt32 attribute_mod_date; // GMT
276 UInt32 access_date; // GMT
277 UInt32 backup_date; // GMT
278 hfsp_perm permissions;
279 DInfo user_info;
280 DXInfo finder_info;
281 UInt32 text_encoding;
282 // hint fo the finder what encoding to use, unused here
283 UInt32 reserved;
284 } hfsp_cat_folder;
285
286 #define HFSP_FOLDER_RESERVED 0xFFFF // all are reserved :)
287
288 /* HFS+ file data (part of a cat_entry) */
289 typedef struct {
290 UInt16 flags; /* See below */
291 UInt32 reserved1;
292 UInt32 id;
293 UInt32 create_date;
294 UInt32 content_mod_date;
295 UInt32 attribute_mod_date;
296 UInt32 access_date;
297 UInt32 backup_date;
298 hfsp_perm permissions;
299 FInfo user_info;
300 FXInfo finder_info;
301 UInt32 text_encoding;
302 UInt32 reserved2;
303
304 hfsp_fork_raw data_fork;
305 hfsp_fork_raw res_fork;
306 } hfsp_cat_file;
307
308 /* File attribute bits */
309 #define HFSP_FILE_LOCKED 0x0001
310 #define HFSP_THREAD_EXISTS 0x0002 /* Always set in HFS+ */
311 #define HFSP_FILE_RESERVED 0xFFFC
312
313 /* HFS+ catalog thread (part of a cat_entry) */
314 /* In fact this is a almost a hfsp_cat_key */
315 typedef struct {
316 UInt16 reserved;
317 UInt32 parentID;
318 hfsp_unistr255 nodeName;
319 } hfsp_cat_thread;
320
321
322 /* A data record in the catalog tree */
323 typedef struct {
324 UInt16 type;
325 union {
326 hfsp_cat_folder folder;
327 hfsp_cat_file file;
328 hfsp_cat_thread thread;
329 } u;
330 } hfsp_cat_entry;

  ViewVC Help
Powered by ViewVC 1.1.26