1 From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
2 Date: Thu, 24 Oct 2013 01:11:21 -0200
3 Subject: Add helper include files absent from the upstream package
5 Add some include files from an Apple system that contain the definition of
6 the data structures used by the programs that manipulate the filesystems.
8 include/bitstring.h | 164 +++++++++++
9 include/hfs/hfs_format.h | 689 +++++++++++++++++++++++++++++++++++++++++++++
10 include/hfs/hfs_mount.h | 78 +++++
11 include/sys/appleapiopts.h | 52 ++++
12 4 files changed, 983 insertions(+)
13 create mode 100644 include/bitstring.h
14 create mode 100644 include/hfs/hfs_format.h
15 create mode 100644 include/hfs/hfs_mount.h
16 create mode 100644 include/sys/appleapiopts.h
18 diff --git a/include/bitstring.h b/include/bitstring.h
20 index 0000000..fbecfbe
22 +++ b/include/bitstring.h
25 + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
27 + * @APPLE_LICENSE_HEADER_START@
29 + * The contents of this file constitute Original Code as defined in and
30 + * are subject to the Apple Public Source License Version 1.1 (the
31 + * "License"). You may not use this file except in compliance with the
32 + * License. Please obtain a copy of the License at
33 + * http://www.apple.com/publicsource and read it before using this file.
35 + * This Original Code and all software distributed under the License are
36 + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
37 + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
38 + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
39 + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
40 + * License for the specific language governing rights and limitations
41 + * under the License.
43 + * @APPLE_LICENSE_HEADER_END@
46 + * Copyright (c) 1989, 1993
47 + * The Regents of the University of California. All rights reserved.
49 + * This code is derived from software contributed to Berkeley by
52 + * Redistribution and use in source and binary forms, with or without
53 + * modification, are permitted provided that the following conditions
55 + * 1. Redistributions of source code must retain the above copyright
56 + * notice, this list of conditions and the following disclaimer.
57 + * 2. Redistributions in binary form must reproduce the above copyright
58 + * notice, this list of conditions and the following disclaimer in the
59 + * documentation and/or other materials provided with the distribution.
60 + * 3. All advertising materials mentioning features or use of this software
61 + * must display the following acknowledgement:
62 + * This product includes software developed by the University of
63 + * California, Berkeley and its contributors.
64 + * 4. Neither the name of the University nor the names of its contributors
65 + * may be used to endorse or promote products derived from this software
66 + * without specific prior written permission.
68 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
69 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
70 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
71 + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
72 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
73 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
74 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
75 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
76 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
77 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
80 + * @(#)bitstring.h 8.1 (Berkeley) 7/19/93
83 +#ifndef _BITSTRING_H_
84 +#define _BITSTRING_H_
86 +typedef unsigned char bitstr_t;
88 +/* internal macros */
89 + /* byte of the bitstring bit is in */
90 +#define _bit_byte(bit) \
93 + /* mask for the bit within its byte */
94 +#define _bit_mask(bit) \
97 +/* external macros */
98 + /* bytes in a bitstring of nbits bits */
99 +#define bitstr_size(nbits) \
100 + ((((nbits) - 1) >> 3) + 1)
102 + /* allocate a bitstring */
103 +#define bit_alloc(nbits) \
104 + (bitstr_t *)calloc(1, \
105 + (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t))
107 + /* allocate a bitstring on the stack */
108 +#define bit_decl(name, nbits) \
109 + (name)[bitstr_size(nbits)]
111 + /* is bit N of bitstring name set? */
112 +#define bit_test(name, bit) \
113 + ((name)[_bit_byte(bit)] & _bit_mask(bit))
115 + /* set bit N of bitstring name */
116 +#define bit_set(name, bit) \
117 + (name)[_bit_byte(bit)] |= _bit_mask(bit)
119 + /* clear bit N of bitstring name */
120 +#define bit_clear(name, bit) \
121 + (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
123 + /* clear bits start ... stop in bitstring */
124 +#define bit_nclear(name, start, stop) { \
125 + register bitstr_t *_name = name; \
126 + register int _start = start, _stop = stop; \
127 + register int _startbyte = _bit_byte(_start); \
128 + register int _stopbyte = _bit_byte(_stop); \
129 + if (_startbyte == _stopbyte) { \
130 + _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \
131 + (0xff << ((_stop&0x7) + 1))); \
133 + _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \
134 + while (++_startbyte < _stopbyte) \
135 + _name[_startbyte] = 0; \
136 + _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \
140 + /* set bits start ... stop in bitstring */
141 +#define bit_nset(name, start, stop) { \
142 + register bitstr_t *_name = name; \
143 + register int _start = start, _stop = stop; \
144 + register int _startbyte = _bit_byte(_start); \
145 + register int _stopbyte = _bit_byte(_stop); \
146 + if (_startbyte == _stopbyte) { \
147 + _name[_startbyte] |= ((0xff << (_start&0x7)) & \
148 + (0xff >> (7 - (_stop&0x7)))); \
150 + _name[_startbyte] |= 0xff << ((_start)&0x7); \
151 + while (++_startbyte < _stopbyte) \
152 + _name[_startbyte] = 0xff; \
153 + _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \
157 + /* find first bit clear in name */
158 +#define bit_ffc(name, nbits, value) { \
159 + register bitstr_t *_name = name; \
160 + register int _byte, _nbits = nbits; \
161 + register int _stopbyte = _bit_byte(_nbits), _value = -1; \
162 + for (_byte = 0; _byte <= _stopbyte; ++_byte) \
163 + if (_name[_byte] != 0xff) { \
164 + _value = _byte << 3; \
165 + for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \
166 + ++_value, _stopbyte >>= 1); \
169 + *(value) = _value; \
172 + /* find first bit set in name */
173 +#define bit_ffs(name, nbits, value) { \
174 + register bitstr_t *_name = name; \
175 + register int _byte, _nbits = nbits; \
176 + register int _stopbyte = _bit_byte(_nbits), _value = -1; \
177 + for (_byte = 0; _byte <= _stopbyte; ++_byte) \
178 + if (_name[_byte]) { \
179 + _value = _byte << 3; \
180 + for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
181 + ++_value, _stopbyte >>= 1); \
184 + *(value) = _value; \
187 +#endif /* !_BITSTRING_H_ */
188 diff --git a/include/hfs/hfs_format.h b/include/hfs/hfs_format.h
190 index 0000000..d820329
192 +++ b/include/hfs/hfs_format.h
195 + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
197 + * @APPLE_LICENSE_HEADER_START@
199 + * The contents of this file constitute Original Code as defined in and
200 + * are subject to the Apple Public Source License Version 1.1 (the
201 + * "License"). You may not use this file except in compliance with the
202 + * License. Please obtain a copy of the License at
203 + * http://www.apple.com/publicsource and read it before using this file.
205 + * This Original Code and all software distributed under the License are
206 + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
207 + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
208 + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
209 + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
210 + * License for the specific language governing rights and limitations
211 + * under the License.
213 + * @APPLE_LICENSE_HEADER_END@
215 +#ifndef __HFS_FORMAT__
216 +#define __HFS_FORMAT__
218 +#include "missing.h"
220 +#include <sys/appleapiopts.h>
225 + * This file describes the on-disk format for HFS and HFS Plus volumes.
226 + * The HFS Plus volume format is desciibed in detail in Apple Technote 1150.
228 + * http://developer.apple.com/technotes/tn/tn1150.html
236 +/* some on-disk hfs structures have 68K alignment (misaligned) */
238 +#define PACKED_S __attribute__((packed))
240 +/* Signatures used to differentiate between HFS and HFS Plus volumes */
242 + kHFSSigWord = 0x4244, /* 'BD' in ASCII */
243 + kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */
244 + kHFSXSigWord = 0x4858, /* 'HX' in ASCII */
246 + kHFSPlusVersion = 0x0004, /* 'H+' volumes are version 4 only */
247 + kHFSXVersion = 0x0005, /* 'HX' volumes start with version 5 */
249 + kHFSPlusMountVersion = 0x31302E30, /* '10.0' for Mac OS X */
250 + kHFSJMountVersion = 0x4846534a, /* 'HFSJ' for journaled HFS+ on OS X */
251 + kFSKMountVersion = 0x46534b21 /* 'FSK!' for failed journal replay */
257 + * Mac OS X has a special directory for linked and unlinked files (HFS Plus only).
258 + * This directory and its contents are never exported from the filesystem under
261 + * To make this folder name sort last, it has embedded null prefix.
262 + * (0xC0, 0x80 in UTF-8)
264 +#define HFSPLUSMETADATAFOLDER "\xC0\x80\xC0\x80\xC0\x80\xC0\x80HFS+ Private Data"
267 + * Files in the HFS Private Data folder have one of the following prefixes
268 + * followed by a decimal number (no leading zeros). For indirect nodes this
269 + * number is a 32 bit random number. For unlinked (deleted) files that are
270 + * still open, the number is the file ID for that file.
272 + * e.g. iNode7182000 and temp3296
274 +#define HFS_INODE_PREFIX "iNode"
275 +#define HFS_DELETE_PREFIX "temp"
277 +#endif /* __APPLE_API_PRIVATE */
280 + * Indirect link files (hard links) have the following type/creator.
283 + kHardLinkFileType = 0x686C6E6B, /* 'hlnk' */
284 + kHFSPlusCreator = 0x6866732B /* 'hfs+' */
288 +#ifndef _HFSUNISTR255_DEFINED_
289 +#define _HFSUNISTR255_DEFINED_
290 +/* Unicode strings are used for HFS Plus file and folder names */
291 +struct HFSUniStr255 {
292 + u_int16_t length; /* number of unicode characters */
293 + u_int16_t unicode[255]; /* unicode characters */
295 +typedef struct HFSUniStr255 HFSUniStr255;
296 +typedef const HFSUniStr255 *ConstHFSUniStr255Param;
297 +#endif /* _HFSUNISTR255_DEFINED_ */
300 + kHFSMaxVolumeNameChars = 27,
301 + kHFSMaxFileNameChars = 31,
302 + kHFSPlusMaxFileNameChars = 255
306 +/* Extent overflow file data structures */
308 +/* HFS Extent key */
309 +struct HFSExtentKey {
310 + u_int8_t keyLength; /* length of key, excluding this field */
311 + u_int8_t forkType; /* 0 = data fork, FF = resource fork */
312 + u_int32_t fileID; /* file ID */
313 + u_int16_t startBlock; /* first file allocation block number in this extent */
315 +typedef struct HFSExtentKey HFSExtentKey;
317 +/* HFS Plus Extent key */
318 +struct HFSPlusExtentKey {
319 + u_int16_t keyLength; /* length of key, excluding this field */
320 + u_int8_t forkType; /* 0 = data fork, FF = resource fork */
321 + u_int8_t pad; /* make the other fields align on 32-bit boundary */
322 + u_int32_t fileID; /* file ID */
323 + u_int32_t startBlock; /* first file allocation block number in this extent */
325 +typedef struct HFSPlusExtentKey HFSPlusExtentKey;
327 +/* Number of extent descriptors per extent record */
329 + kHFSExtentDensity = 3,
330 + kHFSPlusExtentDensity = 8
333 +/* HFS extent descriptor */
334 +struct HFSExtentDescriptor {
335 + u_int16_t startBlock; /* first allocation block */
336 + u_int16_t blockCount; /* number of allocation blocks */
338 +typedef struct HFSExtentDescriptor HFSExtentDescriptor;
340 +/* HFS Plus extent descriptor */
341 +struct HFSPlusExtentDescriptor {
342 + u_int32_t startBlock; /* first allocation block */
343 + u_int32_t blockCount; /* number of allocation blocks */
345 +typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
347 +/* HFS extent record */
348 +typedef HFSExtentDescriptor HFSExtentRecord[3];
350 +/* HFS Plus extent record */
351 +typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
354 +/* Finder information */
355 +struct FndrFileInfo {
356 + u_int32_t fdType; /* file type */
357 + u_int32_t fdCreator; /* file creator */
358 + u_int16_t fdFlags; /* Finder flags */
360 + int16_t v; /* file's location */
362 + } PACKED_S fdLocation;
365 +typedef struct FndrFileInfo FndrFileInfo;
367 +struct FndrDirInfo {
368 + struct { /* folder's window rectangle */
374 + unsigned short frFlags; /* Finder flags */
376 + u_int16_t v; /* folder's location */
378 + }PACKED_S frLocation;
381 +typedef struct FndrDirInfo FndrDirInfo;
383 +struct FndrOpaqueInfo {
386 +typedef struct FndrOpaqueInfo FndrOpaqueInfo;
389 +/* HFS Plus Fork data info - 80 bytes */
390 +struct HFSPlusForkData {
391 + u_int64_t logicalSize; /* fork's logical size in bytes */
392 + u_int32_t clumpSize; /* fork's clump size in bytes */
393 + u_int32_t totalBlocks; /* total blocks used by this fork */
394 + HFSPlusExtentRecord extents; /* initial set of extents */
396 +typedef struct HFSPlusForkData HFSPlusForkData;
399 +/* Mac OS X has 16 bytes worth of "BSD" info.
401 + * Note: Mac OS 9 implementations and applications
402 + * should preserve, but not change, this information.
404 +struct HFSPlusBSDInfo {
405 + u_int32_t ownerID; /* user or group ID of file/folder owner */
406 + u_int32_t groupID; /* additional user of group ID */
407 + u_int8_t adminFlags; /* super-user changeable flags */
408 + u_int8_t ownerFlags; /* owner changeable flags */
409 + u_int16_t fileMode; /* file type and permission bits */
411 + u_int32_t iNodeNum; /* indirect node number (hard links only) */
412 + u_int32_t linkCount; /* links that refer to this indirect node */
413 + u_int32_t rawDevice; /* special file device (FBLK and FCHR only) */
416 +typedef struct HFSPlusBSDInfo HFSPlusBSDInfo;
419 +/* Catalog file data structures */
422 + kHFSRootParentID = 1, /* Parent ID of the root folder */
423 + kHFSRootFolderID = 2, /* Folder ID of the root folder */
424 + kHFSExtentsFileID = 3, /* File ID of the extents file */
425 + kHFSCatalogFileID = 4, /* File ID of the catalog file */
426 + kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */
427 + kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */
428 + kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */
429 + kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */
430 + kHFSRepairCatalogFileID = 14, /* Used when rebuilding Catalog B-tree */
431 + kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */
432 + kHFSFirstUserCatalogNodeID = 16
435 +/* HFS catalog key */
436 +struct HFSCatalogKey {
437 + u_int8_t keyLength; /* key length (in bytes) */
438 + u_int8_t reserved; /* reserved (set to zero) */
439 + u_int32_t parentID; /* parent folder ID */
440 + u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */
442 +typedef struct HFSCatalogKey HFSCatalogKey;
444 +/* HFS Plus catalog key */
445 +struct HFSPlusCatalogKey {
446 + u_int16_t keyLength; /* key length (in bytes) */
447 + u_int32_t parentID; /* parent folder ID */
448 + HFSUniStr255 nodeName; /* catalog node name */
450 +typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
452 +/* Catalog record types */
454 + /* HFS Catalog Records */
455 + kHFSFolderRecord = 0x0100, /* Folder record */
456 + kHFSFileRecord = 0x0200, /* File record */
457 + kHFSFolderThreadRecord = 0x0300, /* Folder thread record */
458 + kHFSFileThreadRecord = 0x0400, /* File thread record */
460 + /* HFS Plus Catalog Records */
461 + kHFSPlusFolderRecord = 1, /* Folder record */
462 + kHFSPlusFileRecord = 2, /* File record */
463 + kHFSPlusFolderThreadRecord = 3, /* Folder thread record */
464 + kHFSPlusFileThreadRecord = 4 /* File thread record */
468 +/* Catalog file record flags */
470 + kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */
471 + kHFSFileLockedMask = 0x0001,
473 + kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */
474 + kHFSThreadExistsMask = 0x0002,
476 + kHFSHasAttributesBit = 0x0002, /* object has extended attributes */
477 + kHFSHasAttributesMask = 0x0004,
479 + kHFSHasSecurityBit = 0x0003, /* object has security data (ACLs) */
480 + kHFSHasSecurityMask = 0x0008
484 +/* HFS catalog folder record - 70 bytes */
485 +struct HFSCatalogFolder {
486 + int16_t recordType; /* == kHFSFolderRecord */
487 + u_int16_t flags; /* folder flags */
488 + u_int16_t valence; /* folder valence */
489 + u_int32_t folderID; /* folder ID */
490 + u_int32_t createDate; /* date and time of creation */
491 + u_int32_t modifyDate; /* date and time of last modification */
492 + u_int32_t backupDate; /* date and time of last backup */
493 + FndrDirInfo userInfo; /* Finder information */
494 + FndrOpaqueInfo finderInfo; /* additional Finder information */
495 + u_int32_t reserved[4]; /* reserved - initialized as zero */
497 +typedef struct HFSCatalogFolder HFSCatalogFolder;
499 +/* HFS Plus catalog folder record - 88 bytes */
500 +struct HFSPlusCatalogFolder {
501 + int16_t recordType; /* == kHFSPlusFolderRecord */
502 + u_int16_t flags; /* file flags */
503 + u_int32_t valence; /* folder's valence (limited to 2^16 in Mac OS) */
504 + u_int32_t folderID; /* folder ID */
505 + u_int32_t createDate; /* date and time of creation */
506 + u_int32_t contentModDate; /* date and time of last content modification */
507 + u_int32_t attributeModDate; /* date and time of last attribute modification */
508 + u_int32_t accessDate; /* date and time of last access (MacOS X only) */
509 + u_int32_t backupDate; /* date and time of last backup */
510 + HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
511 + FndrDirInfo userInfo; /* Finder information */
512 + FndrOpaqueInfo finderInfo; /* additional Finder information */
513 + u_int32_t textEncoding; /* hint for name conversions */
514 + u_int32_t attrBlocks; /* cached count of attribute data blocks */
516 +typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
518 +/* HFS catalog file record - 102 bytes */
519 +struct HFSCatalogFile {
520 + int16_t recordType; /* == kHFSFileRecord */
521 + u_int8_t flags; /* file flags */
522 + int8_t fileType; /* file type (unused ?) */
523 + FndrFileInfo userInfo; /* Finder information */
524 + u_int32_t fileID; /* file ID */
525 + u_int16_t dataStartBlock; /* not used - set to zero */
526 + int32_t dataLogicalSize; /* logical EOF of data fork */
527 + int32_t dataPhysicalSize; /* physical EOF of data fork */
528 + u_int16_t rsrcStartBlock; /* not used - set to zero */
529 + int32_t rsrcLogicalSize; /* logical EOF of resource fork */
530 + int32_t rsrcPhysicalSize; /* physical EOF of resource fork */
531 + u_int32_t createDate; /* date and time of creation */
532 + u_int32_t modifyDate; /* date and time of last modification */
533 + u_int32_t backupDate; /* date and time of last backup */
534 + FndrOpaqueInfo finderInfo; /* additional Finder information */
535 + u_int16_t clumpSize; /* file clump size (not used) */
536 + HFSExtentRecord dataExtents; /* first data fork extent record */
537 + HFSExtentRecord rsrcExtents; /* first resource fork extent record */
538 + u_int32_t reserved; /* reserved - initialized as zero */
540 +typedef struct HFSCatalogFile HFSCatalogFile;
542 +/* HFS Plus catalog file record - 248 bytes */
543 +struct HFSPlusCatalogFile {
544 + int16_t recordType; /* == kHFSPlusFileRecord */
545 + u_int16_t flags; /* file flags */
546 + u_int32_t reserved1; /* reserved - initialized as zero */
547 + u_int32_t fileID; /* file ID */
548 + u_int32_t createDate; /* date and time of creation */
549 + u_int32_t contentModDate; /* date and time of last content modification */
550 + u_int32_t attributeModDate; /* date and time of last attribute modification */
551 + u_int32_t accessDate; /* date and time of last access (MacOS X only) */
552 + u_int32_t backupDate; /* date and time of last backup */
553 + HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
554 + FndrFileInfo userInfo; /* Finder information */
555 + FndrOpaqueInfo finderInfo; /* additional Finder information */
556 + u_int32_t textEncoding; /* hint for name conversions */
557 + u_int32_t attrBlocks; /* cached count of attribute data blocks */
559 + /* Note: these start on double long (64 bit) boundry */
560 + HFSPlusForkData dataFork; /* size and block data for data fork */
561 + HFSPlusForkData resourceFork; /* size and block data for resource fork */
563 +typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
565 +/* HFS catalog thread record - 46 bytes */
566 +struct HFSCatalogThread {
567 + int16_t recordType; /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */
568 + int32_t reserved[2]; /* reserved - initialized as zero */
569 + u_int32_t parentID; /* parent ID for this catalog node */
570 + u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */
572 +typedef struct HFSCatalogThread HFSCatalogThread;
574 +/* HFS Plus catalog thread record -- 264 bytes */
575 +struct HFSPlusCatalogThread {
576 + int16_t recordType; /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */
577 + int16_t reserved; /* reserved - initialized as zero */
578 + u_int32_t parentID; /* parent ID for this catalog node */
579 + HFSUniStr255 nodeName; /* name of this catalog node (variable length) */
581 +typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
583 +#ifdef __APPLE_API_UNSTABLE
585 + These are the types of records in the attribute B-tree. The values were
586 + chosen so that they wouldn't conflict with the catalog record types.
589 + kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */
590 + kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */
591 + kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */
596 + HFSPlusAttrForkData
597 + For larger attributes, whose value is stored in allocation blocks.
598 + If the attribute has more than 8 extents, there will be additonal
599 + records (of type HFSPlusAttrExtents) for this attribute.
601 +struct HFSPlusAttrForkData {
602 + u_int32_t recordType; /* == kHFSPlusAttrForkData*/
603 + u_int32_t reserved;
604 + HFSPlusForkData theFork; /* size and first extents of value*/
606 +typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
610 + This record contains information about overflow extents for large,
611 + fragmented attributes.
613 +struct HFSPlusAttrExtents {
614 + u_int32_t recordType; /* == kHFSPlusAttrExtents*/
615 + u_int32_t reserved;
616 + HFSPlusExtentRecord extents; /* additional extents*/
618 +typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
621 + * Atrributes B-tree Data Record
623 + * For small attributes, whose entire value is stored
624 + * within a single B-tree record.
626 +struct HFSPlusAttrData {
627 + u_int32_t recordType; /* == kHFSPlusAttrInlineData */
628 + u_int32_t reserved[2];
629 + u_int32_t attrSize; /* size of attribute data in bytes */
630 + u_int8_t attrData[2]; /* variable length */
632 +typedef struct HFSPlusAttrData HFSPlusAttrData;
635 +/* HFSPlusAttrInlineData is obsolete use HFSPlusAttrData instead */
636 +struct HFSPlusAttrInlineData {
637 + u_int32_t recordType;
638 + u_int32_t reserved;
639 + u_int32_t logicalSize;
640 + u_int8_t userData[2];
642 +typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
645 +/* A generic Attribute Record*/
646 +union HFSPlusAttrRecord {
647 + u_int32_t recordType;
648 + HFSPlusAttrInlineData inlineData; /* NOT USED */
649 + HFSPlusAttrData attrData;
650 + HFSPlusAttrForkData forkData;
651 + HFSPlusAttrExtents overflowExtents;
653 +typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
656 +enum { kHFSMaxAttrNameLen = 127 };
657 +struct HFSPlusAttrKey {
658 + u_int16_t keyLength; /* key length (in bytes) */
659 + u_int16_t pad; /* set to zero */
660 + u_int32_t fileID; /* file associated with attribute */
661 + u_int32_t startBlock; /* first attribue allocation block number for extents */
662 + u_int16_t attrNameLen; /* number of unicode characters */
663 + u_int16_t attrName[127]; /* attribute name (Unicode) */
665 +typedef struct HFSPlusAttrKey HFSPlusAttrKey;
667 +#define kHFSPlusAttrKeyMaximumLength (sizeof(HFSPlusAttrKey) - sizeof(u_int16_t))
668 +#define kHFSPlusAttrKeyMinimumLength (kHFSPlusAttrKeyMaximumLength - (127 * sizeof(u_int16_t)))
670 +#endif /* __APPLE_API_UNSTABLE */
673 +/* Key and node lengths */
675 + kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
676 + kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t),
677 + kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
678 + kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
679 + kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
680 + kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1) + sizeof(u_int8_t),
681 + kHFSPlusCatalogMinNodeSize = 4096,
682 + kHFSPlusExtentMinNodeSize = 512,
683 + kHFSPlusAttrMinNodeSize = 4096
686 +/* HFS and HFS Plus volume attribute bits */
688 + /* Bits 0-6 are reserved (always cleared by MountVol call) */
689 + kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */
690 + kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */
691 + kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */
692 + kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */
693 + kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */
694 + kHFSCatalogNodeIDsReusedBit = 12,
695 + kHFSVolumeJournaledBit = 13, /* this volume has a journal on it */
696 + kHFSVolumeInconsistentBit = 14, /* serious inconsistencies detected at runtime */
697 + kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */
699 + kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
700 + kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
701 + kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
702 + kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
703 + kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
704 + kHFSCatalogNodeIDsReusedMask = 1 << kHFSCatalogNodeIDsReusedBit,
705 + kHFSVolumeJournaledMask = 1 << kHFSVolumeJournaledBit,
706 + kHFSVolumeInconsistentMask = 1 << kHFSVolumeInconsistentBit,
707 + kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
708 + kHFSMDBAttributesMask = 0x8380
712 +/* HFS Master Directory Block - 162 bytes */
713 +/* Stored at sector #2 (3rd sector) and second-to-last sector. */
714 +struct HFSMasterDirectoryBlock {
715 + u_int16_t drSigWord; /* == kHFSSigWord */
716 + u_int32_t drCrDate; /* date and time of volume creation */
717 + u_int32_t drLsMod; /* date and time of last modification */
718 + u_int16_t drAtrb; /* volume attributes */
719 + u_int16_t drNmFls; /* number of files in root folder */
720 + u_int16_t drVBMSt; /* first block of volume bitmap */
721 + u_int16_t drAllocPtr; /* start of next allocation search */
722 + u_int16_t drNmAlBlks; /* number of allocation blocks in volume */
723 + u_int32_t drAlBlkSiz; /* size (in bytes) of allocation blocks */
724 + u_int32_t drClpSiz; /* default clump size */
725 + u_int16_t drAlBlSt; /* first allocation block in volume */
726 + u_int32_t drNxtCNID; /* next unused catalog node ID */
727 + u_int16_t drFreeBks; /* number of unused allocation blocks */
728 + u_int8_t drVN[kHFSMaxVolumeNameChars + 1]; /* volume name */
729 + u_int32_t drVolBkUp; /* date and time of last backup */
730 + u_int16_t drVSeqNum; /* volume backup sequence number */
731 + u_int32_t drWrCnt; /* volume write count */
732 + u_int32_t drXTClpSiz; /* clump size for extents overflow file */
733 + u_int32_t drCTClpSiz; /* clump size for catalog file */
734 + u_int16_t drNmRtDirs; /* number of directories in root folder */
735 + u_int32_t drFilCnt; /* number of files in volume */
736 + u_int32_t drDirCnt; /* number of directories in volume */
737 + u_int32_t drFndrInfo[8]; /* information used by the Finder */
738 + u_int16_t drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
739 + HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
740 + u_int32_t drXTFlSize; /* size of extents overflow file */
741 + HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */
742 + u_int32_t drCTFlSize; /* size of catalog file */
743 + HFSExtentRecord drCTExtRec; /* extent record for catalog file */
745 +typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
748 +#ifdef __APPLE_API_UNSTABLE
749 +#define SET_HFS_TEXT_ENCODING(hint) \
750 + (0x656e6300 | ((hint) & 0xff))
751 +#define GET_HFS_TEXT_ENCODING(hint) \
752 + (((hint) & 0xffffff00) == 0x656e6300 ? (hint) & 0x000000ff : 0xffffffffU)
753 +#endif /* __APPLE_API_UNSTABLE */
756 +/* HFS Plus Volume Header - 512 bytes */
757 +/* Stored at sector #2 (3rd sector) and second-to-last sector. */
758 +struct HFSPlusVolumeHeader {
759 + u_int16_t signature; /* == kHFSPlusSigWord */
760 + u_int16_t version; /* == kHFSPlusVersion */
761 + u_int32_t attributes; /* volume attributes */
762 + u_int32_t lastMountedVersion; /* implementation version which last mounted volume */
763 + u_int32_t journalInfoBlock; /* block addr of journal info (if volume is journaled, zero otherwise) */
765 + u_int32_t createDate; /* date and time of volume creation */
766 + u_int32_t modifyDate; /* date and time of last modification */
767 + u_int32_t backupDate; /* date and time of last backup */
768 + u_int32_t checkedDate; /* date and time of last disk check */
770 + u_int32_t fileCount; /* number of files in volume */
771 + u_int32_t folderCount; /* number of directories in volume */
773 + u_int32_t blockSize; /* size (in bytes) of allocation blocks */
774 + u_int32_t totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/
775 + u_int32_t freeBlocks; /* number of unused allocation blocks */
777 + u_int32_t nextAllocation; /* start of next allocation search */
778 + u_int32_t rsrcClumpSize; /* default resource fork clump size */
779 + u_int32_t dataClumpSize; /* default data fork clump size */
780 + u_int32_t nextCatalogID; /* next unused catalog node ID */
782 + u_int32_t writeCount; /* volume write count */
783 + u_int64_t encodingsBitmap; /* which encodings have been use on this volume */
785 + u_int8_t finderInfo[32]; /* information used by the Finder */
787 + HFSPlusForkData allocationFile; /* allocation bitmap file */
788 + HFSPlusForkData extentsFile; /* extents B-tree file */
789 + HFSPlusForkData catalogFile; /* catalog B-tree file */
790 + HFSPlusForkData attributesFile; /* extended attributes B-tree file */
791 + HFSPlusForkData startupFile; /* boot file (secondary loader) */
793 +typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
796 +/* B-tree structures */
798 +enum BTreeKeyLimits{
799 + kMaxKeyLength = 520
804 + u_int16_t length16;
805 + u_int8_t rawData [kMaxKeyLength+2];
807 +typedef union BTreeKey BTreeKey;
809 +/* BTNodeDescriptor -- Every B-tree node starts with these fields. */
810 +struct BTNodeDescriptor {
811 + u_int32_t fLink; /* next node at this level*/
812 + u_int32_t bLink; /* previous node at this level*/
813 + int8_t kind; /* kind of node (leaf, index, header, map)*/
814 + u_int8_t height; /* zero for header, map; child is one more than parent*/
815 + u_int16_t numRecords; /* number of records in this node*/
816 + u_int16_t reserved; /* reserved - initialized as zero */
818 +typedef struct BTNodeDescriptor BTNodeDescriptor;
820 +/* Constants for BTNodeDescriptor kind */
828 +/* BTHeaderRec -- The first record of a B-tree header node */
829 +struct BTHeaderRec {
830 + u_int16_t treeDepth; /* maximum height (usually leaf nodes) */
831 + u_int32_t rootNode; /* node number of root node */
832 + u_int32_t leafRecords; /* number of leaf records in all leaf nodes */
833 + u_int32_t firstLeafNode; /* node number of first leaf node */
834 + u_int32_t lastLeafNode; /* node number of last leaf node */
835 + u_int16_t nodeSize; /* size of a node, in bytes */
836 + u_int16_t maxKeyLength; /* reserved */
837 + u_int32_t totalNodes; /* total number of nodes in tree */
838 + u_int32_t freeNodes; /* number of unused (free) nodes in tree */
839 + u_int16_t reserved1; /* unused */
840 + u_int32_t clumpSize; /* reserved */
841 + u_int8_t btreeType; /* reserved */
842 + u_int8_t keyCompareType; /* Key string Comparison Type */
843 + u_int32_t attributes; /* persistent attributes about the tree */
844 + u_int32_t reserved3[16]; /* reserved */
846 +typedef struct BTHeaderRec BTHeaderRec;
848 +/* Constants for BTHeaderRec attributes */
850 + kBTBadCloseMask = 0x00000001, /* reserved */
851 + kBTBigKeysMask = 0x00000002, /* key length field is 16 bits */
852 + kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length */
856 +/* Catalog Key Name Comparison Type */
858 + kHFSCaseFolding = 0xCF, /* case folding (case-insensitive) */
859 + kHFSBinaryCompare = 0xBC /* binary compare (case-sensitive) */
862 +/* JournalInfoBlock - Structure that describes where our journal lives */
863 +struct JournalInfoBlock {
865 + u_int32_t device_signature[8]; // signature used to locate our device.
866 + u_int64_t offset; // byte offset to the journal on the device
867 + u_int64_t size; // size in bytes of the journal
868 + u_int32_t reserved[32];
870 +typedef struct JournalInfoBlock JournalInfoBlock;
873 + kJIJournalInFSMask = 0x00000001,
874 + kJIJournalOnOtherDeviceMask = 0x00000002,
875 + kJIJournalNeedInitMask = 0x00000004
882 +#endif /* __HFS_FORMAT__ */
883 diff --git a/include/hfs/hfs_mount.h b/include/hfs/hfs_mount.h
885 index 0000000..ad729f2
887 +++ b/include/hfs/hfs_mount.h
890 + * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
892 + * @APPLE_LICENSE_HEADER_START@
894 + * The contents of this file constitute Original Code as defined in and
895 + * are subject to the Apple Public Source License Version 1.1 (the
896 + * "License"). You may not use this file except in compliance with the
897 + * License. Please obtain a copy of the License at
898 + * http://www.apple.com/publicsource and read it before using this file.
900 + * This Original Code and all software distributed under the License are
901 + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
902 + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
903 + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
904 + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
905 + * License for the specific language governing rights and limitations
906 + * under the License.
908 + * @APPLE_LICENSE_HEADER_END@
911 + * Copyright (c) 1997-2002 Apple Computer, Inc. All Rights Reserved
915 +#ifndef _HFS_MOUNT_H_
916 +#define _HFS_MOUNT_H_
918 +#include <sys/appleapiopts.h>
920 +#include <sys/mount.h>
921 +#include <sys/time.h>
924 + * Arguments to mount HFS-based filesystems
927 +#define OVERRIDE_UNKNOWN_PERMISSIONS 0
929 +#define UNKNOWNUID ((uid_t)99)
930 +#define UNKNOWNGID ((gid_t)99)
931 +#define UNKNOWNPERMISSIONS (S_IRWXU | S_IROTH | S_IXOTH) /* 705 */
933 +#ifdef __APPLE_API_UNSTABLE
934 +struct hfs_mount_args {
936 + char *fspec; /* block special device to mount */
938 + uid_t hfs_uid; /* uid that owns hfs files (standard HFS only) */
939 + gid_t hfs_gid; /* gid that owns hfs files (standard HFS only) */
940 + mode_t hfs_mask; /* mask to be applied for hfs perms (standard HFS only) */
941 + u_int32_t hfs_encoding; /* encoding for this volume (standard HFS only) */
942 + struct timezone hfs_timezone; /* user time zone info (standard HFS only) */
943 + int flags; /* mounting flags, see below */
944 + int journal_tbuffer_size; /* size in bytes of the journal transaction buffer */
945 + int journal_flags; /* flags to pass to journal_open/create */
946 + int journal_disable; /* don't use journaling (potentially dangerous) */
949 +#define HFSFSMNT_NOXONFILES 0x1 /* disable execute permissions for files */
950 +#define HFSFSMNT_WRAPPER 0x2 /* mount HFS wrapper (if it exists) */
951 +#define HFSFSMNT_EXTENDED_ARGS 0x4 /* indicates new fields after "flags" are valid */
954 + * Sysctl values for HFS
956 +#define HFS_ENCODINGBIAS 1 /* encoding matching CJK bias */
957 +#define HFS_EXTEND_FS 2
958 +#define HFS_ENCODINGHINT 3 /* guess encoding for string */
959 +#define HFS_ENABLE_JOURNALING 0x082969
960 +#define HFS_DISABLE_JOURNALING 0x031272
961 +#define HFS_GET_JOURNAL_INFO 0x6a6e6c69
962 +#define HFS_SET_PKG_EXTENSIONS 0x121031
964 +#endif /* __APPLE_API_UNSTABLE */
966 +#endif /* ! _HFS_MOUNT_H_ */
967 diff --git a/include/sys/appleapiopts.h b/include/sys/appleapiopts.h
969 index 0000000..4d2061f
971 +++ b/include/sys/appleapiopts.h
974 + * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
976 + * @APPLE_LICENSE_HEADER_START@
978 + * The contents of this file constitute Original Code as defined in and
979 + * are subject to the Apple Public Source License Version 1.1 (the
980 + * "License"). You may not use this file except in compliance with the
981 + * License. Please obtain a copy of the License at
982 + * http://www.apple.com/publicsource and read it before using this file.
984 + * This Original Code and all software distributed under the License are
985 + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
986 + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
987 + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
988 + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
989 + * License for the specific language governing rights and limitations
990 + * under the License.
992 + * @APPLE_LICENSE_HEADER_END@
995 +#ifndef __SYS_APPLEAPIOPTS_H__
996 +#define __SYS_APPLEAPIOPTS_H__
999 +#ifndef __APPLE_API_STANDARD
1000 +#define __APPLE_API_STANDARD
1001 +#endif /* __APPLE_API_STANDARD */
1003 +#ifndef __APPLE_API_STABLE
1004 +#define __APPLE_API_STABLE
1005 +#endif /* __APPLE_API_STABLE */
1007 +#ifndef __APPLE_API_STRICT_CONFORMANCE
1009 +#ifndef __APPLE_API_EVOLVING
1010 +#define __APPLE_API_EVOLVING
1011 +#endif /* __APPLE_API_EVOLVING */
1013 +#ifndef __APPLE_API_UNSTABLE
1014 +#define __APPLE_API_UNSTABLE
1015 +#endif /* __APPLE_API_UNSTABLE */
1017 +#ifndef __APPLE_API_OBSOLETE
1018 +#define __APPLE_API_OBSOLETE
1019 +#endif /* __APPLE_API_OBSOLETE */
1021 +#endif /* __APPLE_API_STRICT_CONFORMANCE */
1023 +#endif /* __SYS_APPLEAPIOPTS_H__ */