2 * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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.
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
20 * @APPLE_LICENSE_HEADER_END@
25 Contains: IPI for File Manager (HFS Plus)
29 Copyright: © 1996-2001 by Apple Computer, Inc., all rights reserved.
32 #ifndef __FILEMGRINTERNAL__
33 #define __FILEMGRINTERNAL__
35 #include <sys/appleapiopts.h>
38 #ifdef __APPLE_API_PRIVATE
40 #include <sys/param.h>
41 #include <sys/vnode.h>
43 #include "../../hfs.h"
44 #include "../../hfs_macos_defs.h"
45 #include "../../hfs_format.h"
46 #include "../../hfs_cnode.h"
61 #if PRAGMA_STRUCT_ALIGN
62 #pragma options align=mac68k
63 #elif PRAGMA_STRUCT_PACKPUSH
65 #elif PRAGMA_STRUCT_PACK
69 /* CatalogNodeID is used to track catalog objects */
70 typedef UInt32 HFSCatalogNodeID
;
72 /* internal error codes*/
74 #if TARGET_API_MACOS_X
75 #define ERR_BASE -32767
82 fxRangeErr
= ERR_BASE
+ 16, /* file position beyond mapped range*/
83 fxOvFlErr
= ERR_BASE
+ 17, /* extents file overflow*/
85 uniTooLongErr
= ERR_BASE
+ 24, /* Unicode string too long to convert to Str31*/
86 uniBufferTooSmallErr
= ERR_BASE
+ 25, /* Unicode output buffer too small*/
87 uniNotMappableErr
= ERR_BASE
+ 26, /* Unicode string can't be mapped to given script*/
88 /* BTree Manager errors*/
89 btNotFound
= ERR_BASE
+ 32, /* record not found*/
90 btExists
= ERR_BASE
+ 33, /* record already exists*/
91 btNoSpaceAvail
= ERR_BASE
+ 34, /* no available space*/
92 btNoFit
= ERR_BASE
+ 35, /* record doesn't fit in node */
93 btBadNode
= ERR_BASE
+ 36, /* bad node detected*/
94 btBadHdr
= ERR_BASE
+ 37, /* bad BTree header record detected*/
95 dsBadRotate
= ERR_BASE
+ 64, /* bad BTree rotate*/
96 /* Catalog Manager errors*/
97 cmNotFound
= ERR_BASE
+ 48, /* CNode not found*/
98 cmExists
= ERR_BASE
+ 49, /* CNode already exists*/
99 cmNotEmpty
= ERR_BASE
+ 50, /* directory CNode not empty (valence = 0)*/
100 cmRootCN
= ERR_BASE
+ 51, /* invalid reference to root CNode*/
101 cmBadNews
= ERR_BASE
+ 52, /* detected bad catalog structure*/
102 cmFThdDirErr
= ERR_BASE
+ 53, /* thread belongs to a directory not a file*/
103 cmFThdGone
= ERR_BASE
+ 54, /* file thread doesn't exist*/
104 cmParentNotFound
= ERR_BASE
+ 55, /* CNode for parent ID does not exist*/
105 /* TFS internal errors*/
106 fsDSIntErr
= -127 /* Internal file system error*/
113 kEFAllMask
= 0x01, /* allocate all requested bytes or none */
114 kEFContigMask
= 0x02, /* force contiguous allocation */
115 kEFReserveMask
= 0x04, /* keep block reserve */
116 kEFDeferMask
= 0x08, /* defer file block allocations */
117 kEFNoClumpMask
= 0x10, /* don't round up to clump size */
118 kEFMetadataMask
= 0x20, /* metadata allocation */
120 kTFTrunExtBit
= 0, /* truncate to the extent containing new PEOF*/
125 kUndefinedStrLen
= 0, /* Unknown string length */
128 /* FileIDs variables*/
129 kNumExtentsToCache
= 4 /* just guessing for ExchangeFiles*/
133 /* Universal Extent Key */
137 HFSPlusExtentKey hfsPlus
;
139 typedef union ExtentKey ExtentKey
;
140 /* Universal extent descriptor */
142 union ExtentDescriptor
{
143 HFSExtentDescriptor hfs
;
144 HFSPlusExtentDescriptor hfsPlus
;
146 typedef union ExtentDescriptor ExtentDescriptor
;
147 /* Universal extent record */
151 HFSPlusExtentRecord hfsPlus
;
153 typedef union ExtentRecord ExtentRecord
;
154 /* Universal catalog key */
158 HFSPlusCatalogKey hfsPlus
;
160 typedef union CatalogKey CatalogKey
;
161 /* Universal catalog data record */
163 union CatalogRecord
{
165 HFSCatalogFolder hfsFolder
;
166 HFSCatalogFile hfsFile
;
167 HFSCatalogThread hfsThread
;
168 HFSPlusCatalogFolder hfsPlusFolder
;
169 HFSPlusCatalogFile hfsPlusFile
;
170 HFSPlusCatalogThread hfsPlusThread
;
172 typedef union CatalogRecord CatalogRecord
;
176 CMMaxCName
= kHFSMaxFileNameChars
181 /* Universal catalog name*/
187 typedef union CatalogName CatalogName
;
191 * MacOS accessor routines
193 #define GetFileControlBlock(fref) VTOF((fref))
194 #define GetFileRefNumFromFCB(fcb) FTOV((fcb))
197 /* The following macro marks a VCB as dirty by setting the upper 8 bits of the flags*/
199 MarkVCBDirty (ExtendedVCB
*vcb
);
202 MarkVCBClean (ExtendedVCB
*vcb
);
204 EXTERN_API_C( Boolean
)
205 IsVCBDirty (ExtendedVCB
*vcb
);
208 #define VCB_LOCK_INIT(vcb) simple_lock_init(&vcb->vcbSimpleLock)
209 #define VCB_LOCK(vcb) simple_lock(&vcb->vcbSimpleLock)
210 #define VCB_UNLOCK(vcb) simple_unlock(&vcb->vcbSimpleLock)
212 #define MarkVCBDirty(vcb) { ((vcb)->vcbFlags |= 0xFF00); }
213 #define MarkVCBClean(vcb) { ((vcb)->vcbFlags &= 0x00FF); }
214 #define IsVCBDirty(vcb) ((Boolean) ((vcb->vcbFlags & 0xFF00) != 0))
217 /* Test for error and return if error occurred*/
219 ReturnIfError (OSErr result
);
221 #define ReturnIfError(result) if ( (result) != noErr ) return (result); else ;
222 /* Test for passed condition and return if true*/
224 ReturnErrorIf (Boolean condition
,
227 #define ReturnErrorIf(condition, error) if ( (condition) ) return( (error) );
228 /* Exit function on error*/
230 ExitOnError (OSErr result
);
232 #define ExitOnError( result ) if ( ( result ) != noErr ) goto ErrorExit; else ;
236 /* Catalog Manager Routines (IPI)*/
238 EXTERN_API_C( OSErr
)
239 ExchangeFileIDs (ExtendedVCB
* volume
,
240 ConstUTF8Param srcName
,
241 ConstUTF8Param destName
,
242 HFSCatalogNodeID srcID
,
243 HFSCatalogNodeID destID
,
247 EXTERN_API_C( SInt32
)
248 CompareCatalogKeys (HFSCatalogKey
* searchKey
,
249 HFSCatalogKey
* trialKey
);
251 EXTERN_API_C( SInt32
)
252 CompareExtendedCatalogKeys (HFSPlusCatalogKey
* searchKey
,
253 HFSPlusCatalogKey
* trialKey
);
255 EXTERN_API_C( OSErr
)
256 InitCatalogCache (void);
259 InvalidateCatalogCache (ExtendedVCB
* volume
);
263 /* BTree Manager Routines*/
265 typedef CALLBACK_API_C( SInt32
, KeyCompareProcPtr
)(void *a
, void *b
);
268 EXTERN_API_C( OSErr
)
269 SearchBTreeRecord (FileReference refNum
,
277 EXTERN_API_C( OSErr
)
278 ReplaceBTreeRecord (FileReference refNum
,
286 /* Prototypes for exported routines in VolumeAllocation.c*/
287 EXTERN_API_C( OSErr
)
288 BlockAllocate (ExtendedVCB
* vcb
,
289 UInt32 startingBlock
,
292 Boolean forceContiguous
,
295 UInt32
* actualBlocks
);
297 EXTERN_API_C( OSErr
)
298 BlockDeallocate (ExtendedVCB
* vcb
,
302 EXTERN_API_C( OSErr
)
303 BlockMarkAllocated(ExtendedVCB
*vcb
, UInt32 startingBlock
, UInt32 numBlocks
);
305 EXTERN_API_C( OSErr
)
306 BlockMarkFree( ExtendedVCB
*vcb
, UInt32 startingBlock
, UInt32 numBlocks
);
308 EXTERN_API_C( UInt32
)
309 FileBytesToBlocks (SInt64 numerator
,
312 EXTERN_API_C( UInt32
)
313 MetaZoneFreeBlocks(ExtendedVCB
*vcb
);
315 /* File Extent Mapping routines*/
316 EXTERN_API_C( OSErr
)
317 FlushExtentFile (ExtendedVCB
* vcb
);
319 EXTERN_API_C( SInt32
)
320 CompareExtentKeys (const HFSExtentKey
* searchKey
,
321 const HFSExtentKey
* trialKey
);
323 EXTERN_API_C( SInt32
)
324 CompareExtentKeysPlus (const HFSPlusExtentKey
*searchKey
,
325 const HFSPlusExtentKey
*trialKey
);
327 EXTERN_API_C( OSErr
)
328 TruncateFileC (ExtendedVCB
* vcb
,
331 Boolean truncateToExtent
);
333 EXTERN_API_C( OSErr
)
334 ExtendFileC (ExtendedVCB
* vcb
,
339 SInt64
* actualBytesAdded
);
341 EXTERN_API_C( OSErr
)
342 MapFileBlockC (ExtendedVCB
* vcb
,
344 size_t numberOfBytes
,
346 daddr_t
* startBlock
,
347 size_t * availableBytes
);
350 AddFileExtent (ExtendedVCB
*vcb
, FCB
*fcb
, UInt32 startBlock
, UInt32 blockCount
);
352 #if TARGET_API_MACOS_X
353 EXTERN_API_C( Boolean
)
354 NodesAreContiguous (ExtendedVCB
* vcb
,
359 /* Utility routines*/
361 EXTERN_API_C( OSErr
)
362 VolumeWritable (ExtendedVCB
* vcb
);
365 /* Get the current time in UTC (GMT)*/
366 EXTERN_API_C( UInt32
)
369 EXTERN_API_C( UInt32
)
370 LocalToUTC (UInt32 localTime
);
372 EXTERN_API_C( UInt32
)
373 UTCToLocal (UInt32 utcTime
);
376 #if PRAGMA_STRUCT_ALIGN
377 #pragma options align=reset
378 #elif PRAGMA_STRUCT_PACKPUSH
380 #elif PRAGMA_STRUCT_PACK
384 #ifdef PRAGMA_IMPORT_OFF
394 #endif /* __APPLE_API_PRIVATE */
396 #endif /* __FILEMGRINTERNAL__ */