]> git.saurik.com Git - apple/xnu.git/blob - bsd/hfs/hfscommon/headers/FileMgrInternal.h
xnu-2050.48.11.tar.gz
[apple/xnu.git] / bsd / hfs / hfscommon / headers / FileMgrInternal.h
1 /*
2 * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28 /*
29 File: FilesInternal.h
30
31 Contains: IPI for File Manager (HFS Plus)
32
33 Version: HFS Plus 1.0
34
35 Copyright: � 1996-2001 by Apple Computer, Inc., all rights reserved.
36
37 */
38 #ifndef __FILEMGRINTERNAL__
39 #define __FILEMGRINTERNAL__
40
41 #include <sys/appleapiopts.h>
42
43 #ifdef KERNEL
44 #ifdef __APPLE_API_PRIVATE
45
46 #include <sys/param.h>
47 #include <sys/vnode.h>
48
49 #include "../../hfs.h"
50 #include "../../hfs_macos_defs.h"
51 #include "../../hfs_format.h"
52 #include "../../hfs_cnode.h"
53
54
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58
59 /* CatalogNodeID is used to track catalog objects */
60 typedef u_int32_t HFSCatalogNodeID;
61
62 /* internal error codes*/
63
64 #if TARGET_API_MACOS_X
65 #define ERR_BASE -32767
66 #else
67 #define ERR_BASE 0
68 #endif
69
70 enum {
71 /* FXM errors*/
72 fxRangeErr = ERR_BASE + 16, /* file position beyond mapped range*/
73 fxOvFlErr = ERR_BASE + 17, /* extents file overflow*/
74 /* Unicode errors*/
75 uniTooLongErr = ERR_BASE + 24, /* Unicode string too long to convert to Str31*/
76 uniBufferTooSmallErr = ERR_BASE + 25, /* Unicode output buffer too small*/
77 uniNotMappableErr = ERR_BASE + 26, /* Unicode string can't be mapped to given script*/
78 /* BTree Manager errors*/
79 btNotFound = ERR_BASE + 32, /* record not found*/
80 btExists = ERR_BASE + 33, /* record already exists*/
81 btNoSpaceAvail = ERR_BASE + 34, /* no available space*/
82 btNoFit = ERR_BASE + 35, /* record doesn't fit in node */
83 btBadNode = ERR_BASE + 36, /* bad node detected*/
84 btBadHdr = ERR_BASE + 37, /* bad BTree header record detected*/
85 dsBadRotate = ERR_BASE + 64, /* bad BTree rotate*/
86 /* Catalog Manager errors*/
87 cmNotFound = ERR_BASE + 48, /* CNode not found*/
88 cmExists = ERR_BASE + 49, /* CNode already exists*/
89 cmNotEmpty = ERR_BASE + 50, /* directory CNode not empty (valence = 0)*/
90 cmRootCN = ERR_BASE + 51, /* invalid reference to root CNode*/
91 cmBadNews = ERR_BASE + 52, /* detected bad catalog structure*/
92 cmFThdDirErr = ERR_BASE + 53, /* thread belongs to a directory not a file*/
93 cmFThdGone = ERR_BASE + 54, /* file thread doesn't exist*/
94 cmParentNotFound = ERR_BASE + 55, /* CNode for parent ID does not exist*/
95 /* TFS internal errors*/
96 fsDSIntErr = -127 /* Internal file system error*/
97 };
98
99
100 /* internal flags*/
101
102 enum {
103 kEFAllMask = 0x01, /* allocate all requested bytes or none */
104 kEFContigMask = 0x02, /* force contiguous allocation */
105 kEFReserveMask = 0x04, /* keep block reserve */
106 kEFDeferMask = 0x08, /* defer file block allocations */
107 kEFNoClumpMask = 0x10, /* don't round up to clump size */
108 kEFMetadataMask = 0x20, /* metadata allocation */
109
110 kTFTrunExtBit = 0, /* truncate to the extent containing new PEOF*/
111 kTFTrunExtMask = 1
112 };
113
114 enum {
115 kUndefinedStrLen = 0, /* Unknown string length */
116 kNoHint = 0,
117
118 /* FileIDs variables*/
119 kNumExtentsToCache = 4 /* just guessing for ExchangeFiles*/
120 };
121
122
123 /* Universal Extent Key */
124
125 union ExtentKey {
126 HFSExtentKey hfs;
127 HFSPlusExtentKey hfsPlus;
128 };
129 typedef union ExtentKey ExtentKey;
130 /* Universal extent descriptor */
131
132 union ExtentDescriptor {
133 HFSExtentDescriptor hfs;
134 HFSPlusExtentDescriptor hfsPlus;
135 };
136 typedef union ExtentDescriptor ExtentDescriptor;
137 /* Universal extent record */
138
139 union ExtentRecord {
140 HFSExtentRecord hfs;
141 HFSPlusExtentRecord hfsPlus;
142 };
143 typedef union ExtentRecord ExtentRecord;
144
145
146 enum {
147 CMMaxCName = kHFSMaxFileNameChars
148 };
149
150
151
152 /* Universal catalog name*/
153
154 union CatalogName {
155 Str31 pstr;
156 HFSUniStr255 ustr;
157 };
158 typedef union CatalogName CatalogName;
159
160
161 /*
162 * MacOS accessor routines
163 */
164 #define GetFileControlBlock(fref) VTOF((fref))
165 #define GetFileRefNumFromFCB(fcb) FTOV((fcb))
166
167 /* Test for error and return if error occurred*/
168 EXTERN_API_C( void )
169 ReturnIfError (OSErr result);
170
171 #define ReturnIfError(result) do { if ( (result) != noErr ) return (result); } while(0)
172
173 /* Exit function on error*/
174 EXTERN_API_C( void )
175 ExitOnError (OSErr result);
176
177 #define ExitOnError( result ) do { if ( ( result ) != noErr ) goto ErrorExit; } while(0)
178
179
180
181 /* Catalog Manager Routines (IPI)*/
182
183 EXTERN_API_C( OSErr )
184 ExchangeFileIDs (ExtendedVCB * volume,
185 ConstUTF8Param srcName,
186 ConstUTF8Param destName,
187 HFSCatalogNodeID srcID,
188 HFSCatalogNodeID destID,
189 u_int32_t srcHint,
190 u_int32_t destHint );
191
192 EXTERN_API_C( OSErr )
193 MoveData( ExtendedVCB *vcb, HFSCatalogNodeID srcID, HFSCatalogNodeID destID, int rsrc);
194
195 /* BTree Manager Routines*/
196
197 typedef CALLBACK_API_C( int32_t , KeyCompareProcPtr )(void *a, void *b);
198
199
200 EXTERN_API_C( OSErr )
201 ReplaceBTreeRecord (FileReference refNum,
202 const void * key,
203 u_int32_t hint,
204 void * newData,
205 u_int16_t dataSize,
206 u_int32_t * newHint);
207
208
209 /* Prototypes for exported routines in VolumeAllocation.c*/
210
211 /*
212 * Flags for BlockAllocate() and BlockDeallocate()
213 */
214 /* Force contiguous block allocation and to force minBlocks to actually be allocated */
215 #define HFS_ALLOC_FORCECONTIG 0x1
216 /* Can use metadata zone blocks */
217 #define HFS_ALLOC_METAZONE 0x2
218 /* Skip checking and updating of free blocks during allocation and deallocation */
219 #define HFS_ALLOC_SKIPFREEBLKS 0x4
220
221 EXTERN_API_C( OSErr )
222 BlockAllocate (ExtendedVCB * vcb,
223 u_int32_t startingBlock,
224 u_int32_t minBlocks,
225 u_int32_t maxBlocks,
226 u_int32_t flags,
227 u_int32_t * startBlock,
228 u_int32_t * actualBlocks);
229
230 EXTERN_API_C( OSErr )
231 BlockDeallocate (ExtendedVCB * vcb,
232 u_int32_t firstBlock,
233 u_int32_t numBlocks,
234 u_int32_t flags);
235
236 EXTERN_API_C ( void )
237 ResetVCBFreeExtCache(struct hfsmount *hfsmp);
238
239 EXTERN_API_C( OSErr )
240 BlockMarkAllocated(ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks);
241
242 EXTERN_API_C( OSErr )
243 BlockMarkFree( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks);
244
245 EXTERN_API_C( OSErr )
246 BlockMarkFreeUnused( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks);
247
248 EXTERN_API_C( u_int32_t )
249 MetaZoneFreeBlocks(ExtendedVCB *vcb);
250
251 EXTERN_API_C( u_int32_t )
252 UpdateAllocLimit (struct hfsmount *hfsmp, u_int32_t new_end_block);
253
254 EXTERN_API_C( u_int32_t )
255 UnmapBlocks(struct hfsmount *hfsmp);
256
257 #if CONFIG_HFS_ALLOC_RBTREE
258 EXTERN_API_C( u_int32_t )
259 GenerateTree( struct hfsmount *hfsmp, u_int32_t end_block, int *flags, int initialscan);
260
261 EXTERN_API_C( void )
262 DestroyTrees( struct hfsmount *hfsmp);
263
264 EXTERN_API_C( u_int32_t )
265 InitTree(struct hfsmount *hfsmp);
266 #endif
267
268
269
270
271 /* File Extent Mapping routines*/
272 EXTERN_API_C( OSErr )
273 FlushExtentFile (ExtendedVCB * vcb);
274
275 EXTERN_API_C( int32_t )
276 CompareExtentKeys (const HFSExtentKey * searchKey,
277 const HFSExtentKey * trialKey);
278
279 EXTERN_API_C( int32_t )
280 CompareExtentKeysPlus (const HFSPlusExtentKey *searchKey,
281 const HFSPlusExtentKey *trialKey);
282
283 EXTERN_API_C( OSErr )
284 TruncateFileC (ExtendedVCB *vcb, FCB *fcb, int64_t peof, int deleted,
285 int rsrc, uint32_t fileid, Boolean truncateToExtent);
286
287 EXTERN_API_C( OSErr )
288 ExtendFileC (ExtendedVCB * vcb,
289 FCB * fcb,
290 int64_t bytesToAdd,
291 u_int32_t blockHint,
292 u_int32_t flags,
293 int64_t * actualBytesAdded);
294
295 EXTERN_API_C( OSErr )
296 MapFileBlockC (ExtendedVCB * vcb,
297 FCB * fcb,
298 size_t numberOfBytes,
299 off_t offset,
300 daddr64_t * startBlock,
301 size_t * availableBytes);
302
303 OSErr HeadTruncateFile(ExtendedVCB *vcb, FCB *fcb, u_int32_t headblks);
304
305 EXTERN_API_C( int )
306 AddFileExtent (ExtendedVCB *vcb, FCB *fcb, u_int32_t startBlock, u_int32_t blockCount);
307
308 #if TARGET_API_MACOS_X
309 EXTERN_API_C( Boolean )
310 NodesAreContiguous (ExtendedVCB * vcb,
311 FCB * fcb,
312 u_int32_t nodeSize);
313 #endif
314
315
316
317 /* Get the current time in UTC (GMT)*/
318 EXTERN_API_C( u_int32_t )
319 GetTimeUTC (void);
320
321 EXTERN_API_C( u_int32_t )
322 LocalToUTC (u_int32_t localTime);
323
324 EXTERN_API_C( u_int32_t )
325 UTCToLocal (u_int32_t utcTime);
326
327
328 #ifdef __cplusplus
329 }
330 #endif
331
332 #endif /* __APPLE_API_PRIVATE */
333 #endif /* KERNEL */
334 #endif /* __FILEMGRINTERNAL__ */
335