]> git.saurik.com Git - apple/hfs.git/blame - fsck_hfs/dfalib/SRuntime.h
hfs-366.30.3.tar.gz
[apple/hfs.git] / fsck_hfs / dfalib / SRuntime.h
CommitLineData
51e135ce
A
1/*
2 * Copyright (c) 1999, 2005-2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_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. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23/* SRuntime.h */
24
25#ifndef __SRUNTIME__
26#define __SRUNTIME__
27
28#if BSD
29
30#include <sys/types.h>
31#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
34#include <stdarg.h>
35
36#include <hfs/hfs_format.h>
37#else
38
39#include <MacTypes.h>
40#include <MacMemory.h>
41#include <HFSVolumes.h>
42#include <Errors.h>
43
44#endif
45
46#if BSD
47/* Classic Mac OS Types */
48typedef int8_t SInt8;
49typedef int16_t SInt16;
50typedef int32_t SInt32;
51typedef int64_t SInt64;
52
53typedef u_int8_t UInt8;
54typedef u_int16_t UInt16;
55typedef u_int32_t UInt32;
56typedef u_int64_t UInt64;
57
58typedef void * LogicalAddress;
59typedef char * Ptr;
60typedef Ptr * Handle;
61typedef u_int8_t Byte;
62typedef size_t Size;
63typedef unsigned char Boolean;
64typedef u_int32_t ItemCount;
65typedef u_int32_t ByteCount;
66typedef u_int32_t OptionBits;
67
68typedef int16_t OSErr;
69typedef int32_t OSStatus;
70
71typedef u_int32_t OSType;
72typedef u_int32_t ResType;
73
74typedef u_int16_t UniChar;
75typedef u_int32_t UniCharCount;
76typedef UniChar * UniCharArrayPtr;
77typedef const UniChar * ConstUniCharArrayPtr;
78typedef u_int32_t TextEncoding;
79
80typedef unsigned char * StringPtr;
81typedef unsigned char Str27[28];
82typedef unsigned char Str31[32];
83typedef unsigned char Str63[64];
84typedef unsigned char Str255[256];
85
86typedef const unsigned char * ConstStr31Param;
87typedef const unsigned char * ConstStr63Param;
88typedef const unsigned char * ConstStr255Param;
89
90typedef u_int32_t HFSCatalogNodeID;
91
92enum {
93 false = 0,
94 true = 1
95};
96
97/* OS error codes */
98enum {
99 noErr = 0,
100 dskFulErr = -34,
101 nsvErr = -35,
102 ioErr = -36,
103 eofErr = -39,
104 fnfErr = -43,
105 fBsyErr = -47,
106 paramErr = -50,
107 noMacDskErr = -57,
108 badMDBErr = -60,
109 memFullErr = -108,
110 notBTree = -410,
111 fileBoundsErr = -1309,
112};
113
114/* Finder Flags */
115enum {
116 kIsOnDesk = 0x0001,
117 kColor = 0x000E,
118 kIsShared = 0x0040,
119 kHasBeenInited = 0x0100,
120 kHasCustomIcon = 0x0400,
121 kIsStationery = 0x0800,
122 kNameLocked = 0x1000,
123 kHasBundle = 0x2000,
124 kIsInvisible = 0x4000,
125 kIsAlias = 0x8000
126};
127
128#define EXTERN_API(_type) extern _type
129#define EXTERN_API_C(_type) extern _type
130
131#define nil NULL
132
133EXTERN_API( void )
134DebugStr(ConstStr255Param debuggerMsg);
135
136typedef void * QElemPtr;
137typedef void * DrvQElPtr;
138
139
140#endif
141
142
143
144/* vcbFlags bits */
145enum {
146 kVCBFlagsIdleFlushBit = 3, /* Set if volume should be flushed at idle time */
147 kVCBFlagsIdleFlushMask = 0x0008,
148 kVCBFlagsHFSPlusAPIsBit = 4, /* Set if volume implements HFS Plus APIs itself (not via emu\
149 lation) */
150 kVCBFlagsHFSPlusAPIsMask = 0x0010,
151 kVCBFlagsHardwareGoneBit = 5, /* Set if disk driver returned a hardwareGoneErr to Read or W\
152 rite */
153 kVCBFlagsHardwareGoneMask = 0x0020,
154 kVCBFlagsVolumeDirtyBit = 15, /* Set if volume information has changed since the last Flush\
155 Vol */
156 kVCBFlagsVolumeDirtyMask = 0x8000
157};
158
159
160/* Disk Cache constants */
161/*
162 * UTGetBlock options
163 */
164enum {
165 gbDefault = 0, /* default value - read if not found */
166 /* bits and masks */
167 gbReadBit = 0, /* read block from disk (forced read) */
168 gbReadMask = 0x0001,
169 gbExistBit = 1, /* get existing cache block */
170 gbExistMask = 0x0002,
171 gbNoReadBit = 2, /* don't read block from disk if not found in cache */
172 gbNoReadMask = 0x0004,
173 gbReleaseBit = 3, /* release block immediately after GetBlock */
174 gbReleaseMask = 0x0008
175};
176
177
178/*
179 * UTReleaseBlock options
180 */
181enum {
182 rbDefault = 0, /* default value - just mark the buffer not in-use */
183 /* bits and masks */
184 rbWriteBit = 0, /* force write buffer to disk */
185 rbWriteMask = 0x0001,
186 rbTrashBit = 1, /* trash buffer contents after release */
187 rbTrashMask = 0x0002,
188 rbDirtyBit = 2, /* mark buffer dirty */
189 rbDirtyMask = 0x0004,
190 rbFreeBit = 3, /* free the buffer (save in the hash) */
191 rbFreeMask = 0x000A /* rbFreeMask (rbFreeBit + rbTrashBit) works as rbTrash on < System 7.0 RamCache; on >= System 7.0, rbfreeMask overrides rbTrash */
192};
193
194
195/*
196 * UTFlushCache options
197 */
198enum {
199 fcDefault = 0, /* default value - pass this fcOption to just flush any dirty buffers */
200 /* bits and masks */
201 fcTrashBit = 0, /* (don't pass this as fcOption, use only for testing bit) */
202 fcTrashMask = 0x0001, /* pass this fcOption value to flush and trash cache blocks */
203 fcFreeBit = 1, /* (don't pass this as fcOption, use only for testing bit) */
204 fcFreeMask = 0x0003 /* pass this fcOption to flush and free cache blocks (Note: both fcTrash and fcFree bits are set) */
205};
206
207
208/*
209 * UTCacheReadIP and UTCacheWriteIP cacheOption bits and masks are the ioPosMode
210 * bits and masks in Files.x
211 */
212
213/*
214 * Cache routine internal error codes
215 */
216enum {
217 chNoBuf = 1, /* no free cache buffers (all in use) */
218 chInUse = 2, /* requested block in use */
219 chnotfound = 3, /* requested block not found */
220 chNotInUse = 4 /* block being released was not in use */
221};
222
223
224/*
225 * FCBRec.fcbFlags bits
226 */
227enum {
228 fcbWriteBit = 0, /* Data can be written to this file */
229 fcbWriteMask = 0x01,
230 fcbResourceBit = 1, /* This file is a resource fork */
231 fcbResourceMask = 0x02,
232 fcbWriteLockedBit = 2, /* File has a locked byte range */
233 fcbWriteLockedMask = 0x04,
234 fcbSharedWriteBit = 4, /* File is open for shared write access */
235 fcbSharedWriteMask = 0x10,
236 fcbFileLockedBit = 5, /* File is locked (write-protected) */
237 fcbFileLockedMask = 0x20,
238 fcbOwnClumpBit = 6, /* File has clump size specified in FCB */
239 fcbOwnClumpMask = 0x40,
240 fcbModifiedBit = 7, /* File has changed since it was last flushed */
241 fcbModifiedMask = 0x80
242};
243
244enum {
245 fcbLargeFileBit = 3, /* File may grow beyond 2GB; cache uses file blocks, not bytes */
246 fcbLargeFileMask = 0x08
247};
248
249#define kSectorShift 9 /* log2(kSectorSize); used for bit shifts */
250
251/*
252 Fork Level Access Method Block get options
253*/
254enum {
255 kGetBlock = 0x00000000,
256 kForceReadBlock = 0x00000002,
257 kGetEmptyBlock = 0x00000008,
258 kSkipEndianSwap = 0x00000010
259};
260typedef OptionBits GetBlockOptions;
261
262/*
263 Fork Level Access Method Block release options
264*/
265enum {
266 kReleaseBlock = 0x00000000,
267 kForceWriteBlock = 0x00000001,
268 kMarkBlockDirty = 0x00000002,
269 kTrashBlock = 0x00000004
270};
271typedef OptionBits ReleaseBlockOptions;
272
273struct BlockDescriptor{
274 void *buffer;
275 void *blockHeader;
276 UInt64 blockNum;
277 UInt32 blockSize;
278 Boolean blockReadFromDisk;
279 Boolean fragmented;
280};
281typedef struct BlockDescriptor BlockDescriptor;
282typedef BlockDescriptor *BlockDescPtr;
283
284
285
286struct SFCB;
287
288struct SVCB {
289 UInt16 vcbSignature;
290 UInt16 vcbVersion;
291 UInt32 vcbAttributes;
292 UInt32 vcbLastMountedVersion;
293 UInt32 vcbReserved1;
294 UInt32 vcbCreateDate;
295 UInt32 vcbModifyDate;
296 UInt32 vcbBackupDate;
297 UInt32 vcbCheckedDate;
298 UInt32 vcbFileCount;
299 UInt32 vcbFolderCount;
300 UInt32 vcbBlockSize;
301 UInt32 vcbTotalBlocks;
302 UInt32 vcbFreeBlocks;
303 UInt32 vcbNextAllocation;
304 UInt32 vcbRsrcClumpSize;
305 UInt32 vcbDataClumpSize;
306 UInt32 vcbNextCatalogID;
307 UInt32 vcbWriteCount;
308 UInt64 vcbEncodingsBitmap;
309 UInt8 vcbFinderInfo[32];
310
311 /* MDB-specific fields... */
312 SInt16 vcbNmFls; /* number of files in root folder */
313 SInt16 vcbNmRtDirs; /* number of directories in root folder */
314 UInt16 vcbVBMSt; /* first sector of HFS volume bitmap */
315 UInt16 vcbAlBlSt; /* first allocation block in HFS volume */
316 UInt16 vcbVSeqNum; /* volume backup sequence number */
317 UInt16 vcbReserved2;
318 Str27 vcbVN; /* HFS volume name */
319
320 /* runtime fields... */
321 struct SFCB * vcbAllocationFile;
322 struct SFCB * vcbExtentsFile;
323 struct SFCB * vcbCatalogFile;
324 struct SFCB * vcbAttributesFile;
325 struct SFCB * vcbStartupFile;
326
327 UInt32 vcbEmbeddedOffset; /* Byte offset where HFS+ starts */
328 UInt16 vcbFlags;
329 SInt16 vcbDriveNumber;
330 SInt16 vcbDriverReadRef;
331 SInt16 vcbDriverWriteRef;
332
333 void * vcbBlockCache;
334
335 struct SGlob * vcbGPtr;
336
337 /* deprecated fields... */
338 SInt16 vcbVRefNum;
339};
340typedef struct SVCB SVCB;
341
342
343struct SFCB {
344 UInt32 fcbFileID;
345 UInt32 fcbFlags;
346 struct SVCB * fcbVolume;
347 void * fcbBtree;
348 HFSExtentRecord fcbExtents16;
349 HFSPlusExtentRecord fcbExtents32;
350 UInt32 fcbCatalogHint;
351 UInt32 fcbClumpSize;
352 UInt64 fcbLogicalSize;
353 UInt64 fcbPhysicalSize;
354 UInt32 fcbBlockSize;
355};
356typedef struct SFCB SFCB;
357
358
359extern OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize);
360
361extern OSErr DeviceRead(int device, int drive, void* buffer, SInt64 offset, UInt32 reqBytes, UInt32 *actBytes);
362
363extern OSErr DeviceWrite(int device, int drive, void* buffer, SInt64 offset, UInt32 reqBytes, UInt32 *actBytes);
364
365
366/*
367 * Block Cache Interface
368 */
369extern void InitBlockCache(SVCB *volume);
370
371extern OSStatus GetVolumeBlock (SVCB *volume, UInt64 blockNum, GetBlockOptions options,
372 BlockDescriptor *block);
373
374extern OSStatus ReleaseVolumeBlock (SVCB *volume, BlockDescriptor *block,
375 ReleaseBlockOptions options);
376
377extern OSStatus GetFileBlock (SFCB *file, UInt32 blockNum, GetBlockOptions options,
378 BlockDescriptor *block);
379
380extern OSStatus ReleaseFileBlock (SFCB *file, BlockDescriptor *block,
381 ReleaseBlockOptions options);
382
383extern OSStatus SetFileBlockSize (SFCB *file, ByteCount blockSize);
384
385
386
387#if BSD
388
389#define AllocateMemory(size) malloc((size_t)(size))
390#define AllocateClearMemory(size) calloc(1,(size_t)(size))
391#define ReallocateMemory(ptr,newSize) SetPtrSize((void*)(ptr),(size_t)(newSize))
392#define MemorySize(ptr) malloc_size((void*)(ptr))
393#define DisposeMemory(ptr) free((void *)(ptr))
394#define CopyMemory(src,dst,len) bcopy((void*)(src),(void*)(dst),(size_t)(len))
395#define ClearMemory(start,len) bzero((void*)(start),(size_t)(len))
396
397extern UInt32 TickCount();
398extern OSErr MemError(void);
399extern Handle NewHandleClear(Size byteCount);
400extern Handle NewHandle(Size byteCount);
401extern void DisposeHandle(Handle h);
402extern Size GetHandleSize(Handle h);
403extern void SetHandleSize(Handle h, Size newSize);
404extern OSErr PtrAndHand(const void *ptr1, Handle hand2, long size);
405
406#else
407
408#define AllocateMemory(size) NewPtr((Size)(size))
409#define AllocateClearMemory(size) NewPtrClear((Size)(size))
410#define ReallocateMemory(ptr,newSize) SetPtrSize((Ptr)(ptr),(Size)(newSize))
411#define MemorySize(ptr) GetPtrSize((Ptr)(ptr))
412#define DisposeMemory(ptr) DisposePtr((Ptr)(ptr))
413#define CopyMemory(src,dst,len) BlockMoveData((void *)(src),(void *)(dst),(Size)(len))
414void ClearMemory(void* start, long len);
415#endif
416
417
418#endif /* __SRUNTIME__ */
419
420