]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2000-2015 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 | #if !HFS_ALLOC_TEST | |
50 | ||
51 | #include "../../hfs.h" | |
52 | #include "../../hfs_macos_defs.h" | |
53 | #include "../../hfs_format.h" | |
54 | #include "../../hfs_cnode.h" | |
55 | ||
56 | #endif | |
57 | ||
58 | #ifdef __cplusplus | |
59 | extern "C" { | |
60 | #endif | |
61 | ||
62 | /* CatalogNodeID is used to track catalog objects */ | |
63 | typedef u_int32_t HFSCatalogNodeID; | |
64 | ||
65 | /* internal error codes*/ | |
66 | ||
67 | #if TARGET_API_MACOS_X | |
68 | #define ERR_BASE -32767 | |
69 | #else | |
70 | #define ERR_BASE 0 | |
71 | #endif | |
72 | ||
73 | enum { | |
74 | /* FXM errors*/ | |
75 | fxRangeErr = ERR_BASE + 16, /* file position beyond mapped range*/ | |
76 | fxOvFlErr = ERR_BASE + 17, /* extents file overflow*/ | |
77 | /* Unicode errors*/ | |
78 | uniTooLongErr = ERR_BASE + 24, /* Unicode string too long to convert to Str31*/ | |
79 | uniBufferTooSmallErr = ERR_BASE + 25, /* Unicode output buffer too small*/ | |
80 | uniNotMappableErr = ERR_BASE + 26, /* Unicode string can't be mapped to given script*/ | |
81 | /* BTree Manager errors*/ | |
82 | btNotFound = ERR_BASE + 32, /* record not found*/ | |
83 | btExists = ERR_BASE + 33, /* record already exists*/ | |
84 | btNoSpaceAvail = ERR_BASE + 34, /* no available space*/ | |
85 | btNoFit = ERR_BASE + 35, /* record doesn't fit in node */ | |
86 | btBadNode = ERR_BASE + 36, /* bad node detected*/ | |
87 | btBadHdr = ERR_BASE + 37, /* bad BTree header record detected*/ | |
88 | dsBadRotate = ERR_BASE + 64, /* bad BTree rotate*/ | |
89 | /* Catalog Manager errors*/ | |
90 | cmNotFound = ERR_BASE + 48, /* CNode not found*/ | |
91 | cmExists = ERR_BASE + 49, /* CNode already exists*/ | |
92 | cmNotEmpty = ERR_BASE + 50, /* directory CNode not empty (valence = 0)*/ | |
93 | cmRootCN = ERR_BASE + 51, /* invalid reference to root CNode*/ | |
94 | cmBadNews = ERR_BASE + 52, /* detected bad catalog structure*/ | |
95 | cmFThdDirErr = ERR_BASE + 53, /* thread belongs to a directory not a file*/ | |
96 | cmFThdGone = ERR_BASE + 54, /* file thread doesn't exist*/ | |
97 | cmParentNotFound = ERR_BASE + 55, /* CNode for parent ID does not exist*/ | |
98 | /* TFS internal errors*/ | |
99 | fsDSIntErr = -127 /* Internal file system error*/ | |
100 | }; | |
101 | ||
102 | ||
103 | /* internal flags*/ | |
104 | ||
105 | enum { | |
106 | kEFAllMask = 0x01, /* allocate all requested bytes or none */ | |
107 | kEFContigMask = 0x02, /* force contiguous allocation */ | |
108 | kEFReserveMask = 0x04, /* keep block reserve */ | |
109 | kEFDeferMask = 0x08, /* defer file block allocations */ | |
110 | kEFNoClumpMask = 0x10, /* don't round up to clump size */ | |
111 | kEFMetadataMask = 0x20, /* metadata allocation */ | |
112 | ||
113 | kTFTrunExtBit = 0, /* truncate to the extent containing new PEOF*/ | |
114 | kTFTrunExtMask = 1 | |
115 | }; | |
116 | ||
117 | enum { | |
118 | kUndefinedStrLen = 0, /* Unknown string length */ | |
119 | kNoHint = 0, | |
120 | ||
121 | /* FileIDs variables*/ | |
122 | kNumExtentsToCache = 4 /* just guessing for ExchangeFiles*/ | |
123 | }; | |
124 | ||
125 | ||
126 | /* Universal Extent Key */ | |
127 | ||
128 | union ExtentKey { | |
129 | HFSExtentKey hfs; | |
130 | HFSPlusExtentKey hfsPlus; | |
131 | }; | |
132 | typedef union ExtentKey ExtentKey; | |
133 | /* Universal extent descriptor */ | |
134 | ||
135 | union ExtentDescriptor { | |
136 | HFSExtentDescriptor hfs; | |
137 | HFSPlusExtentDescriptor hfsPlus; | |
138 | }; | |
139 | typedef union ExtentDescriptor ExtentDescriptor; | |
140 | /* Universal extent record */ | |
141 | ||
142 | union ExtentRecord { | |
143 | HFSExtentRecord hfs; | |
144 | HFSPlusExtentRecord hfsPlus; | |
145 | }; | |
146 | typedef union ExtentRecord ExtentRecord; | |
147 | ||
148 | ||
149 | enum { | |
150 | CMMaxCName = kHFSMaxFileNameChars | |
151 | }; | |
152 | ||
153 | ||
154 | ||
155 | /* Universal catalog name*/ | |
156 | ||
157 | union CatalogName { | |
158 | Str31 pstr; | |
159 | HFSUniStr255 ustr; | |
160 | }; | |
161 | typedef union CatalogName CatalogName; | |
162 | ||
163 | ||
164 | /* | |
165 | * MacOS accessor routines | |
166 | */ | |
167 | #define GetFileControlBlock(fref) VTOF((fref)) | |
168 | #define GetFileRefNumFromFCB(fcb) FTOV((fcb)) | |
169 | ||
170 | /* Test for error and return if error occurred*/ | |
171 | EXTERN_API_C( void ) | |
172 | ReturnIfError (OSErr result); | |
173 | ||
174 | #define ReturnIfError(result) do { if ( (result) != noErr ) return (result); } while(0) | |
175 | ||
176 | /* Exit function on error*/ | |
177 | EXTERN_API_C( void ) | |
178 | ExitOnError (OSErr result); | |
179 | ||
180 | #define ExitOnError( result ) do { if ( ( result ) != noErr ) goto ErrorExit; } while(0) | |
181 | ||
182 | ||
183 | ||
184 | /* Catalog Manager Routines (IPI)*/ | |
185 | ||
186 | EXTERN_API_C( OSErr ) | |
187 | ExchangeFileIDs (ExtendedVCB * volume, | |
188 | ConstUTF8Param srcName, | |
189 | ConstUTF8Param destName, | |
190 | HFSCatalogNodeID srcID, | |
191 | HFSCatalogNodeID destID, | |
192 | u_int32_t srcHint, | |
193 | u_int32_t destHint ); | |
194 | ||
195 | EXTERN_API_C( OSErr ) | |
196 | MoveData( ExtendedVCB *vcb, HFSCatalogNodeID srcID, HFSCatalogNodeID destID, int rsrc); | |
197 | ||
198 | /* BTree Manager Routines*/ | |
199 | ||
200 | typedef CALLBACK_API_C( int32_t , KeyCompareProcPtr )(void *a, void *b); | |
201 | ||
202 | ||
203 | EXTERN_API_C( OSErr ) | |
204 | ReplaceBTreeRecord (FileReference refNum, | |
205 | const void * key, | |
206 | u_int32_t hint, | |
207 | void * newData, | |
208 | u_int16_t dataSize, | |
209 | u_int32_t * newHint); | |
210 | ||
211 | ||
212 | /* Prototypes for exported routines in VolumeAllocation.c*/ | |
213 | ||
214 | /* | |
215 | * Flags for BlockAllocate() and BlockDeallocate() | |
216 | */ | |
217 | #define HFS_ALLOC_FORCECONTIG 0x1 //force contiguous block allocation; minblocks must be allocated | |
218 | #define HFS_ALLOC_METAZONE 0x2 //can use metazone blocks | |
219 | #define HFS_ALLOC_SKIPFREEBLKS 0x4 //skip checking/updating freeblocks during alloc/dealloc | |
220 | #define HFS_ALLOC_FLUSHTXN 0x8 //pick best fit for allocation, even if a jnl flush is req'd | |
221 | ||
222 | EXTERN_API_C( OSErr ) | |
223 | BlockAllocate (ExtendedVCB * vcb, | |
224 | u_int32_t startingBlock, | |
225 | u_int32_t minBlocks, | |
226 | u_int32_t maxBlocks, | |
227 | u_int32_t flags, | |
228 | u_int32_t * startBlock, | |
229 | u_int32_t * actualBlocks); | |
230 | ||
231 | EXTERN_API_C( OSErr ) | |
232 | BlockDeallocate (ExtendedVCB * vcb, | |
233 | u_int32_t firstBlock, | |
234 | u_int32_t numBlocks, | |
235 | u_int32_t flags); | |
236 | ||
237 | EXTERN_API_C ( void ) | |
238 | ResetVCBFreeExtCache(struct hfsmount *hfsmp); | |
239 | ||
240 | EXTERN_API_C( OSErr ) | |
241 | BlockMarkAllocated(ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); | |
242 | ||
243 | EXTERN_API_C( OSErr ) | |
244 | BlockMarkFree( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); | |
245 | ||
246 | EXTERN_API_C( OSErr ) | |
247 | BlockMarkFreeUnused( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); | |
248 | ||
249 | EXTERN_API_C( u_int32_t ) | |
250 | MetaZoneFreeBlocks(ExtendedVCB *vcb); | |
251 | ||
252 | EXTERN_API_C( u_int32_t ) | |
253 | UpdateAllocLimit (struct hfsmount *hfsmp, u_int32_t new_end_block); | |
254 | ||
255 | EXTERN_API_C( u_int32_t ) | |
256 | ScanUnmapBlocks(struct hfsmount *hfsmp); | |
257 | ||
258 | EXTERN_API_C( int ) | |
259 | hfs_init_summary (struct hfsmount *hfsmp); | |
260 | ||
261 | errno_t hfs_find_free_extents(struct hfsmount *hfsmp, | |
262 | void (*callback)(void *data, off_t), void *callback_arg); | |
263 | ||
264 | /* File Extent Mapping routines*/ | |
265 | EXTERN_API_C( OSErr ) | |
266 | FlushExtentFile (ExtendedVCB * vcb); | |
267 | ||
268 | #if CONFIG_HFS_STD | |
269 | EXTERN_API_C( int32_t ) | |
270 | CompareExtentKeys (const HFSExtentKey * searchKey, | |
271 | const HFSExtentKey * trialKey); | |
272 | #endif | |
273 | ||
274 | EXTERN_API_C( int32_t ) | |
275 | CompareExtentKeysPlus (const HFSPlusExtentKey *searchKey, | |
276 | const HFSPlusExtentKey *trialKey); | |
277 | ||
278 | EXTERN_API_C( OSErr ) | |
279 | TruncateFileC (ExtendedVCB *vcb, FCB *fcb, int64_t peof, int deleted, | |
280 | int rsrc, uint32_t fileid, Boolean truncateToExtent); | |
281 | ||
282 | EXTERN_API_C( OSErr ) | |
283 | ExtendFileC (ExtendedVCB * vcb, | |
284 | FCB * fcb, | |
285 | int64_t bytesToAdd, | |
286 | u_int32_t blockHint, | |
287 | u_int32_t flags, | |
288 | int64_t * actualBytesAdded); | |
289 | ||
290 | EXTERN_API_C( OSErr ) | |
291 | MapFileBlockC (ExtendedVCB * vcb, | |
292 | FCB * fcb, | |
293 | size_t numberOfBytes, | |
294 | off_t offset, | |
295 | daddr64_t * startBlock, | |
296 | size_t * availableBytes); | |
297 | ||
298 | OSErr HeadTruncateFile(ExtendedVCB *vcb, FCB *fcb, u_int32_t headblks); | |
299 | ||
300 | EXTERN_API_C( int ) | |
301 | AddFileExtent (ExtendedVCB *vcb, FCB *fcb, u_int32_t startBlock, u_int32_t blockCount); | |
302 | ||
303 | #if TARGET_API_MACOS_X | |
304 | EXTERN_API_C( Boolean ) | |
305 | NodesAreContiguous (ExtendedVCB * vcb, | |
306 | FCB * fcb, | |
307 | u_int32_t nodeSize); | |
308 | #endif | |
309 | ||
310 | ||
311 | ||
312 | /* Get the current time in UTC (GMT)*/ | |
313 | EXTERN_API_C( u_int32_t ) | |
314 | GetTimeUTC (void); | |
315 | ||
316 | EXTERN_API_C( u_int32_t ) | |
317 | LocalToUTC (u_int32_t localTime); | |
318 | ||
319 | EXTERN_API_C( u_int32_t ) | |
320 | UTCToLocal (u_int32_t utcTime); | |
321 | ||
322 | ||
323 | #ifdef __cplusplus | |
324 | } | |
325 | #endif | |
326 | ||
327 | #endif /* __APPLE_API_PRIVATE */ | |
328 | #endif /* KERNEL */ | |
329 | #endif /* __FILEMGRINTERNAL__ */ | |
330 |