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__ */