|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: File: BTreesInternal.h
24:
25: Contains: IPI to File Manager B-tree
26:
27: Version: HFS Plus 1.0
28:
29: Copyright: � 1996-1998 by Apple Computer, Inc., all rights reserved.
30:
31: File Ownership:
32:
33: DRI: Don Brady
34:
35: Other Contact: Mark Day
36:
37: Technology: File Systems
38:
39: Writers:
40:
41: (msd) Mark Day
42: (DSH) Deric Horn
43: (djb) Don Brady
44:
45: Change History (most recent first):
46:
47: <RHAP> 9/22/99 ser Added prototypes for BTGetLastSync and BTSetLastSync
48: <RHAP> 6/22/98 djb Add ERR_BASE to btree error codes to make them negative (for MacOS X only).
49:
50: <CS7> 7/28/97 msd Add enum for fsBTTimeOutErr.
51: <CS6> 7/25/97 DSH Added heuristicHint as parameter to BTSearchRecord.
52: <CS5> 7/24/97 djb Add blockReadFromDisk flag to BlockDescriptor. Callbacks now use
53: a file refNum instead of an FCB.
54: <CS4> 7/16/97 DSH FilesInternal.i renamed FileMgrInternal.i to avoid name
55: collision
56: <CS3> 6/2/97 DSH Added SetEndOfForkProc() prototype, so Attributes.c can call it
57: directly.
58: <CS2> 5/19/97 djb kMaxKeyLength is now 520.
59: <CS1> 4/28/97 djb first checked in
60:
61: <HFS6> 3/17/97 DSH Remove Key Comparison prototype, already in FilesInternal.h.
62: <HFS5> 2/19/97 djb Add SetBlockSizeProcPtr. Add blockSize field to BlockDescriptor.
63: Remove E_ type error enums.
64: <HFS4> 1/27/97 djb Include Types.h and FilesInternal.h.
65: <HFS3> 1/13/97 djb Added kBTreeCurrentRecord for BTIterateRecord.
66: <HFS2> 1/3/97 djb Added support for large keys.
67: <HFS1> 12/19/96 djb first checked in
68:
69: */
70:
71: #ifndef __BTREESINTERNAL__
72: #define __BTREESINTERNAL__
73:
74: #ifndef __FILEMGRINTERNAL__
75: #include "FileMgrInternal.h"
76: #endif
77:
78: enum {
79: fsBTInvalidHeaderErr = btBadHdr,
80: fsBTBadRotateErr = dsBadRotate,
81: fsBTInvalidNodeErr = btBadNode,
82: fsBTRecordTooLargeErr = btNoFit,
83: fsBTRecordNotFoundErr = btNotFound,
84: fsBTDuplicateRecordErr = btExists,
85: fsBTFullErr = btNoSpaceAvail,
86:
87: fsBTInvalidFileErr = ERR_BASE + 0x0302, /* no BTreeCB has been allocated for fork*/
88: fsBTrFileAlreadyOpenErr = ERR_BASE + 0x0303,
89: fsBTInvalidIteratorErr = ERR_BASE + 0x0308,
90: fsBTEmptyErr = ERR_BASE + 0x030A,
91: fsBTNoMoreMapNodesErr = ERR_BASE + 0x030B,
92: fsBTBadNodeSize = ERR_BASE + 0x030C,
93: fsBTBadNodeType = ERR_BASE + 0x030D,
94: fsBTInvalidKeyLengthErr = ERR_BASE + 0x030E,
95: fsBTStartOfIterationErr = ERR_BASE + 0x0353,
96: fsBTEndOfIterationErr = ERR_BASE + 0x0354,
97: fsBTUnknownVersionErr = ERR_BASE + 0x0355,
98: fsBTTreeTooDeepErr = ERR_BASE + 0x0357,
99: fsIteratorExitedScopeErr = ERR_BASE + 0x0A02, /* iterator exited the scope*/
100: fsIteratorScopeExceptionErr = ERR_BASE + 0x0A03, /* iterator is undefined due to error or movement of scope locality*/
101: fsUnknownIteratorMovementErr = ERR_BASE + 0x0A04, /* iterator movement is not defined*/
102: fsInvalidIterationMovmentErr = ERR_BASE + 0x0A05, /* iterator movement is invalid in current context*/
103: fsClientIDMismatchErr = ERR_BASE + 0x0A06, /* wrong client process ID*/
104: fsEndOfIterationErr = ERR_BASE + 0x0A07, /* there were no objects left to return on iteration*/
105: fsBTTimeOutErr = ERR_BASE + 0x0A08 /* BTree scan interrupted -- no time left for physical I/O */
106: };
107:
108: struct BlockDescriptor{
109: void *buffer;
110: void *blockHeader;
111: ByteCount blockSize;
112: Boolean blockReadFromDisk;
113: Byte reserved[3];
114: };
115: typedef struct BlockDescriptor BlockDescriptor;
116: typedef BlockDescriptor *BlockDescPtr;
117:
118:
119: struct FSBufferDescriptor {
120: LogicalAddress bufferAddress;
121: ByteCount itemSize;
122: ItemCount itemCount;
123: };
124: typedef struct FSBufferDescriptor FSBufferDescriptor;
125:
126: typedef FSBufferDescriptor *FSBufferDescriptorPtr;
127:
128:
129: /*
130: Fork Level Access Method Block get options
131: */
132: enum {
133: kGetBlock = 0x00000000,
134: kForceReadBlock = 0x00000002, //�� how does this relate to Read/Verify? Do we need this?
135: kGetEmptyBlock = 0x00000008
136: };
137: typedef OptionBits GetBlockOptions;
138:
139: /*
140: Fork Level Access Method Block release options
141: */
142: enum {
143: kReleaseBlock = 0x00000000,
144: kForceWriteBlock = 0x00000001,
145: kMarkBlockDirty = 0x00000002,
146: kTrashBlock = 0x00000004,
147: kLockTransaction = 0x00000100
148: };
149: typedef OptionBits ReleaseBlockOptions;
150:
151: typedef UInt32 FSSize;
152: typedef UInt32 ForkBlockNumber;
153:
154: /*============================================================================
155: Fork Level Buffered I/O Access Method
156: ============================================================================*/
157:
158: typedef OSStatus (* GetBlockProcPtr) (FileReference fileRefNum,
159: UInt32 blockNum,
160: GetBlockOptions options,
161: BlockDescriptor *block );
162:
163:
164: typedef OSStatus (* ReleaseBlockProcPtr) (FileReference fileRefNum,
165: BlockDescPtr blockPtr,
166: ReleaseBlockOptions options );
167:
168: typedef OSStatus (* SetEndOfForkProcPtr) (FileReference fileRefNum,
169: FSSize minEOF,
170: FSSize maxEOF );
171:
172: typedef OSStatus (* SetBlockSizeProcPtr) (FileReference fileRefNum,
173: ByteCount blockSize,
174: ItemCount minBlockCount );
175:
176: OSStatus SetEndOfForkProc ( FileReference fileRefNum, FSSize minEOF, FSSize maxEOF );
177:
178:
179: /*
180: B*Tree Information Version
181: */
182:
183: enum BTreeInformationVersion{
184: kBTreeInfoVersion = 0
185: };
186:
187: /*
188: B*Tree Iteration Operation Constants
189: */
190:
191: enum BTreeIterationOperations{
192: kBTreeFirstRecord,
193: kBTreeNextRecord,
194: kBTreePrevRecord,
195: kBTreeLastRecord,
196: kBTreeCurrentRecord
197: };
198: typedef UInt16 BTreeIterationOperation;
199:
200:
201: /*
202: Btree types: 0 is HFS CAT/EXT file, 1~127 are AppleShare B*Tree files, 128~254 unused
203: hfsBtreeType EQU 0 ; control file
204: validBTType EQU $80 ; user btree type starts from 128
205: userBT1Type EQU $FF ; 255 is our Btree type. Used by BTInit and BTPatch
206: */
207:
208: enum BTreeTypes{
209: kHFSBTreeType = 0, // control file
210: kUserBTreeType = 128, // user btree type starts from 128
211: kReservedBTreeType = 255 //
212: };
213:
214:
215: typedef BTreeKey *BTreeKeyPtr;
216:
217:
218: /*
219: BTreeInfoRec Structure - for BTGetInformation
220: */
221: struct BTreeInfoRec{
222: UInt16 version;
223: UInt16 nodeSize;
224: UInt16 maxKeyLength;
225: UInt16 treeDepth;
226: UInt32 lastfsync; /* Last time that this was fsynced */
227: ItemCount numRecords;
228: ItemCount numNodes;
229: ItemCount numFreeNodes;
230: UInt32 reserved;
231: };
232: typedef struct BTreeInfoRec BTreeInfoRec;
233: typedef BTreeInfoRec *BTreeInfoPtr;
234:
235: /*
236: BTreeHint can never be exported to the outside. Use UInt32 BTreeHint[4],
237: UInt8 BTreeHint[16], etc.
238: */
239: struct BTreeHint{
240: ItemCount writeCount;
241: UInt32 nodeNum; // node the key was last seen in
242: UInt16 index; // index then key was last seen at
243: UInt16 reserved1;
244: UInt32 reserved2;
245: };
246: typedef struct BTreeHint BTreeHint;
247: typedef BTreeHint *BTreeHintPtr;
248:
249: /*
250: BTree Iterator
251: */
252: struct BTreeIterator{
253: BTreeHint hint;
254: UInt16 version;
255: UInt16 reserved;
256: BTreeKey key;
257: };
258: typedef struct BTreeIterator BTreeIterator;
259: typedef BTreeIterator *BTreeIteratorPtr;
260:
261:
262: /*============================================================================
263: B*Tree SPI
264: ============================================================================*/
265:
266: /*
267: Key Comparison Function ProcPtr Type - for BTOpenPath
268: */
269: //typedef SInt32 (* KeyCompareProcPtr)(BTreeKeyPtr a, BTreeKeyPtr b);
270:
271:
272: typedef SInt32 (* IterateCallBackProcPtr)(BTreeKeyPtr key, void * record, UInt16 recordLen, void * state);
273:
274: extern OSStatus BTOpenPath (FCB *filePtr,
275: KeyCompareProcPtr keyCompareProc,
276: GetBlockProcPtr getBlockProc,
277: ReleaseBlockProcPtr releaseBlockProc,
278: SetEndOfForkProcPtr setEndOfForkProc,
279: SetBlockSizeProcPtr setBlockSizeProc );
280:
281: extern OSStatus BTClosePath (FCB *filePtr );
282:
283:
284: extern OSStatus BTSearchRecord (FCB *filePtr,
285: BTreeIterator *searchIterator,
286: UInt32 heuristicHint,
287: FSBufferDescriptor *btRecord,
288: UInt16 *recordLen,
289: BTreeIterator *resultIterator );
290:
291: extern OSStatus BTIterateRecord (FCB *filePtr,
292: BTreeIterationOperation operation,
293: BTreeIterator *iterator,
294: FSBufferDescriptor *btRecord,
295: UInt16 *recordLen );
296:
297:
298: extern OSStatus BTIterateRecords(FCB *filePtr, BTreeIterationOperation operation, BTreeIterator *iterator,
299: IterateCallBackProcPtr callBackProc, void * callBackState);
300:
301: extern OSStatus BTInsertRecord (FCB *filePtr,
302: BTreeIterator *iterator,
303: FSBufferDescriptor *btrecord,
304: UInt16 recordLen );
305:
306: extern OSStatus BTReplaceRecord (FCB *filePtr,
307: BTreeIterator *iterator,
308: FSBufferDescriptor *btRecord,
309: UInt16 recordLen );
310:
311:
312: extern OSStatus BTDeleteRecord (FCB *filePtr,
313: BTreeIterator *iterator );
314:
315: extern OSStatus BTGetInformation (FCB *filePtr,
316: UInt16 version,
317: BTreeInfoRec *info );
318:
319: extern OSStatus BTFlushPath (FCB *filePtr );
320:
321: extern OSStatus BTInvalidateHint (BTreeIterator *iterator );
322:
323: extern OSStatus BTGetLastSync (FCB *filePtr,
324: UInt32 *lastfsync );
325:
326: extern OSStatus BTSetLastSync (FCB *filePtr,
327: UInt32 lastfsync );
328:
329: #endif // __BTREESINTERNAL__
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.