|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: #ifndef __HFS_FORMAT__
23: #define __HFS_FORMAT__
24:
25: /*
26: * hfs_format.c
27: *
28: * This file describes the on-disk format for hfs/HFS Plus volumes.
29: * The HFS Plus volume format is desciibed in detail in Apple Technote 1150.
30: *
31: * http://developer.apple.com/technotes/tn/tn1150.html
32: *
33: */
34:
35: #ifdef __cplusplus
36: extern "C" {
37: #endif
38:
39: /* some on disk hfs structures have 68K alignment (misaligned) */
40: #pragma options align=mac68k
41:
42: /* Signatures used to differentiate between HFS and HFS Plus volumes */
43: enum {
44: kHFSSigWord = 0x4244, /* 'BD' in ASCII */
45: kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */
46: kHFSPlusVersion = 0x0004, /* will change as format changes */
47: /* version 4 shipped with Mac OS 8.1 */
48:
49: kHFSPlusMountVersion = 0x31302E30 /* '10.0' for Mac OS X */
50: };
51:
52:
53: /*
54: * Mac OS X special directory for linked and/or deleted files (HFS Plus only)
55: *
56: * to make this folder name sort last...
57: * it has 0xFFE5 Unicode prefix (0xEF, 0xBF, 0xA5 in UTF-8)
58: */
59: #define HFSPLUSMETADATAFOLDER "\xEF\xBF\xA5\xEF\xBF\xA5\xEF\xBF\xA5 HFS Private Meta Data"
60:
61: /*
62: * Files in the HFS Private Meta Data folder have one of the following
63: * prefixes followed by the file ID in decimal (no leading zeros).
64: * e.g. FileNodeData3296
65: */
66: #define HFS_LINK_PREFIX "FileNodeData"
67: #define HFS_DELETE_PREFIX "DeletedFile"
68:
69: /* Unicode strings are used for HFS Plus file and folder names */
70: struct HFSUniStr255 {
71: u_int16_t length; /* number of unicode characters */
72: u_int16_t unicode[255]; /* unicode characters */
73: };
74: typedef struct HFSUniStr255 HFSUniStr255;
75: typedef const HFSUniStr255 *ConstHFSUniStr255Param;
76:
77: enum {
78: kHFSMaxVolumeNameChars = 27,
79: kHFSMaxFileNameChars = 31,
80: kHFSPlusMaxFileNameChars = 255
81: };
82:
83:
84: /* Extent overflow file data structures */
85:
86: /* HFS Extent key */
87: struct HFSExtentKey {
88: u_int8_t keyLength; /* length of key, excluding this field */
89: u_int8_t forkType; /* 0 = data fork, FF = resource fork */
90: u_int32_t fileID; /* file ID */
91: u_int16_t startBlock; /* first file allocation block number in this extent */
92: };
93: typedef struct HFSExtentKey HFSExtentKey;
94:
95: /* HFS Plus Extent key */
96: struct HFSPlusExtentKey {
97: u_int16_t keyLength; /* length of key, excluding this field */
98: u_int8_t forkType; /* 0 = data fork, FF = resource fork */
99: u_int8_t pad; /* make the other fields align on 32-bit boundary */
100: u_int32_t fileID; /* file ID */
101: u_int32_t startBlock; /* first file allocation block number in this extent */
102: };
103: typedef struct HFSPlusExtentKey HFSPlusExtentKey;
104:
105: /* Number of extent descriptors per extent record */
106: enum {
107: kHFSExtentDensity = 3,
108: kHFSPlusExtentDensity = 8
109: };
110:
111: /* HFS extent descriptor */
112: struct HFSExtentDescriptor {
113: u_int16_t startBlock; /* first allocation block */
114: u_int16_t blockCount; /* number of allocation blocks */
115: };
116: typedef struct HFSExtentDescriptor HFSExtentDescriptor;
117:
118: /* HFS Plus extent descriptor */
119: struct HFSPlusExtentDescriptor {
120: u_int32_t startBlock; /* first allocation block */
121: u_int32_t blockCount; /* number of allocation blocks */
122: };
123: typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
124:
125: /* HFS extent record */
126: typedef HFSExtentDescriptor HFSExtentRecord[3];
127:
128: /* HFS Plus extent record */
129: typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
130:
131:
132: /* Finder information */
133: struct FndrFileInfo {
134: u_int32_t fdType; /* file type */
135: u_int32_t fdCreator; /* file creator */
136: u_int16_t fdFlags; /* Finder flags */
137: struct {
138: int16_t v; /* file's location */
139: int16_t h;
140: } fdLocation;
141: int16_t opaque;
142: };
143: typedef struct FndrFileInfo FndrFileInfo;
144:
145: struct FndrDirInfo {
146: struct { /* folder's window rectangle */
147: int16_t top;
148: int16_t left;
149: int16_t bottom;
150: int16_t right;
151: } frRect;
152: unsigned short frFlags; /* Finder flags */
153: struct {
154: u_int16_t v; /* folder's location */
155: u_int16_t h;
156: } frLocation;
157: int16_t opaque;
158: };
159: typedef struct FndrDirInfo FndrDirInfo;
160:
161: struct FndrOpaqueInfo {
162: int8_t opaque[16];
163: };
164: typedef struct FndrOpaqueInfo FndrOpaqueInfo;
165:
166:
167: /* HFS Plus Fork data info - 80 bytes */
168: struct HFSPlusForkData {
169: u_int64_t logicalSize; /* fork's logical size in bytes */
170: u_int32_t clumpSize; /* fork's clump size in bytes */
171: u_int32_t totalBlocks; /* total blocks used by this fork */
172: HFSPlusExtentRecord extents; /* initial set of extents */
173: };
174: typedef struct HFSPlusForkData HFSPlusForkData;
175:
176: /* HFS Plus Permissions info - 16 bytes */
177: struct HFSPlusPermissions {
178: u_int32_t ownerID; /* user or group ID of file/folder owner */
179: u_int32_t groupID; /* additional user of group ID */
180: u_int32_t permissions; /* permissions (bytes: unused, owner, group, everyone) */
181: u_int32_t specialDevice; /* UNIX: device for character or block special file */
182: };
183: typedef struct HFSPlusPermissions HFSPlusPermissions;
184:
185:
186: /* Catalog file data structures */
187:
188: enum {
189: kHFSRootParentID = 1, /* Parent ID of the root folder */
190: kHFSRootFolderID = 2, /* Folder ID of the root folder */
191: kHFSExtentsFileID = 3, /* File ID of the extents file */
192: kHFSCatalogFileID = 4, /* File ID of the catalog file */
193: kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */
194: kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */
195: kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */
196: kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */
197: kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */
198: kHFSFirstUserCatalogNodeID = 16
199: };
200:
201: /* HFS catalog key */
202: struct HFSCatalogKey {
203: u_int8_t keyLength; /* key length (in bytes) */
204: u_int8_t reserved; /* reserved (set to zero) */
205: u_int32_t parentID; /* parent folder ID */
206: u_char nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */
207: };
208: typedef struct HFSCatalogKey HFSCatalogKey;
209:
210: /* HFS Plus catalog key */
211: struct HFSPlusCatalogKey {
212: u_int16_t keyLength; /* key length (in bytes) */
213: u_int32_t parentID; /* parent folder ID */
214: HFSUniStr255 nodeName; /* catalog node name */
215: };
216: typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
217:
218: /* Catalog record types */
219: enum {
220: /* HFS Catalog Records */
221: kHFSFolderRecord = 0x0100, /* Folder record */
222: kHFSFileRecord = 0x0200, /* File record */
223: kHFSFolderThreadRecord = 0x0300, /* Folder thread record */
224: kHFSFileThreadRecord = 0x0400, /* File thread record */
225:
226: /* HFS Plus Catalog Records */
227: kHFSPlusFolderRecord = 1, /* Folder record */
228: kHFSPlusFileRecord = 2, /* File record */
229: kHFSPlusFolderThreadRecord = 3, /* Folder thread record */
230: kHFSPlusFileThreadRecord = 4 /* File thread record */
231: };
232:
233:
234: /* Catalog file record flags */
235: enum {
236: kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */
237: kHFSFileLockedMask = 0x0001,
238: kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */
239: kHFSThreadExistsMask = 0x0002
240: };
241:
242:
243: /* HFS catalog folder record - 70 bytes */
244: struct HFSCatalogFolder {
245: int16_t recordType; /* == kHFSFolderRecord */
246: u_int16_t flags; /* folder flags */
247: u_int16_t valence; /* folder valence */
248: u_int32_t folderID; /* folder ID */
249: u_int32_t createDate; /* date and time of creation */
250: u_int32_t modifyDate; /* date and time of last modification */
251: u_int32_t backupDate; /* date and time of last backup */
252: FndrDirInfo userInfo; /* Finder information */
253: FndrOpaqueInfo finderInfo; /* additional Finder information */
254: u_int32_t reserved[4]; /* reserved - initialized as zero */
255: };
256: typedef struct HFSCatalogFolder HFSCatalogFolder;
257:
258: /* HFS Plus catalog folder record - 88 bytes */
259: struct HFSPlusCatalogFolder {
260: int16_t recordType; /* == kHFSPlusFolderRecord */
261: u_int16_t flags; /* file flags */
262: u_int32_t valence; /* folder's valence (limited to 2^16 in Mac OS) */
263: u_int32_t folderID; /* folder ID */
264: u_int32_t createDate; /* date and time of creation */
265: u_int32_t contentModDate; /* date and time of last content modification */
266: u_int32_t attributeModDate; /* date and time of last attribute modification */
267: u_int32_t accessDate; /* date and time of last access (MacOS X only) */
268: u_int32_t backupDate; /* date and time of last backup */
269: HFSPlusPermissions permissions; /* permissions (for MacOS X) */
270: FndrDirInfo userInfo; /* Finder information */
271: FndrOpaqueInfo finderInfo; /* additional Finder information */
272: u_int32_t textEncoding; /* hint for name conversions */
273: u_int32_t reserved; /* reserved - initialized as zero */
274: };
275: typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
276:
277: /* HFS catalog file record - 102 bytes */
278: struct HFSCatalogFile {
279: int16_t recordType; /* == kHFSFileRecord */
280: u_int8_t flags; /* file flags */
281: int8_t fileType; /* file type (unused ?) */
282: FndrFileInfo userInfo; /* Finder information */
283: u_int32_t fileID; /* file ID */
284: u_int16_t dataStartBlock; /* not used - set to zero */
285: int32_t dataLogicalSize; /* logical EOF of data fork */
286: int32_t dataPhysicalSize; /* physical EOF of data fork */
287: u_int16_t rsrcStartBlock; /* not used - set to zero */
288: int32_t rsrcLogicalSize; /* logical EOF of resource fork */
289: int32_t rsrcPhysicalSize; /* physical EOF of resource fork */
290: u_int32_t createDate; /* date and time of creation */
291: u_int32_t modifyDate; /* date and time of last modification */
292: u_int32_t backupDate; /* date and time of last backup */
293: FndrOpaqueInfo finderInfo; /* additional Finder information */
294: u_int16_t clumpSize; /* file clump size (not used) */
295: HFSExtentRecord dataExtents; /* first data fork extent record */
296: HFSExtentRecord rsrcExtents; /* first resource fork extent record */
297: u_int32_t reserved; /* reserved - initialized as zero */
298: };
299: typedef struct HFSCatalogFile HFSCatalogFile;
300:
301: /* HFS Plus catalog file record - 248 bytes */
302: struct HFSPlusCatalogFile {
303: int16_t recordType; /* == kHFSPlusFileRecord */
304: u_int16_t flags; /* file flags */
305: u_int32_t linkCount; /* used by Mac OS X */
306: u_int32_t fileID; /* file ID */
307: u_int32_t createDate; /* date and time of creation */
308: u_int32_t contentModDate; /* date and time of last content modification */
309: u_int32_t attributeModDate; /* date and time of last attribute modification */
310: u_int32_t accessDate; /* date and time of last access (MacOS X only) */
311: u_int32_t backupDate; /* date and time of last backup */
312: HFSPlusPermissions permissions; /* permissions (for MacOS X) */
313: FndrFileInfo userInfo; /* Finder information */
314: FndrOpaqueInfo finderInfo; /* additional Finder information */
315: u_int32_t textEncoding; /* hint for name conversions */
316: u_int32_t reserved2; /* reserved - initialized as zero */
317:
318: /* Note: these start on double long (64 bit) boundry */
319: HFSPlusForkData dataFork; /* size and block data for data fork */
320: HFSPlusForkData resourceFork; /* size and block data for resource fork */
321: };
322: typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
323:
324: /* HFS catalog thread record - 46 bytes */
325: struct HFSCatalogThread {
326: int16_t recordType; /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */
327: int32_t reserved[2]; /* reserved - initialized as zero */
328: u_int32_t parentID; /* parent ID for this catalog node */
329: u_char nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */
330: };
331: typedef struct HFSCatalogThread HFSCatalogThread;
332:
333: /* HFS Plus catalog thread record -- 264 bytes */
334: struct HFSPlusCatalogThread {
335: int16_t recordType; /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */
336: int16_t reserved; /* reserved - initialized as zero */
337: u_int32_t parentID; /* parent ID for this catalog node */
338: HFSUniStr255 nodeName; /* name of this catalog node (variable length) */
339: };
340: typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
341:
342:
343: /*
344: These are the types of records in the attribute B-tree. The values were
345: chosen so that they wouldn't conflict with the catalog record types.
346: */
347: enum {
348: kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */
349: kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */
350: kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */
351: };
352:
353:
354: /*
355: HFSPlusAttrInlineData
356: For small attributes, whose entire value is stored within this one
357: B-tree record.
358: There would not be any other records for this attribute.
359: */
360: struct HFSPlusAttrInlineData {
361: u_int32_t recordType; /* == kHFSPlusAttrInlineData*/
362: u_int32_t reserved;
363: u_int32_t logicalSize; /* size in bytes of userData*/
364: u_int8_t userData[2]; /* variable length; space allocated is a multiple of 2 bytes*/
365: };
366: typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
367:
368:
369: /*
370: HFSPlusAttrForkData
371: For larger attributes, whose value is stored in allocation blocks.
372: If the attribute has more than 8 extents, there will be additonal
373: records (of type HFSPlusAttrExtents) for this attribute.
374: */
375: struct HFSPlusAttrForkData {
376: u_int32_t recordType; /* == kHFSPlusAttrForkData*/
377: u_int32_t reserved;
378: HFSPlusForkData theFork; /* size and first extents of value*/
379: };
380: typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
381:
382: /*
383: HFSPlusAttrExtents
384: This record contains information about overflow extents for large,
385: fragmented attributes.
386: */
387: struct HFSPlusAttrExtents {
388: u_int32_t recordType; /* == kHFSPlusAttrExtents*/
389: u_int32_t reserved;
390: HFSPlusExtentRecord extents; /* additional extents*/
391: };
392: typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
393:
394: /* A generic Attribute Record*/
395: union HFSPlusAttrRecord {
396: u_int32_t recordType;
397: HFSPlusAttrInlineData inlineData;
398: HFSPlusAttrForkData forkData;
399: HFSPlusAttrExtents overflowExtents;
400: };
401: typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
402:
403: /* Key and node lengths */
404: enum {
405: kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
406: kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t),
407: kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
408: kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
409: kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
410: kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1 + sizeof(u_int8_t)),
411: kHFSPlusCatalogMinNodeSize = 4096,
412: kHFSPlusExtentMinNodeSize = 512,
413: kHFSPlusAttrMinNodeSize = 4096
414: };
415:
416:
417: /* HFS and HFS Plus volume attribute bits */
418: enum {
419: /* Bits 0-6 are reserved (always cleared by MountVol call) */
420: kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */
421: kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */
422: kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */
423: kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */
424: kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */
425: /* Bits 12-14 are reserved for future use */
426: kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */
427:
428: kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
429: kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
430: kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
431: kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
432: kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
433: kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
434: kHFSMDBAttributesMask = 0x8380
435: };
436:
437:
438: /* HFS Master Directory Block - 162 bytes */
439: /* Stored at sector #2 (3rd sector) and second-to-last sector. */
440: struct HFSMasterDirectoryBlock {
441: u_int16_t drSigWord; /* == kHFSSigWord */
442: u_int32_t drCrDate; /* date and time of volume creation */
443: u_int32_t drLsMod; /* date and time of last modification */
444: u_int16_t drAtrb; /* volume attributes */
445: u_int16_t drNmFls; /* number of files in root folder */
446: u_int16_t drVBMSt; /* first block of volume bitmap */
447: u_int16_t drAllocPtr; /* start of next allocation search */
448: u_int16_t drNmAlBlks; /* number of allocation blocks in volume */
449: u_int32_t drAlBlkSiz; /* size (in bytes) of allocation blocks */
450: u_int32_t drClpSiz; /* default clump size */
451: u_int16_t drAlBlSt; /* first allocation block in volume */
452: u_int32_t drNxtCNID; /* next unused catalog node ID */
453: u_int16_t drFreeBks; /* number of unused allocation blocks */
454: u_char drVN[kHFSMaxVolumeNameChars + 1]; /* volume name */
455: u_int32_t drVolBkUp; /* date and time of last backup */
456: u_int16_t drVSeqNum; /* volume backup sequence number */
457: u_int32_t drWrCnt; /* volume write count */
458: u_int32_t drXTClpSiz; /* clump size for extents overflow file */
459: u_int32_t drCTClpSiz; /* clump size for catalog file */
460: u_int16_t drNmRtDirs; /* number of directories in root folder */
461: u_int32_t drFilCnt; /* number of files in volume */
462: u_int32_t drDirCnt; /* number of directories in volume */
463: u_int32_t drFndrInfo[8]; /* information used by the Finder */
464: u_int16_t drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
465: HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
466: u_int32_t drXTFlSize; /* size of extents overflow file */
467: HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */
468: u_int32_t drCTFlSize; /* size of catalog file */
469: HFSExtentRecord drCTExtRec; /* extent record for catalog file */
470: };
471: typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
472:
473:
474: /* HFS Plus Volume Header - 512 bytes */
475: /* Stored at sector #2 (3rd sector) and second-to-last sector. */
476: struct HFSPlusVolumeHeader {
477: u_int16_t signature; /* == kHFSPlusSigWord */
478: u_int16_t version; /* == kHFSPlusVersion */
479: u_int32_t attributes; /* volume attributes */
480: u_int32_t lastMountedVersion; /* implementation version which last mounted volume */
481: u_int32_t reserved; /* reserved - initialized as zero */
482:
483: u_int32_t createDate; /* date and time of volume creation */
484: u_int32_t modifyDate; /* date and time of last modification */
485: u_int32_t backupDate; /* date and time of last backup */
486: u_int32_t checkedDate; /* date and time of last disk check */
487:
488: u_int32_t fileCount; /* number of files in volume */
489: u_int32_t folderCount; /* number of directories in volume */
490:
491: u_int32_t blockSize; /* size (in bytes) of allocation blocks */
492: u_int32_t totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/
493: u_int32_t freeBlocks; /* number of unused allocation blocks */
494:
495: u_int32_t nextAllocation; /* start of next allocation search */
496: u_int32_t rsrcClumpSize; /* default resource fork clump size */
497: u_int32_t dataClumpSize; /* default data fork clump size */
498: u_int32_t nextCatalogID; /* next unused catalog node ID */
499:
500: u_int32_t writeCount; /* volume write count */
501: u_int64_t encodingsBitmap; /* which encodings have been use on this volume */
502:
503: u_int8_t finderInfo[32]; /* information used by the Finder */
504:
505: HFSPlusForkData allocationFile; /* allocation bitmap file */
506: HFSPlusForkData extentsFile; /* extents B-tree file */
507: HFSPlusForkData catalogFile; /* catalog B-tree file */
508: HFSPlusForkData attributesFile; /* extended attributes B-tree file */
509: HFSPlusForkData startupFile; /* boot file (secondary loader) */
510: };
511: typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
512:
513:
514: /* B-tree structures */
515:
516: enum BTreeKeyLimits{
517: kMaxKeyLength = 520
518: };
519:
520: union BTreeKey{
521: u_int8_t length8;
522: u_int16_t length16;
523: u_int8_t rawData [kMaxKeyLength+2];
524: };
525: typedef union BTreeKey BTreeKey;
526:
527: /* BTNodeDescriptor -- Every B-tree node starts with these fields. */
528: struct BTNodeDescriptor {
529: u_int32_t fLink; /* next node at this level*/
530: u_int32_t bLink; /* previous node at this level*/
531: int8_t kind; /* kind of node (leaf, index, header, map)*/
532: u_int8_t height; /* zero for header, map; child is one more than parent*/
533: u_int16_t numRecords; /* number of records in this node*/
534: u_int16_t reserved; /* reserved - initialized as zero */
535: };
536: typedef struct BTNodeDescriptor BTNodeDescriptor;
537:
538: /* Constants for BTNodeDescriptor kind */
539: enum {
540: kBTLeafNode = -1,
541: kBTIndexNode = 0,
542: kBTHeaderNode = 1,
543: kBTMapNode = 2
544: };
545:
546: /* BTHeaderRec -- The first record of a B-tree header node */
547: struct BTHeaderRec {
548: u_int16_t treeDepth; /* maximum height (usually leaf nodes) */
549: u_int32_t rootNode; /* node number of root node */
550: u_int32_t leafRecords; /* number of leaf records in all leaf nodes */
551: u_int32_t firstLeafNode; /* node number of first leaf node */
552: u_int32_t lastLeafNode; /* node number of last leaf node */
553: u_int16_t nodeSize; /* size of a node, in bytes */
554: u_int16_t maxKeyLength; /* reserved */
555: u_int32_t totalNodes; /* total number of nodes in tree */
556: u_int32_t freeNodes; /* number of unused (free) nodes in tree */
557: u_int16_t reserved1; /* unused */
558: u_int32_t clumpSize; /* reserved */
559: u_int8_t btreeType; /* reserved */
560: u_int8_t reserved2; /* reserved */
561: u_int32_t attributes; /* persistent attributes about the tree */
562: u_int32_t reserved3[16]; /* reserved */
563: };
564: typedef struct BTHeaderRec BTHeaderRec;
565:
566: /* Constants for BTHeaderRec attributes */
567: enum {
568: kBTBadCloseMask = 0x00000001, /* reserved */
569: kBTBigKeysMask = 0x00000002, /* key length field is 16 bits */
570: kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length */
571: };
572:
573: #pragma options align=reset
574:
575: #ifdef __cplusplus
576: }
577: #endif
578:
579: #endif /* __HFS_FORMAT__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.