summaryrefslogtreecommitdiff
path: root/system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch')
-rw-r--r--system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch1024
1 files changed, 1024 insertions, 0 deletions
diff --git a/system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch b/system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch
new file mode 100644
index 0000000000..003f8440b0
--- /dev/null
+++ b/system/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch
@@ -0,0 +1,1024 @@
+From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
+Date: Thu, 24 Oct 2013 01:11:21 -0200
+Subject: Add helper include files absent from the upstream package
+
+Add some include files from an Apple system that contain the definition of
+the data structures used by the programs that manipulate the filesystems.
+---
+ include/bitstring.h | 164 +++++++++++
+ include/hfs/hfs_format.h | 689 +++++++++++++++++++++++++++++++++++++++++++++
+ include/hfs/hfs_mount.h | 78 +++++
+ include/sys/appleapiopts.h | 52 ++++
+ 4 files changed, 983 insertions(+)
+ create mode 100644 include/bitstring.h
+ create mode 100644 include/hfs/hfs_format.h
+ create mode 100644 include/hfs/hfs_mount.h
+ create mode 100644 include/sys/appleapiopts.h
+
+diff --git a/include/bitstring.h b/include/bitstring.h
+new file mode 100644
+index 0000000..fbecfbe
+--- /dev/null
++++ b/include/bitstring.h
+@@ -0,0 +1,164 @@
++/*
++ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
++ *
++ * @APPLE_LICENSE_HEADER_START@
++ *
++ * The contents of this file constitute Original Code as defined in and
++ * are subject to the Apple Public Source License Version 1.1 (the
++ * "License"). You may not use this file except in compliance with the
++ * License. Please obtain a copy of the License at
++ * http://www.apple.com/publicsource and read it before using this file.
++ *
++ * This Original Code and all software distributed under the License are
++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
++ * License for the specific language governing rights and limitations
++ * under the License.
++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++/*
++ * Copyright (c) 1989, 1993
++ * The Regents of the University of California. All rights reserved.
++ *
++ * This code is derived from software contributed to Berkeley by
++ * Paul Vixie.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgement:
++ * This product includes software developed by the University of
++ * California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * @(#)bitstring.h 8.1 (Berkeley) 7/19/93
++ */
++
++#ifndef _BITSTRING_H_
++#define _BITSTRING_H_
++
++typedef unsigned char bitstr_t;
++
++/* internal macros */
++ /* byte of the bitstring bit is in */
++#define _bit_byte(bit) \
++ ((bit) >> 3)
++
++ /* mask for the bit within its byte */
++#define _bit_mask(bit) \
++ (1 << ((bit)&0x7))
++
++/* external macros */
++ /* bytes in a bitstring of nbits bits */
++#define bitstr_size(nbits) \
++ ((((nbits) - 1) >> 3) + 1)
++
++ /* allocate a bitstring */
++#define bit_alloc(nbits) \
++ (bitstr_t *)calloc(1, \
++ (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t))
++
++ /* allocate a bitstring on the stack */
++#define bit_decl(name, nbits) \
++ (name)[bitstr_size(nbits)]
++
++ /* is bit N of bitstring name set? */
++#define bit_test(name, bit) \
++ ((name)[_bit_byte(bit)] & _bit_mask(bit))
++
++ /* set bit N of bitstring name */
++#define bit_set(name, bit) \
++ (name)[_bit_byte(bit)] |= _bit_mask(bit)
++
++ /* clear bit N of bitstring name */
++#define bit_clear(name, bit) \
++ (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
++
++ /* clear bits start ... stop in bitstring */
++#define bit_nclear(name, start, stop) { \
++ register bitstr_t *_name = name; \
++ register int _start = start, _stop = stop; \
++ register int _startbyte = _bit_byte(_start); \
++ register int _stopbyte = _bit_byte(_stop); \
++ if (_startbyte == _stopbyte) { \
++ _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \
++ (0xff << ((_stop&0x7) + 1))); \
++ } else { \
++ _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \
++ while (++_startbyte < _stopbyte) \
++ _name[_startbyte] = 0; \
++ _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \
++ } \
++}
++
++ /* set bits start ... stop in bitstring */
++#define bit_nset(name, start, stop) { \
++ register bitstr_t *_name = name; \
++ register int _start = start, _stop = stop; \
++ register int _startbyte = _bit_byte(_start); \
++ register int _stopbyte = _bit_byte(_stop); \
++ if (_startbyte == _stopbyte) { \
++ _name[_startbyte] |= ((0xff << (_start&0x7)) & \
++ (0xff >> (7 - (_stop&0x7)))); \
++ } else { \
++ _name[_startbyte] |= 0xff << ((_start)&0x7); \
++ while (++_startbyte < _stopbyte) \
++ _name[_startbyte] = 0xff; \
++ _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \
++ } \
++}
++
++ /* find first bit clear in name */
++#define bit_ffc(name, nbits, value) { \
++ register bitstr_t *_name = name; \
++ register int _byte, _nbits = nbits; \
++ register int _stopbyte = _bit_byte(_nbits), _value = -1; \
++ for (_byte = 0; _byte <= _stopbyte; ++_byte) \
++ if (_name[_byte] != 0xff) { \
++ _value = _byte << 3; \
++ for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \
++ ++_value, _stopbyte >>= 1); \
++ break; \
++ } \
++ *(value) = _value; \
++}
++
++ /* find first bit set in name */
++#define bit_ffs(name, nbits, value) { \
++ register bitstr_t *_name = name; \
++ register int _byte, _nbits = nbits; \
++ register int _stopbyte = _bit_byte(_nbits), _value = -1; \
++ for (_byte = 0; _byte <= _stopbyte; ++_byte) \
++ if (_name[_byte]) { \
++ _value = _byte << 3; \
++ for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
++ ++_value, _stopbyte >>= 1); \
++ break; \
++ } \
++ *(value) = _value; \
++}
++
++#endif /* !_BITSTRING_H_ */
+diff --git a/include/hfs/hfs_format.h b/include/hfs/hfs_format.h
+new file mode 100644
+index 0000000..d820329
+--- /dev/null
++++ b/include/hfs/hfs_format.h
+@@ -0,0 +1,689 @@
++/*
++ * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
++ *
++ * @APPLE_LICENSE_HEADER_START@
++ *
++ * The contents of this file constitute Original Code as defined in and
++ * are subject to the Apple Public Source License Version 1.1 (the
++ * "License"). You may not use this file except in compliance with the
++ * License. Please obtain a copy of the License at
++ * http://www.apple.com/publicsource and read it before using this file.
++ *
++ * This Original Code and all software distributed under the License are
++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
++ * License for the specific language governing rights and limitations
++ * under the License.
++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++#ifndef __HFS_FORMAT__
++#define __HFS_FORMAT__
++
++#include "missing.h"
++
++#include <sys/appleapiopts.h>
++
++/*
++ * hfs_format.c
++ *
++ * This file describes the on-disk format for HFS and HFS Plus volumes.
++ * The HFS Plus volume format is desciibed in detail in Apple Technote 1150.
++ *
++ * http://developer.apple.com/technotes/tn/tn1150.html
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* some on-disk hfs structures have 68K alignment (misaligned) */
++
++#define PACKED_S __attribute__((packed))
++
++/* Signatures used to differentiate between HFS and HFS Plus volumes */
++enum {
++ kHFSSigWord = 0x4244, /* 'BD' in ASCII */
++ kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */
++ kHFSXSigWord = 0x4858, /* 'HX' in ASCII */
++
++ kHFSPlusVersion = 0x0004, /* 'H+' volumes are version 4 only */
++ kHFSXVersion = 0x0005, /* 'HX' volumes start with version 5 */
++
++ kHFSPlusMountVersion = 0x31302E30, /* '10.0' for Mac OS X */
++ kHFSJMountVersion = 0x4846534a, /* 'HFSJ' for journaled HFS+ on OS X */
++ kFSKMountVersion = 0x46534b21 /* 'FSK!' for failed journal replay */
++}PACKED_S;
++
++
++#if 1
++/*
++ * Mac OS X has a special directory for linked and unlinked files (HFS Plus only).
++ * This directory and its contents are never exported from the filesystem under
++ * Mac OS X.
++ *
++ * To make this folder name sort last, it has embedded null prefix.
++ * (0xC0, 0x80 in UTF-8)
++ */
++#define HFSPLUSMETADATAFOLDER "\xC0\x80\xC0\x80\xC0\x80\xC0\x80HFS+ Private Data"
++
++/*
++ * Files in the HFS Private Data folder have one of the following prefixes
++ * followed by a decimal number (no leading zeros). For indirect nodes this
++ * number is a 32 bit random number. For unlinked (deleted) files that are
++ * still open, the number is the file ID for that file.
++ *
++ * e.g. iNode7182000 and temp3296
++ */
++#define HFS_INODE_PREFIX "iNode"
++#define HFS_DELETE_PREFIX "temp"
++
++#endif /* __APPLE_API_PRIVATE */
++
++/*
++ * Indirect link files (hard links) have the following type/creator.
++ */
++enum {
++ kHardLinkFileType = 0x686C6E6B, /* 'hlnk' */
++ kHFSPlusCreator = 0x6866732B /* 'hfs+' */
++}PACKED_S;
++
++
++#ifndef _HFSUNISTR255_DEFINED_
++#define _HFSUNISTR255_DEFINED_
++/* Unicode strings are used for HFS Plus file and folder names */
++struct HFSUniStr255 {
++ u_int16_t length; /* number of unicode characters */
++ u_int16_t unicode[255]; /* unicode characters */
++} PACKED_S;
++typedef struct HFSUniStr255 HFSUniStr255;
++typedef const HFSUniStr255 *ConstHFSUniStr255Param;
++#endif /* _HFSUNISTR255_DEFINED_ */
++
++enum {
++ kHFSMaxVolumeNameChars = 27,
++ kHFSMaxFileNameChars = 31,
++ kHFSPlusMaxFileNameChars = 255
++}PACKED_S;
++
++
++/* Extent overflow file data structures */
++
++/* HFS Extent key */
++struct HFSExtentKey {
++ u_int8_t keyLength; /* length of key, excluding this field */
++ u_int8_t forkType; /* 0 = data fork, FF = resource fork */
++ u_int32_t fileID; /* file ID */
++ u_int16_t startBlock; /* first file allocation block number in this extent */
++}PACKED_S;
++typedef struct HFSExtentKey HFSExtentKey;
++
++/* HFS Plus Extent key */
++struct HFSPlusExtentKey {
++ u_int16_t keyLength; /* length of key, excluding this field */
++ u_int8_t forkType; /* 0 = data fork, FF = resource fork */
++ u_int8_t pad; /* make the other fields align on 32-bit boundary */
++ u_int32_t fileID; /* file ID */
++ u_int32_t startBlock; /* first file allocation block number in this extent */
++}PACKED_S;
++typedef struct HFSPlusExtentKey HFSPlusExtentKey;
++
++/* Number of extent descriptors per extent record */
++enum {
++ kHFSExtentDensity = 3,
++ kHFSPlusExtentDensity = 8
++}PACKED_S;
++
++/* HFS extent descriptor */
++struct HFSExtentDescriptor {
++ u_int16_t startBlock; /* first allocation block */
++ u_int16_t blockCount; /* number of allocation blocks */
++}PACKED_S;
++typedef struct HFSExtentDescriptor HFSExtentDescriptor;
++
++/* HFS Plus extent descriptor */
++struct HFSPlusExtentDescriptor {
++ u_int32_t startBlock; /* first allocation block */
++ u_int32_t blockCount; /* number of allocation blocks */
++}PACKED_S;
++typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
++
++/* HFS extent record */
++typedef HFSExtentDescriptor HFSExtentRecord[3];
++
++/* HFS Plus extent record */
++typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
++
++
++/* Finder information */
++struct FndrFileInfo {
++ u_int32_t fdType; /* file type */
++ u_int32_t fdCreator; /* file creator */
++ u_int16_t fdFlags; /* Finder flags */
++ struct {
++ int16_t v; /* file's location */
++ int16_t h;
++ } PACKED_S fdLocation;
++ int16_t opaque;
++}PACKED_S;
++typedef struct FndrFileInfo FndrFileInfo;
++
++struct FndrDirInfo {
++ struct { /* folder's window rectangle */
++ int16_t top;
++ int16_t left;
++ int16_t bottom;
++ int16_t right;
++ }PACKED_S frRect;
++ unsigned short frFlags; /* Finder flags */
++ struct {
++ u_int16_t v; /* folder's location */
++ u_int16_t h;
++ }PACKED_S frLocation;
++ int16_t opaque;
++}PACKED_S;
++typedef struct FndrDirInfo FndrDirInfo;
++
++struct FndrOpaqueInfo {
++ int8_t opaque[16];
++}PACKED_S;
++typedef struct FndrOpaqueInfo FndrOpaqueInfo;
++
++
++/* HFS Plus Fork data info - 80 bytes */
++struct HFSPlusForkData {
++ u_int64_t logicalSize; /* fork's logical size in bytes */
++ u_int32_t clumpSize; /* fork's clump size in bytes */
++ u_int32_t totalBlocks; /* total blocks used by this fork */
++ HFSPlusExtentRecord extents; /* initial set of extents */
++}PACKED_S;
++typedef struct HFSPlusForkData HFSPlusForkData;
++
++
++/* Mac OS X has 16 bytes worth of "BSD" info.
++ *
++ * Note: Mac OS 9 implementations and applications
++ * should preserve, but not change, this information.
++ */
++struct HFSPlusBSDInfo {
++ u_int32_t ownerID; /* user or group ID of file/folder owner */
++ u_int32_t groupID; /* additional user of group ID */
++ u_int8_t adminFlags; /* super-user changeable flags */
++ u_int8_t ownerFlags; /* owner changeable flags */
++ u_int16_t fileMode; /* file type and permission bits */
++ union {
++ u_int32_t iNodeNum; /* indirect node number (hard links only) */
++ u_int32_t linkCount; /* links that refer to this indirect node */
++ u_int32_t rawDevice; /* special file device (FBLK and FCHR only) */
++ }PACKED_S special;
++}PACKED_S;
++typedef struct HFSPlusBSDInfo HFSPlusBSDInfo;
++
++
++/* Catalog file data structures */
++
++enum {
++ kHFSRootParentID = 1, /* Parent ID of the root folder */
++ kHFSRootFolderID = 2, /* Folder ID of the root folder */
++ kHFSExtentsFileID = 3, /* File ID of the extents file */
++ kHFSCatalogFileID = 4, /* File ID of the catalog file */
++ kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */
++ kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */
++ kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */
++ kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */
++ kHFSRepairCatalogFileID = 14, /* Used when rebuilding Catalog B-tree */
++ kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */
++ kHFSFirstUserCatalogNodeID = 16
++}PACKED_S;
++
++/* HFS catalog key */
++struct HFSCatalogKey {
++ u_int8_t keyLength; /* key length (in bytes) */
++ u_int8_t reserved; /* reserved (set to zero) */
++ u_int32_t parentID; /* parent folder ID */
++ u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */
++}PACKED_S;
++typedef struct HFSCatalogKey HFSCatalogKey;
++
++/* HFS Plus catalog key */
++struct HFSPlusCatalogKey {
++ u_int16_t keyLength; /* key length (in bytes) */
++ u_int32_t parentID; /* parent folder ID */
++ HFSUniStr255 nodeName; /* catalog node name */
++}PACKED_S;
++typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
++
++/* Catalog record types */
++enum {
++ /* HFS Catalog Records */
++ kHFSFolderRecord = 0x0100, /* Folder record */
++ kHFSFileRecord = 0x0200, /* File record */
++ kHFSFolderThreadRecord = 0x0300, /* Folder thread record */
++ kHFSFileThreadRecord = 0x0400, /* File thread record */
++
++ /* HFS Plus Catalog Records */
++ kHFSPlusFolderRecord = 1, /* Folder record */
++ kHFSPlusFileRecord = 2, /* File record */
++ kHFSPlusFolderThreadRecord = 3, /* Folder thread record */
++ kHFSPlusFileThreadRecord = 4 /* File thread record */
++}PACKED_S;
++
++
++/* Catalog file record flags */
++enum {
++ kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */
++ kHFSFileLockedMask = 0x0001,
++
++ kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */
++ kHFSThreadExistsMask = 0x0002,
++
++ kHFSHasAttributesBit = 0x0002, /* object has extended attributes */
++ kHFSHasAttributesMask = 0x0004,
++
++ kHFSHasSecurityBit = 0x0003, /* object has security data (ACLs) */
++ kHFSHasSecurityMask = 0x0008
++}PACKED_S;
++
++
++/* HFS catalog folder record - 70 bytes */
++struct HFSCatalogFolder {
++ int16_t recordType; /* == kHFSFolderRecord */
++ u_int16_t flags; /* folder flags */
++ u_int16_t valence; /* folder valence */
++ u_int32_t folderID; /* folder ID */
++ u_int32_t createDate; /* date and time of creation */
++ u_int32_t modifyDate; /* date and time of last modification */
++ u_int32_t backupDate; /* date and time of last backup */
++ FndrDirInfo userInfo; /* Finder information */
++ FndrOpaqueInfo finderInfo; /* additional Finder information */
++ u_int32_t reserved[4]; /* reserved - initialized as zero */
++}PACKED_S;
++typedef struct HFSCatalogFolder HFSCatalogFolder;
++
++/* HFS Plus catalog folder record - 88 bytes */
++struct HFSPlusCatalogFolder {
++ int16_t recordType; /* == kHFSPlusFolderRecord */
++ u_int16_t flags; /* file flags */
++ u_int32_t valence; /* folder's valence (limited to 2^16 in Mac OS) */
++ u_int32_t folderID; /* folder ID */
++ u_int32_t createDate; /* date and time of creation */
++ u_int32_t contentModDate; /* date and time of last content modification */
++ u_int32_t attributeModDate; /* date and time of last attribute modification */
++ u_int32_t accessDate; /* date and time of last access (MacOS X only) */
++ u_int32_t backupDate; /* date and time of last backup */
++ HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
++ FndrDirInfo userInfo; /* Finder information */
++ FndrOpaqueInfo finderInfo; /* additional Finder information */
++ u_int32_t textEncoding; /* hint for name conversions */
++ u_int32_t attrBlocks; /* cached count of attribute data blocks */
++}PACKED_S;
++typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
++
++/* HFS catalog file record - 102 bytes */
++struct HFSCatalogFile {
++ int16_t recordType; /* == kHFSFileRecord */
++ u_int8_t flags; /* file flags */
++ int8_t fileType; /* file type (unused ?) */
++ FndrFileInfo userInfo; /* Finder information */
++ u_int32_t fileID; /* file ID */
++ u_int16_t dataStartBlock; /* not used - set to zero */
++ int32_t dataLogicalSize; /* logical EOF of data fork */
++ int32_t dataPhysicalSize; /* physical EOF of data fork */
++ u_int16_t rsrcStartBlock; /* not used - set to zero */
++ int32_t rsrcLogicalSize; /* logical EOF of resource fork */
++ int32_t rsrcPhysicalSize; /* physical EOF of resource fork */
++ u_int32_t createDate; /* date and time of creation */
++ u_int32_t modifyDate; /* date and time of last modification */
++ u_int32_t backupDate; /* date and time of last backup */
++ FndrOpaqueInfo finderInfo; /* additional Finder information */
++ u_int16_t clumpSize; /* file clump size (not used) */
++ HFSExtentRecord dataExtents; /* first data fork extent record */
++ HFSExtentRecord rsrcExtents; /* first resource fork extent record */
++ u_int32_t reserved; /* reserved - initialized as zero */
++}PACKED_S;
++typedef struct HFSCatalogFile HFSCatalogFile;
++
++/* HFS Plus catalog file record - 248 bytes */
++struct HFSPlusCatalogFile {
++ int16_t recordType; /* == kHFSPlusFileRecord */
++ u_int16_t flags; /* file flags */
++ u_int32_t reserved1; /* reserved - initialized as zero */
++ u_int32_t fileID; /* file ID */
++ u_int32_t createDate; /* date and time of creation */
++ u_int32_t contentModDate; /* date and time of last content modification */
++ u_int32_t attributeModDate; /* date and time of last attribute modification */
++ u_int32_t accessDate; /* date and time of last access (MacOS X only) */
++ u_int32_t backupDate; /* date and time of last backup */
++ HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
++ FndrFileInfo userInfo; /* Finder information */
++ FndrOpaqueInfo finderInfo; /* additional Finder information */
++ u_int32_t textEncoding; /* hint for name conversions */
++ u_int32_t attrBlocks; /* cached count of attribute data blocks */
++
++ /* Note: these start on double long (64 bit) boundry */
++ HFSPlusForkData dataFork; /* size and block data for data fork */
++ HFSPlusForkData resourceFork; /* size and block data for resource fork */
++}PACKED_S;
++typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
++
++/* HFS catalog thread record - 46 bytes */
++struct HFSCatalogThread {
++ int16_t recordType; /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */
++ int32_t reserved[2]; /* reserved - initialized as zero */
++ u_int32_t parentID; /* parent ID for this catalog node */
++ u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */
++}PACKED_S;
++typedef struct HFSCatalogThread HFSCatalogThread;
++
++/* HFS Plus catalog thread record -- 264 bytes */
++struct HFSPlusCatalogThread {
++ int16_t recordType; /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */
++ int16_t reserved; /* reserved - initialized as zero */
++ u_int32_t parentID; /* parent ID for this catalog node */
++ HFSUniStr255 nodeName; /* name of this catalog node (variable length) */
++}PACKED_S;
++typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
++
++#ifdef __APPLE_API_UNSTABLE
++/*
++ These are the types of records in the attribute B-tree. The values were
++ chosen so that they wouldn't conflict with the catalog record types.
++*/
++enum {
++ kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */
++ kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */
++ kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */
++}PACKED_S;
++
++
++/*
++ HFSPlusAttrForkData
++ For larger attributes, whose value is stored in allocation blocks.
++ If the attribute has more than 8 extents, there will be additonal
++ records (of type HFSPlusAttrExtents) for this attribute.
++*/
++struct HFSPlusAttrForkData {
++ u_int32_t recordType; /* == kHFSPlusAttrForkData*/
++ u_int32_t reserved;
++ HFSPlusForkData theFork; /* size and first extents of value*/
++}PACKED_S;
++typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
++
++/*
++ HFSPlusAttrExtents
++ This record contains information about overflow extents for large,
++ fragmented attributes.
++*/
++struct HFSPlusAttrExtents {
++ u_int32_t recordType; /* == kHFSPlusAttrExtents*/
++ u_int32_t reserved;
++ HFSPlusExtentRecord extents; /* additional extents*/
++}PACKED_S;
++typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
++
++/*
++ * Atrributes B-tree Data Record
++ *
++ * For small attributes, whose entire value is stored
++ * within a single B-tree record.
++ */
++struct HFSPlusAttrData {
++ u_int32_t recordType; /* == kHFSPlusAttrInlineData */
++ u_int32_t reserved[2];
++ u_int32_t attrSize; /* size of attribute data in bytes */
++ u_int8_t attrData[2]; /* variable length */
++}PACKED_S;
++typedef struct HFSPlusAttrData HFSPlusAttrData;
++
++
++/* HFSPlusAttrInlineData is obsolete use HFSPlusAttrData instead */
++struct HFSPlusAttrInlineData {
++ u_int32_t recordType;
++ u_int32_t reserved;
++ u_int32_t logicalSize;
++ u_int8_t userData[2];
++}PACKED_S;
++typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
++
++
++/* A generic Attribute Record*/
++union HFSPlusAttrRecord {
++ u_int32_t recordType;
++ HFSPlusAttrInlineData inlineData; /* NOT USED */
++ HFSPlusAttrData attrData;
++ HFSPlusAttrForkData forkData;
++ HFSPlusAttrExtents overflowExtents;
++}PACKED_S;
++typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
++
++/* Attribute key */
++enum { kHFSMaxAttrNameLen = 127 };
++struct HFSPlusAttrKey {
++ u_int16_t keyLength; /* key length (in bytes) */
++ u_int16_t pad; /* set to zero */
++ u_int32_t fileID; /* file associated with attribute */
++ u_int32_t startBlock; /* first attribue allocation block number for extents */
++ u_int16_t attrNameLen; /* number of unicode characters */
++ u_int16_t attrName[127]; /* attribute name (Unicode) */
++}PACKED_S;
++typedef struct HFSPlusAttrKey HFSPlusAttrKey;
++
++#define kHFSPlusAttrKeyMaximumLength (sizeof(HFSPlusAttrKey) - sizeof(u_int16_t))
++#define kHFSPlusAttrKeyMinimumLength (kHFSPlusAttrKeyMaximumLength - (127 * sizeof(u_int16_t)))
++
++#endif /* __APPLE_API_UNSTABLE */
++
++
++/* Key and node lengths */
++enum {
++ kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
++ kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t),
++ kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
++ kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
++ kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
++ kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1) + sizeof(u_int8_t),
++ kHFSPlusCatalogMinNodeSize = 4096,
++ kHFSPlusExtentMinNodeSize = 512,
++ kHFSPlusAttrMinNodeSize = 4096
++}PACKED_S;
++
++/* HFS and HFS Plus volume attribute bits */
++enum {
++ /* Bits 0-6 are reserved (always cleared by MountVol call) */
++ kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */
++ kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */
++ kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */
++ kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */
++ kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */
++ kHFSCatalogNodeIDsReusedBit = 12,
++ kHFSVolumeJournaledBit = 13, /* this volume has a journal on it */
++ kHFSVolumeInconsistentBit = 14, /* serious inconsistencies detected at runtime */
++ kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */
++
++ kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
++ kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
++ kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
++ kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
++ kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
++ kHFSCatalogNodeIDsReusedMask = 1 << kHFSCatalogNodeIDsReusedBit,
++ kHFSVolumeJournaledMask = 1 << kHFSVolumeJournaledBit,
++ kHFSVolumeInconsistentMask = 1 << kHFSVolumeInconsistentBit,
++ kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
++ kHFSMDBAttributesMask = 0x8380
++}PACKED_S;
++
++
++/* HFS Master Directory Block - 162 bytes */
++/* Stored at sector #2 (3rd sector) and second-to-last sector. */
++struct HFSMasterDirectoryBlock {
++ u_int16_t drSigWord; /* == kHFSSigWord */
++ u_int32_t drCrDate; /* date and time of volume creation */
++ u_int32_t drLsMod; /* date and time of last modification */
++ u_int16_t drAtrb; /* volume attributes */
++ u_int16_t drNmFls; /* number of files in root folder */
++ u_int16_t drVBMSt; /* first block of volume bitmap */
++ u_int16_t drAllocPtr; /* start of next allocation search */
++ u_int16_t drNmAlBlks; /* number of allocation blocks in volume */
++ u_int32_t drAlBlkSiz; /* size (in bytes) of allocation blocks */
++ u_int32_t drClpSiz; /* default clump size */
++ u_int16_t drAlBlSt; /* first allocation block in volume */
++ u_int32_t drNxtCNID; /* next unused catalog node ID */
++ u_int16_t drFreeBks; /* number of unused allocation blocks */
++ u_int8_t drVN[kHFSMaxVolumeNameChars + 1]; /* volume name */
++ u_int32_t drVolBkUp; /* date and time of last backup */
++ u_int16_t drVSeqNum; /* volume backup sequence number */
++ u_int32_t drWrCnt; /* volume write count */
++ u_int32_t drXTClpSiz; /* clump size for extents overflow file */
++ u_int32_t drCTClpSiz; /* clump size for catalog file */
++ u_int16_t drNmRtDirs; /* number of directories in root folder */
++ u_int32_t drFilCnt; /* number of files in volume */
++ u_int32_t drDirCnt; /* number of directories in volume */
++ u_int32_t drFndrInfo[8]; /* information used by the Finder */
++ u_int16_t drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
++ HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
++ u_int32_t drXTFlSize; /* size of extents overflow file */
++ HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */
++ u_int32_t drCTFlSize; /* size of catalog file */
++ HFSExtentRecord drCTExtRec; /* extent record for catalog file */
++}PACKED_S;
++typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
++
++
++#ifdef __APPLE_API_UNSTABLE
++#define SET_HFS_TEXT_ENCODING(hint) \
++ (0x656e6300 | ((hint) & 0xff))
++#define GET_HFS_TEXT_ENCODING(hint) \
++ (((hint) & 0xffffff00) == 0x656e6300 ? (hint) & 0x000000ff : 0xffffffffU)
++#endif /* __APPLE_API_UNSTABLE */
++
++
++/* HFS Plus Volume Header - 512 bytes */
++/* Stored at sector #2 (3rd sector) and second-to-last sector. */
++struct HFSPlusVolumeHeader {
++ u_int16_t signature; /* == kHFSPlusSigWord */
++ u_int16_t version; /* == kHFSPlusVersion */
++ u_int32_t attributes; /* volume attributes */
++ u_int32_t lastMountedVersion; /* implementation version which last mounted volume */
++ u_int32_t journalInfoBlock; /* block addr of journal info (if volume is journaled, zero otherwise) */
++
++ u_int32_t createDate; /* date and time of volume creation */
++ u_int32_t modifyDate; /* date and time of last modification */
++ u_int32_t backupDate; /* date and time of last backup */
++ u_int32_t checkedDate; /* date and time of last disk check */
++
++ u_int32_t fileCount; /* number of files in volume */
++ u_int32_t folderCount; /* number of directories in volume */
++
++ u_int32_t blockSize; /* size (in bytes) of allocation blocks */
++ u_int32_t totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/
++ u_int32_t freeBlocks; /* number of unused allocation blocks */
++
++ u_int32_t nextAllocation; /* start of next allocation search */
++ u_int32_t rsrcClumpSize; /* default resource fork clump size */
++ u_int32_t dataClumpSize; /* default data fork clump size */
++ u_int32_t nextCatalogID; /* next unused catalog node ID */
++
++ u_int32_t writeCount; /* volume write count */
++ u_int64_t encodingsBitmap; /* which encodings have been use on this volume */
++
++ u_int8_t finderInfo[32]; /* information used by the Finder */
++
++ HFSPlusForkData allocationFile; /* allocation bitmap file */
++ HFSPlusForkData extentsFile; /* extents B-tree file */
++ HFSPlusForkData catalogFile; /* catalog B-tree file */
++ HFSPlusForkData attributesFile; /* extended attributes B-tree file */
++ HFSPlusForkData startupFile; /* boot file (secondary loader) */
++}PACKED_S;
++typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
++
++
++/* B-tree structures */
++
++enum BTreeKeyLimits{
++ kMaxKeyLength = 520
++}PACKED_S;
++
++union BTreeKey{
++ u_int8_t length8;
++ u_int16_t length16;
++ u_int8_t rawData [kMaxKeyLength+2];
++}PACKED_S;
++typedef union BTreeKey BTreeKey;
++
++/* BTNodeDescriptor -- Every B-tree node starts with these fields. */
++struct BTNodeDescriptor {
++ u_int32_t fLink; /* next node at this level*/
++ u_int32_t bLink; /* previous node at this level*/
++ int8_t kind; /* kind of node (leaf, index, header, map)*/
++ u_int8_t height; /* zero for header, map; child is one more than parent*/
++ u_int16_t numRecords; /* number of records in this node*/
++ u_int16_t reserved; /* reserved - initialized as zero */
++}PACKED_S;
++typedef struct BTNodeDescriptor BTNodeDescriptor;
++
++/* Constants for BTNodeDescriptor kind */
++enum {
++ kBTLeafNode = -1,
++ kBTIndexNode = 0,
++ kBTHeaderNode = 1,
++ kBTMapNode = 2
++}PACKED_S;
++
++/* BTHeaderRec -- The first record of a B-tree header node */
++struct BTHeaderRec {
++ u_int16_t treeDepth; /* maximum height (usually leaf nodes) */
++ u_int32_t rootNode; /* node number of root node */
++ u_int32_t leafRecords; /* number of leaf records in all leaf nodes */
++ u_int32_t firstLeafNode; /* node number of first leaf node */
++ u_int32_t lastLeafNode; /* node number of last leaf node */
++ u_int16_t nodeSize; /* size of a node, in bytes */
++ u_int16_t maxKeyLength; /* reserved */
++ u_int32_t totalNodes; /* total number of nodes in tree */
++ u_int32_t freeNodes; /* number of unused (free) nodes in tree */
++ u_int16_t reserved1; /* unused */
++ u_int32_t clumpSize; /* reserved */
++ u_int8_t btreeType; /* reserved */
++ u_int8_t keyCompareType; /* Key string Comparison Type */
++ u_int32_t attributes; /* persistent attributes about the tree */
++ u_int32_t reserved3[16]; /* reserved */
++}PACKED_S;
++typedef struct BTHeaderRec BTHeaderRec;
++
++/* Constants for BTHeaderRec attributes */
++enum {
++ kBTBadCloseMask = 0x00000001, /* reserved */
++ kBTBigKeysMask = 0x00000002, /* key length field is 16 bits */
++ kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length */
++}PACKED_S;
++
++
++/* Catalog Key Name Comparison Type */
++enum {
++ kHFSCaseFolding = 0xCF, /* case folding (case-insensitive) */
++ kHFSBinaryCompare = 0xBC /* binary compare (case-sensitive) */
++}PACKED_S;
++
++/* JournalInfoBlock - Structure that describes where our journal lives */
++struct JournalInfoBlock {
++ u_int32_t flags;
++ u_int32_t device_signature[8]; // signature used to locate our device.
++ u_int64_t offset; // byte offset to the journal on the device
++ u_int64_t size; // size in bytes of the journal
++ u_int32_t reserved[32];
++}PACKED_S;
++typedef struct JournalInfoBlock JournalInfoBlock;
++
++enum {
++ kJIJournalInFSMask = 0x00000001,
++ kJIJournalOnOtherDeviceMask = 0x00000002,
++ kJIJournalNeedInitMask = 0x00000004
++}PACKED_S;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __HFS_FORMAT__ */
+diff --git a/include/hfs/hfs_mount.h b/include/hfs/hfs_mount.h
+new file mode 100644
+index 0000000..ad729f2
+--- /dev/null
++++ b/include/hfs/hfs_mount.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
++ *
++ * @APPLE_LICENSE_HEADER_START@
++ *
++ * The contents of this file constitute Original Code as defined in and
++ * are subject to the Apple Public Source License Version 1.1 (the
++ * "License"). You may not use this file except in compliance with the
++ * License. Please obtain a copy of the License at
++ * http://www.apple.com/publicsource and read it before using this file.
++ *
++ * This Original Code and all software distributed under the License are
++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
++ * License for the specific language governing rights and limitations
++ * under the License.
++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++/*
++ * Copyright (c) 1997-2002 Apple Computer, Inc. All Rights Reserved
++ *
++ */
++
++#ifndef _HFS_MOUNT_H_
++#define _HFS_MOUNT_H_
++
++#include <sys/appleapiopts.h>
++
++#include <sys/mount.h>
++#include <sys/time.h>
++
++/*
++ * Arguments to mount HFS-based filesystems
++ */
++
++#define OVERRIDE_UNKNOWN_PERMISSIONS 0
++
++#define UNKNOWNUID ((uid_t)99)
++#define UNKNOWNGID ((gid_t)99)
++#define UNKNOWNPERMISSIONS (S_IRWXU | S_IROTH | S_IXOTH) /* 705 */
++
++#ifdef __APPLE_API_UNSTABLE
++struct hfs_mount_args {
++#ifndef KERNEL
++ char *fspec; /* block special device to mount */
++#endif
++ uid_t hfs_uid; /* uid that owns hfs files (standard HFS only) */
++ gid_t hfs_gid; /* gid that owns hfs files (standard HFS only) */
++ mode_t hfs_mask; /* mask to be applied for hfs perms (standard HFS only) */
++ u_int32_t hfs_encoding; /* encoding for this volume (standard HFS only) */
++ struct timezone hfs_timezone; /* user time zone info (standard HFS only) */
++ int flags; /* mounting flags, see below */
++ int journal_tbuffer_size; /* size in bytes of the journal transaction buffer */
++ int journal_flags; /* flags to pass to journal_open/create */
++ int journal_disable; /* don't use journaling (potentially dangerous) */
++};
++
++#define HFSFSMNT_NOXONFILES 0x1 /* disable execute permissions for files */
++#define HFSFSMNT_WRAPPER 0x2 /* mount HFS wrapper (if it exists) */
++#define HFSFSMNT_EXTENDED_ARGS 0x4 /* indicates new fields after "flags" are valid */
++
++/*
++ * Sysctl values for HFS
++ */
++#define HFS_ENCODINGBIAS 1 /* encoding matching CJK bias */
++#define HFS_EXTEND_FS 2
++#define HFS_ENCODINGHINT 3 /* guess encoding for string */
++#define HFS_ENABLE_JOURNALING 0x082969
++#define HFS_DISABLE_JOURNALING 0x031272
++#define HFS_GET_JOURNAL_INFO 0x6a6e6c69
++#define HFS_SET_PKG_EXTENSIONS 0x121031
++
++#endif /* __APPLE_API_UNSTABLE */
++
++#endif /* ! _HFS_MOUNT_H_ */
+diff --git a/include/sys/appleapiopts.h b/include/sys/appleapiopts.h
+new file mode 100644
+index 0000000..4d2061f
+--- /dev/null
++++ b/include/sys/appleapiopts.h
+@@ -0,0 +1,52 @@
++/*
++ * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
++ *
++ * @APPLE_LICENSE_HEADER_START@
++ *
++ * The contents of this file constitute Original Code as defined in and
++ * are subject to the Apple Public Source License Version 1.1 (the
++ * "License"). You may not use this file except in compliance with the
++ * License. Please obtain a copy of the License at
++ * http://www.apple.com/publicsource and read it before using this file.
++ *
++ * This Original Code and all software distributed under the License are
++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
++ * License for the specific language governing rights and limitations
++ * under the License.
++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++
++#ifndef __SYS_APPLEAPIOPTS_H__
++#define __SYS_APPLEAPIOPTS_H__
++
++
++#ifndef __APPLE_API_STANDARD
++#define __APPLE_API_STANDARD
++#endif /* __APPLE_API_STANDARD */
++
++#ifndef __APPLE_API_STABLE
++#define __APPLE_API_STABLE
++#endif /* __APPLE_API_STABLE */
++
++#ifndef __APPLE_API_STRICT_CONFORMANCE
++
++#ifndef __APPLE_API_EVOLVING
++#define __APPLE_API_EVOLVING
++#endif /* __APPLE_API_EVOLVING */
++
++#ifndef __APPLE_API_UNSTABLE
++#define __APPLE_API_UNSTABLE
++#endif /* __APPLE_API_UNSTABLE */
++
++#ifndef __APPLE_API_OBSOLETE
++#define __APPLE_API_OBSOLETE
++#endif /* __APPLE_API_OBSOLETE */
++
++#endif /* __APPLE_API_STRICT_CONFORMANCE */
++
++#endif /* __SYS_APPLEAPIOPTS_H__ */
++