lf_hfs_btrees_internal.h [plain text]
#ifndef lf_hfs_btrees_internal_h
#define lf_hfs_btrees_internal_h
#include "lf_hfs_file_mgr_internal.h"
enum {
fsBTInvalidHeaderErr = btBadHdr,
fsBTBadRotateErr = dsBadRotate,
fsBTInvalidNodeErr = btBadNode,
fsBTRecordTooLargeErr = btNoFit,
fsBTRecordNotFoundErr = btNotFound,
fsBTDuplicateRecordErr = btExists,
fsBTFullErr = btNoSpaceAvail,
fsBTInvalidFileErr = ERR_BASE + 0x0302,
fsBTrFileAlreadyOpenErr = ERR_BASE + 0x0303,
fsBTInvalidIteratorErr = ERR_BASE + 0x0308,
fsBTEmptyErr = ERR_BASE + 0x030A,
fsBTNoMoreMapNodesErr = ERR_BASE + 0x030B,
fsBTBadNodeSize = ERR_BASE + 0x030C,
fsBTBadNodeType = ERR_BASE + 0x030D,
fsBTInvalidKeyLengthErr = ERR_BASE + 0x030E,
fsBTStartOfIterationErr = ERR_BASE + 0x0353,
fsBTEndOfIterationErr = ERR_BASE + 0x0354,
fsBTUnknownVersionErr = ERR_BASE + 0x0355,
fsBTTreeTooDeepErr = ERR_BASE + 0x0357,
fsIteratorExitedScopeErr = ERR_BASE + 0x0A02,
fsIteratorScopeExceptionErr = ERR_BASE + 0x0A03,
fsUnknownIteratorMovementErr = ERR_BASE + 0x0A04,
fsInvalidIterationMovmentErr = ERR_BASE + 0x0A05,
fsClientIDMismatchErr = ERR_BASE + 0x0A06,
fsEndOfIterationErr = ERR_BASE + 0x0A07,
fsBTTimeOutErr = ERR_BASE + 0x0A08
};
typedef struct {
void *buffer;
void *blockHeader;
daddr64_t blockNum;
ByteCount blockSize;
Boolean blockReadFromDisk;
Byte isModified; Byte reserved[2];
} BlockDescriptor, *BlockDescPtr;
typedef struct {
void * bufferAddress;
ByteCount itemSize;
ItemCount itemCount;
} FSBufferDescriptor, *FSBufferDescriptorPtr;
enum {
kGetBlock = 0x00000000,
kGetBlockHint = 0x00000001, kForceReadBlock = 0x00000002, kGetEmptyBlock = 0x00000008
};
typedef u_int32_t GetBlockOptions;
enum {
kReleaseBlock = 0x00000000,
kForceWriteBlock = 0x00000001,
kMarkBlockDirty = 0x00000002,
kTrashBlock = 0x00000004,
kLockTransaction = 0x00000100
};
typedef u_int32_t ReleaseBlockOptions;
typedef u_int64_t FSSize;
typedef u_int32_t ForkBlockNumber;
typedef OSStatus (* GetBlockProcPtr) (FileReference fileRefNum,
uint64_t blockNum,
GetBlockOptions options,
BlockDescriptor *block );
typedef OSStatus (* ReleaseBlockProcPtr) (FileReference fileRefNum,
BlockDescPtr blockPtr,
ReleaseBlockOptions options );
typedef OSStatus (* SetEndOfForkProcPtr) (FileReference fileRefNum,
FSSize minEOF,
FSSize maxEOF );
typedef OSStatus (* SetBlockSizeProcPtr) (FileReference fileRefNum,
ByteCount blockSize,
ItemCount minBlockCount );
OSStatus SetEndOfForkProc ( FileReference fileRefNum, FSSize minEOF, FSSize maxEOF );
enum BTreeInformationVersion{
kBTreeInfoVersion = 0
};
enum BTreeIterationOperations{
kBTreeFirstRecord,
kBTreeNextRecord,
kBTreePrevRecord,
kBTreeLastRecord,
kBTreeCurrentRecord
};
typedef u_int16_t BTreeIterationOperation;
enum BTreeTypes{
kHFSBTreeType = 0, kUserBTreeType = 128, kReservedBTreeType = 255 };
#define kBTreeHeaderUserBytes 128
enum {
kMaxKeyLength = 520
};
typedef union {
u_int8_t length8;
u_int16_t length16;
u_int8_t rawData [kMaxKeyLength+2];
} BTreeKey, *BTreeKeyPtr;
typedef struct {
u_int32_t fLink;
u_int32_t bLink;
int8_t kind;
u_int8_t height;
u_int16_t numRecords;
u_int16_t reserved;
} __attribute__((aligned(2), packed)) BTNodeDescriptor;
enum {
kBTLeafNode = -1,
kBTIndexNode = 0,
kBTHeaderNode = 1,
kBTMapNode = 2
};
typedef struct {
u_int16_t treeDepth;
u_int32_t rootNode;
u_int32_t leafRecords;
u_int32_t firstLeafNode;
u_int32_t lastLeafNode;
u_int16_t nodeSize;
u_int16_t maxKeyLength;
u_int32_t totalNodes;
u_int32_t freeNodes;
u_int16_t reserved1;
u_int32_t clumpSize;
u_int8_t btreeType;
u_int8_t keyCompareType;
u_int32_t attributes;
u_int32_t reserved3[16];
} __attribute__((aligned(2), packed)) BTHeaderRec;
enum {
kBTBadCloseMask = 0x00000001,
kBTBigKeysMask = 0x00000002,
kBTVariableIndexKeysMask = 0x00000004
};
typedef struct {
u_int16_t version;
u_int16_t nodeSize;
u_int16_t maxKeyLength;
u_int16_t treeDepth;
u_int32_t lastfsync;
ItemCount numRecords;
ItemCount numNodes;
ItemCount numFreeNodes;
u_int8_t keyCompareType;
u_int8_t reserved[3];
} BTreeInfoRec, *BTreeInfoRecPtr;
typedef struct {
ItemCount writeCount;
u_int32_t nodeNum; u_int16_t index; u_int16_t reserved1;
u_int32_t reserved2;
} BTreeHint, *BTreeHintPtr;
typedef struct {
BTreeHint hint;
u_int16_t version;
u_int16_t reserved;
u_int32_t hitCount; u_int32_t maxLeafRecs; BTreeKey key;
} BTreeIterator, *BTreeIteratorPtr;
typedef int32_t (* IterateCallBackProcPtr)(BTreeKeyPtr key, void * record, void * state);
OSStatus BTOpenPath (FCB *filePtr, KeyCompareProcPtr keyCompareProc);
OSStatus BTClosePath (FCB *filePtr );
OSStatus BTSearchRecord (FCB *filePtr,
BTreeIterator *searchIterator,
FSBufferDescriptor *btRecord,
u_int16_t *recordLen,
BTreeIterator *resultIterator );
OSStatus BTIterateRecord (FCB *filePtr,
BTreeIterationOperation operation,
BTreeIterator *iterator,
FSBufferDescriptor *btRecord,
u_int16_t *recordLen );
OSStatus BTIterateRecords (FCB *filePtr,
BTreeIterationOperation operation,
BTreeIterator *iterator,
IterateCallBackProcPtr callBackProc,
void *callBackState);
OSStatus BTInsertRecord (FCB *filePtr,
BTreeIterator *iterator,
FSBufferDescriptor *btrecord,
u_int16_t recordLen );
OSStatus BTReplaceRecord (FCB *filePtr,
BTreeIterator *iterator,
FSBufferDescriptor *btRecord,
u_int16_t recordLen );
OSStatus BTUpdateRecord (FCB *filePtr,
BTreeIterator *iterator,
IterateCallBackProcPtr callBackProc,
void *callBackState );
OSStatus BTDeleteRecord (FCB *filePtr,
BTreeIterator *iterator );
OSStatus BTGetInformation (FCB *filePtr,
u_int16_t vers,
BTreeInfoRec *info );
OSStatus BTIsDirty (FCB *filePtr);
OSStatus BTFlushPath (FCB *filePtr);
OSStatus BTReloadData (FCB *filePtr);
OSStatus BTInvalidateHint (BTreeIterator *iterator );
OSStatus BTGetLastSync (FCB *filePtr,
u_int32_t *lastfsync );
OSStatus BTSetLastSync (FCB *filePtr,
u_int32_t lastfsync );
OSStatus BTHasContiguousNodes(FCB *filePtr);
OSStatus BTGetUserData(FCB *filePtr, void * dataPtr, int dataSize);
OSStatus BTSetUserData(FCB *filePtr, void * dataPtr, int dataSize);
void BTReserveSetup(void);
int BTReserveSpace(FCB *file, int operations, void * data);
int BTReleaseReserve(FCB *file, void * data);
int BTZeroUnusedNodes(FCB *file);
#endif