|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: File: FilesInternal.h
27:
28: Contains: IPI for File Manager (HFS Plus)
29:
30: Version: HFS Plus 1.0
31:
32: Copyright: � 1996-1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: Don Brady
37:
38: Other Contacts: Mark Day, Deric horn, Jim Luther
39:
40: Technology: File Systems
41:
42: Writers:
43:
44: (JL) Jim Luther
45: (msd) Mark Day
46: (djb) Don Brady
47: (DSH) Deric Horn
48:
49: Change History (most recent first):
50: <Rhap> 11/20/98 djb Add support for UTF-8 names.
51: <Rhap> 8/31/98 djb Added boolean flag to GetTimeLocal prototype.
52: <Rhap> 6/30/98 djb Add NodesAreContiguous prototype (for radar #2249539).
53: <Rhap> 6/22/98 djb Add ERR_BASE to error codes to make them negative (for Rhapsody only).
54: Replace DeallocFile prototype with DeleteFile prototype.
55: <Rhap> 6/5/98 djb Added CreateFileIDRef prototype;
56: <Rhap> 6/3/98 djb Add MoveRenameCatalogNode prototype (replaces seperate Move and Rename).
57: <Rhap> 4/17/98 djb Add VCB locking.
58: <Rhap> 4/6/98 djb Removed CreateVolumeCatalogCache and DisposeVolumeCatalogCache (obsolete).
59: <Rhap> 4/2/98 djb UpdateCatalogNode now takes parID and name as input.
60: <Rhap> 3/31/98 djb Sync up with final HFSVolumes.h header file.
61: <Rhap> 3/17/98 djb Fixed CreateCatalogNode interface to take kCatalogFolderNode and
62: kCatalogFileNode as type input.
63:
64: <CS30> 1/29/98 DSH Added TrashVolumeDiskCache prototype for TrashAllFSCaches API
65: support.
66: <CS29> 12/10/97 DSH 2201501, Overload the NodeData valence field for over 2 Gig file
67: support.
68: <CS28> 11/18/97 DSH Conditionalize ou BlockCameFromDisk() macro for DFA
69: <CS27> 11/16/97 djb LockMappingTable is now defined in UnicodeConverterPriv.i.
70: <CS26> 11/13/97 djb Move CatalogIterator struct to CatalogPrivate.h. Include
71: UnicodeConverter.i instead of Unicode.i.
72: <CS25> 11/3/97 JL #2001483 - changed UnMountVolume's prototype.
73: <24> 10/31/97 DSH Added consistencyStatus parameter to MountCheck.
74: <CS23> 10/21/97 DSH Interfacer tweak
75: <CS22> 10/21/97 DSH Conditionalize LMGetFCBTable, LMGetFSVars for DFA to call
76: through DFAs LowMem accessors.
77: <CS21> 10/20/97 msd Add a bytesMaximum parameter to BlockAllocate; removed fcb
78: parameter.
79: <CS20> 10/19/97 msd Bug 1684586. Remove the modifyDate field from CatalogNodeDate.
80: GetCatInfo and SetCatInfo use only contentModDate.
81: <CS19> 10/16/97 djb Add LMGetFSVars and LMGetFCBTable macros, add gBlockCacheDirty
82: to FSVars, simplified HFS Stack swapping macros.
83: <CS18> 10/13/97 DSH Added InitBTreeHeader prototype
84: <CS17> 10/13/97 djb Add volumeNameEncodingHint to VCB, add textEncoding to
85: CatalogNodeData, add gTextEncodingFontName to FSVars.
86: <CS16> 10/1/97 DSH Added CheckVolumeConsistency() for 1682475.
87: <CS15> 10/1/97 djb New Catalog iterators and Catalog node cache SPI.
88: <CS14> 9/17/97 DSH Moved prototype HFSBlocksFromTotalSectors() here for DFA
89: wrapperless volume support.
90: <CS13> 9/16/97 msd Add a field to FSVarsRec to store old WriteXParam address.
91: <CS12> 9/15/97 djb Add gBootPToUTable to FSVars (used to bootstrap Unicode).
92: <CS11> 9/7/97 djb Add FlushBlockCache prototype.
93: <CS10> 9/4/97 djb Add cmParentNotFound error code and reportMissingParent bit.
94: <CS9> 9/4/97 msd Remove unused attributes calls. Rename PropertyCloseVolume to
95: AttributesCloseVolume. In CatalogNodeData, replace
96: attributeModDate with modifyDate. Remove macro LatestModDate.
97: <CS8> 8/22/97 djb Add readFromDisk flag to GetCacheBlock and BlockCameFromDisk
98: macro.
99: <CS7> 8/18/97 DSH Override ASM cache accessing routines for DFA to use DFA cache.
100: <CS6> 7/28/97 msd Add prototypes for CacheReadInPlace, RemountWrappedVolumes.
101: <CS5> 7/25/97 DSH Added GenericMRUCache Routines
102: <CS4> 7/22/97 msd In CatalogNodeData, move attributeModDate after backupDate; this
103: allows SetCatInfo to manipulate the rest of the dates in one
104: block, the same as in the parameter block.
105: <CS3> 7/21/97 djb Add more instrumentation globals (CallProfile). Reallign FSVars.
106: <CS2> 7/18/97 msd Selector for PBCreateAttribute conflicts with PBGetXCatInfo. The
107: attribute calls now have selectors in the range $65..$69.
108: <CS1> 7/16/97 DSH first checked in
109: <CS23> 7/8/97 DSH Added LockMappingTable() until its moved into the Unicode header
110: files.
111: <CS22> 7/7/97 DSH Taking out changes made in HFS <45> for greater compatability
112: with the Tempo installer.
113: <CS21> 6/27/97 msd Add PBLongRename SPI. Add prototype for
114: RenameCatalogNodeUnicode.
115: <CS20> 6/26/97 DSH Conditionalized macro LocalToUTC to not look at FSVars for DFA.
116: <CS19> 6/25/97 msd Add prototype for HFSCommunicationProc.
117: <CS18> 6/24/97 DSH Adding runtime flags to deturmine unicode usage and installation
118: status.
119: <CS17> 6/24/97 djb Add linkCount to CatalogNodeData. Add LinkCatalogNode prototype.
120: Move Private Catalog Manager prototypes to CatalogPrivate.h.
121: <CS16> 6/20/97 msd Add prototype for CopyCatalogNodeData. In CatalogNodeData,
122: replaced modifyDate with contentModDate and attributeModDate.
123: Added a LatestModDate macro.
124: <15> 6/18/97 djb Add mask to ConversionContext. Add encodingsBitmap to VCB (and
125: reallign some fields). Add gInstalledEncodings to FSVars.
126: <CS14> 6/17/97 msd The conversions between local time and UTC have the sign of the
127: offset backwards.
128: <CS13> 6/13/97 djb Removed PrepareOutputName. Changed parameters for
129: DeleteCatalogNode, MoveCatalogNode, PrepareInputName. Add
130: private catalog macros.
131: <CS12> 6/12/97 msd Export BlockAllocateAny and UpdateVCBFreeBlks.
132: <CS11> 6/12/97 msd Add a parameter block and prototype for an SPI to create very
133: large files.
134: <CS10> 6/9/97 msd Add an offsetToUTC field to FSVarsRec. Add prototypes for
135: GetTimeUTC and GetTimeLocal; add macros for LocalToUTC and
136: UTCToLocal.
137: <CS9> 6/5/97 msd Add MapLogicalToPhysical (internal routine), PBMapFilePosition
138: for external use.
139: <CS8> 6/4/97 djb More Unicode converter changes (support for non roman scripts).
140: <CS7> 6/2/97 msd Add prototype for AdjustEOF.
141: <CS6> 5/28/97 msd Add prototypes for attributes SPI, both internal routines and PB
142: calls. Add FindFileNameGlueRec and FindFileName routine.
143: Prototypes for FindFileControlBlock and AccessBTree disappeared,
144: so added again.
145: <CS5> 5/20/97 DSH Including LowMemPriv.a in DFA compiles
146: <CS4> 5/19/97 djb Add uppLockMappingTable to FSVars.
147: <CS3> 5/19/97 djb Add CreateVolumeCatalogCache and DisposeVolumeCatalogCache
148: prototypes. Remove private CatalogDataCache structure.
149: <CS2> 5/16/97 msd Use fixed-size integers for GetBlock_glue and RelBlock_glue so
150: it will build with compilers other than MPW C and SC. Add
151: prototype for FillHFSStack, UnMountVolume, and
152: MakeVCBsExtendedVCBs from VolumeRequests.c. Add prototypes for
153: CreateEmbeddedVolume and InitUnicodeConverter.
154: <CS1> 5/9/97 djb first checked in
155: <CS2> 5/7/97 djb Add summary trace data. Shrink FSVars.later to 4 longs.
156: <CS1> 4/28/97 djb first checked in
157:
158: */
159: #ifndef __FILEMGRINTERNAL__
160: #define __FILEMGRINTERNAL__
161:
162: #if TARGET_OS_MAC
163:
164: #ifndef __TYPES__
165: #include <Types.h>
166: #endif
167: #ifndef __FILES__
168: #include <Files.h>
169: #endif
170: #ifndef __FSM__
171: #include <FSM.h>
172: #endif
173: #ifndef __LOWMEM__
174: #include <LowMem.h>
175: #endif
176: #ifndef __OSUTILS__
177: #include <OSUtils.h>
178: #endif
179: #ifndef __PROCESSES__
180: #include <Processes.h>
181: #endif
182: #ifndef __TEXTCOMMON__
183: #include <TextCommon.h>
184: #endif
185: #ifndef __UNICODECONVERTER__
186: #include <UnicodeConverter.h>
187: #endif
188:
189: #else
190:
191: #ifndef __MACOSTYPES__
192: #include "system/MacOSTypes.h"
193: #endif
194: #ifndef __MACOSSTUBS__
195: #include "system/MacOSStubs.h"
196: #endif
197: #include <mach/machine/simple_lock.h>
198: #endif /* TARGET_OS_MAC */
199:
200: #ifndef __HFSVOLUMES__
201: #include "HFSVolumes.h"
202: #endif
203:
204: #if FORDISKFIRSTAID
205: #else
206: #define FORDISKFIRSTAID 0
207: #endif
208:
209: #if PRAGMA_ONCE
210: #pragma once
211: #endif
212:
213: #ifdef __cplusplus
214: extern "C" {
215: #endif
216:
217: #if PRAGMA_IMPORT
218: #pragma import on
219: #endif
220:
221: #if PRAGMA_STRUCT_ALIGN
222: #pragma options align=mac68k
223: #elif PRAGMA_STRUCT_PACKPUSH
224: #pragma pack(push, 2)
225: #elif PRAGMA_STRUCT_PACK
226: #pragma pack(2)
227: #endif
228:
229: /* internal error codes*/
230:
231: #if TARGET_OS_RHAPSODY
232: #define ERR_BASE -32767
233: #else
234: #define ERR_BASE 0
235: #endif
236:
237: enum {
238: /* FXM errors*/
239: fxRangeErr = ERR_BASE + 16, /* file position beyond mapped range*/
240: fxOvFlErr = ERR_BASE + 17, /* extents file overflow*/
241: /* Unicode errors*/
242: uniTooLongErr = ERR_BASE + 24, /* Unicode string too long to convert to Str31*/
243: uniBufferTooSmallErr = ERR_BASE + 25, /* Unicode output buffer too small*/
244: uniNotMappableErr = ERR_BASE + 26, /* Unicode string can't be mapped to given script*/
245: /* BTree Manager errors*/
246: btNotFound = ERR_BASE + 32, /* record not found*/
247: btExists = ERR_BASE + 33, /* record already exists*/
248: btNoSpaceAvail = ERR_BASE + 34, /* no available space*/
249: btNoFit = ERR_BASE + 35, /* record doesn't fit in node */
250: btBadNode = ERR_BASE + 36, /* bad node detected*/
251: btBadHdr = ERR_BASE + 37, /* bad BTree header record detected*/
252: dsBadRotate = ERR_BASE + 64, /* bad BTree rotate*/
253: /* Catalog Manager errors*/
254: cmNotFound = ERR_BASE + 48, /* CNode not found*/
255: cmExists = ERR_BASE + 49, /* CNode already exists*/
256: cmNotEmpty = ERR_BASE + 50, /* directory CNode not empty (valence = 0)*/
257: cmRootCN = ERR_BASE + 51, /* invalid reference to root CNode*/
258: cmBadNews = ERR_BASE + 52, /* detected bad catalog structure*/
259: cmFThdDirErr = ERR_BASE + 53, /* thread belongs to a directory not a file*/
260: cmFThdGone = ERR_BASE + 54, /* file thread doesn't exist*/
261: cmParentNotFound = ERR_BASE + 55, /* CNode for parent ID does not exist*/
262: /* TFS internal errors*/
263: fsDSIntErr = -127 /* Internal file system error*/
264: };
265:
266:
267: /* internal flags*/
268:
269:
270: enum {
271: /* File System busy flag:*/
272: /* Bit zero of FSBusy (lomem $360) is true when the file system is running.*/
273: /* The word at $360 is cleared when the file system is exited. The*/
274: /* bits defined here are for additional flags in the FSBusy word that are*/
275: /* valid only when the file system is running.*/
276: fsBusyBit = 0, /* file system is running; other FSBusy bits are valid*/
277: fsSCSIDefer = 1, /* file system is waiting for SCSI transaction to complete*/
278: fsIntMaskDefer = 2, /* file system is waiting until the interrupt mask is lowered*/
279: /* Flag bits in HFSFlags byte:*/
280: hfsReq = 0, /* Set if request is specific to HFS*/
281: dirCN = 1, /* Set if a CNode is a directory*/
282: reportMissingParent = 4, /* tell Catalog to report missing parents (used by MakeFSSpec)*/
283: skipPMSP = 5, /* Set to skip PMSP setup (one-shot)*/
284: noPMSP = 6, /* Set to disable PMSP completely (status flag)*/
285: hfsContd = 7, /* Set if Async trap is continued*/
286: /* fsFlags values*/
287: fsNoAllocate = 0,
288: fsNoAllocateMask = 0x01, /* true when allocating memory is a very bad idea*/
289: fsNeedFCBs = 1,
290: fsNeedFCBsMask = 0x02, /* true when a local FCB couldn't be found */
291: fsNoFCBExpansion = 2,
292: fsNoFCBExpansionMask = 0x04, /* true if no FCB expansion logic is desired*/
293: /* ExtendFile option flags*/
294: /* extendFileAllBit = 0, |* allocate all requested bytes or none *|*/
295: /* extendFileAllMask = 0x0001,*/
296: /* */
297: /* extendFileContigBit = 1, |* force contiguous allocation *|*/
298: /* extendFileContigMask = 0x0002*/
299: kEFContigBit = 1, /* force contiguous allocation*/
300: kEFContigMask = 0x02,
301: kEFAllBit = 0, /* allocate all requested bytes or none*/
302: kEFAllMask = 0x01, /* TruncateFile option flags*/
303: kTFTrunExtBit = 0, /* truncate to the extent containing new PEOF*/
304: kTFTrunExtMask = 1
305: };
306:
307:
308:
309: enum {
310: HFSStkLen = 1792, /* old stack size (pre HFS Plus)*/
311: kFileSystemStackSlop = 16, /* additional temporary space*/
312: kFileSystemStackSize = 16384, /* give us more breathing room*/
313: kFileSystemVersion = FOUR_CHAR_CODE('2.0A'), /* current file system version*/
314: /* 31744 = $7C00, a nice round number close to*/
315: /* (32767*1000)/1024, which is about the largest */
316: /* free space unsuspecting, decimal-K minded apps*/
317: /* might be expected to handle.*/
318: /* AlBlkLim*/
319: kMaxHFSAllocationBlocks = 31744,
320: WDRfnMin = -32767, /* lowest assigned WD RefNum*/
321: WDRfnMax = -4096, /* largest possible WDrefnum*/
322: kFirstFileRefnum = 2, /* smallest FCB refnum*/
323: kNoHint = 0
324: };
325:
326:
327: /* Internal LowMem pointers*/
328:
329: /*�� The following should really be in LowMemPriv.i*/
330:
331: enum {
332: FSCallAsync = 0x0342, /* ONE BYTE FREE*/
333: NoEject = 0x034B, /* used by Eject and Offline*/
334: CacheFlag = 0x0377,
335: SysBMCPtr = 0x0378, /* System-wide bitmap cache pointer*/
336: SysCtlCPtr = 0x0380, /* System-wide control cache pointer*/
337: HFSDSErr = 0x0392, /* Final gasp - error that caused IOErr.*/
338: LMParamBlock = 0x03A4, /* LMGetParams() just gives us a copy of it*/
339: FSVarsPtr = 0x0BB8, /* lomem that points to file system variable block*/
340: CacheVars = 0x0394,
341: HFSStkPtr = 0x036E, /* Temporary location of HFS Stack pointer*/
342: FSIOErr = 0x03DE, /* last I/O error (NEXT WORD FREE)*/
343: /* file manager vectors not found in LowMemPriv.i*/
344: JUpdAltMDB = (0xED) * 4 + 0x0400, /* ($A0ED) $0400 is n/OSTable*/
345: JCkExtFS = (0xEE) * 4 + 0x0400, /* ($A0EE) $0400 is n/OSTable*/
346: JBMChk = (0xF0) * 4 + 0x0400, /* ($A0F0) $0400 is n/OSTable*/
347: JTstMod = (0xF1) * 4 + 0x0400, /* ($A0F1) $0400 is n/OSTable*/
348: JLocCRec = (0xF2) * 4 + 0x0400, /* ($A0F2) $0400 is n/OSTable*/
349: JTreeSearch = (0xF3) * 4 + 0x0400, /* ($A0F3) $0400 is n/OSTable*/
350: JMapFBlock = (0xF4) * 4 + 0x0400, /* ($A0F4) $0400 is n/OSTable*/
351: JXFSearch = (0xF5) * 4 + 0x0400, /* ($A0F5) $0400 is n/OSTable*/
352: JReadBM = (0xF6) * 4 + 0x0400 /* ($A0F6) $0400 is n/OSTable*/
353: };
354:
355:
356: /* Poor Man's Search Path*/
357:
358: struct SearchPathHeader {
359: Ptr PMSPHook; /* Hook for PMSP modification*/
360: short PMSPIndx; /* Index to PMSP index from start of PMSP*/
361: };
362: typedef struct SearchPathHeader SearchPathHeader;
363:
364: struct SearchPathEntry {
365: short spVRefNum; /* VRefNum in PMSP entry*/
366: UInt32 spDirID; /* Directory ID in PMSP entry*/
367: };
368: typedef struct SearchPathEntry SearchPathEntry;
369:
370:
371: enum {
372: kPoorMansSearchIndex = -2,
373: MaxDVCnt = 8, /* Leave room for 8 default VRefNums*/
374: PMSPSize = MaxDVCnt * sizeof(SearchPathEntry) + sizeof(SearchPathHeader) + 2
375: };
376:
377:
378:
379: enum {
380: fsWDCBExtendCount = 8, /* # of WDCB's to add when we run out*/
381: /* FileIDs variables*/
382: kNumExtentsToCache = 4 /* just guessing for ExchangeFiles*/
383: };
384:
385:
386: enum {
387: kInvalidMRUCacheKey = -1L, /* flag to denote current MRU cache key is invalid*/
388: kDefaultNumMRUCacheBlocks = 16 /* default number of blocks in each cache*/
389: };
390:
391:
392: /* Universal Extent Key */
393:
394: union ExtentKey {
395: HFSExtentKey hfs;
396: HFSPlusExtentKey hfsPlus;
397: };
398: typedef union ExtentKey ExtentKey;
399: /* Universal extent descriptor */
400:
401: union ExtentDescriptor {
402: HFSExtentDescriptor hfs;
403: HFSPlusExtentDescriptor hfsPlus;
404: };
405: typedef union ExtentDescriptor ExtentDescriptor;
406: /* Universal extent record */
407:
408: union ExtentRecord {
409: HFSExtentRecord hfs;
410: HFSPlusExtentRecord hfsPlus;
411: };
412: typedef union ExtentRecord ExtentRecord;
413: /* Universal catalog key */
414:
415: union CatalogKey {
416: HFSCatalogKey hfs;
417: HFSPlusCatalogKey hfsPlus;
418: };
419: typedef union CatalogKey CatalogKey;
420: /* Universal catalog data record */
421:
422: union CatalogRecord {
423: SInt16 recordType;
424: HFSCatalogFolder hfsFolder;
425: HFSCatalogFile hfsFile;
426: HFSCatalogThread hfsThread;
427: HFSPlusCatalogFolder hfsPlusFolder;
428: HFSPlusCatalogFile hfsPlusFile;
429: HFSPlusCatalogThread hfsPlusThread;
430: };
431: typedef union CatalogRecord CatalogRecord;
432: /*
433: Key for records in the attributes file. Fields are compared in the order:
434: cnid, attributeName, startBlock
435: */
436:
437: struct AttributeKey {
438: UInt16 keyLength; /* must set kBTBigKeysMask and kBTVariableIndexKeysMask in BTree header's attributes */
439: UInt16 pad;
440: HFSCatalogNodeID cnid; /* file or folder ID */
441: UInt32 startBlock; /* block # relative to start of attribute */
442: HFSUniStr255 attributeName; /* variable length */
443: };
444: typedef struct AttributeKey AttributeKey;
445:
446: enum {
447: kAttributeKeyMaximumLength = sizeof(AttributeKey) - sizeof(UInt16),
448: kAttributeKeyMinimumLength = kAttributeKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(UInt16)
449: };
450:
451:
452: enum {
453: CMMaxCName = kHFSMaxFileNameChars
454: };
455:
456:
457: /* Internal Data structures*/
458:
459: struct ExtendedVCB {
460: QElemPtr qLink;
461: SInt16 qType;
462: SInt16 vcbFlags;
463: UInt16 vcbSigWord;
464: UInt32 vcbCrDate;
465: UInt32 vcbLsMod;
466: SInt16 vcbAtrb;
467: UInt16 vcbNmFls;
468: SInt16 vcbVBMSt;
469: SInt16 vcbAllocPtr;
470: UInt16 vcbNmAlBlks;
471: SInt32 vcbAlBlkSiz;
472: SInt32 vcbClpSiz;
473: SInt16 vcbAlBlSt;
474: SInt32 vcbNxtCNID;
475: UInt16 vcbFreeBks;
476: UInt8 vcbVN[256];
477: SInt16 vcbDrvNum;
478: SInt16 vcbDRefNum;
479: SInt16 vcbFSID;
480: SInt16 vcbVRefNum;
481: Ptr vcbMAdr;
482: Ptr vcbBufAdr;
483: SInt16 vcbMLen;
484: SInt16 vcbDirIndex;
485: SInt16 vcbDirBlk;
486: UInt32 vcbVolBkUp;
487: UInt16 vcbVSeqNum;
488: SInt32 vcbWrCnt;
489: SInt32 vcbXTClpSiz;
490: SInt32 vcbCTClpSiz;
491: UInt16 vcbNmRtDirs;
492: SInt32 vcbFilCnt;
493: SInt32 vcbDirCnt;
494: SInt32 vcbFndrInfo[8];
495: UInt16 vcbEmbedSigWord; /* embedded volume signature (formerly vcbVCSize)*/
496: HFSExtentDescriptor vcbEmbedExtent; /* embedded volume location and size (formerly vcbVBMCSiz and vcbCtlCSiz)*/
497: UInt16 vcbXTAlBlks;
498: UInt16 vcbCTAlBlks;
499: FileReference extentsRefNum;
500: FileReference catalogRefNum;
501: Ptr vcbCtlBuf;
502: SInt32 vcbDirIDM;
503: SInt16 vcbOffsM;
504:
505: /* Extended VCB information*/
506: UInt16 reserved; /* align to 4-byte boundry*/
507: UInt32 hfsPlusIOPosOffset; /* Disk block where HFS+ starts */
508:
509: FileReference allocationsRefNum;
510: FileReference attributesRefNum; /* volume's attributes file, if any*/
511:
512: UInt32 allocationsClumpSize; /* clump size for allocations file (also in fcb)*/
513: UInt32 attributesClumpSize; /* clump size for attributes file (also in fcb)*/
514:
515: UInt32 blockSize; /* size of allocation blocks - vcbAlBlkSiz*/
516: UInt32 totalBlocks; /* number of allocation blocks in volume (includes this header and VBM) - vcbNmAlBlks*/
517: UInt32 freeBlocks; /* number of unused allocation blocks - vcbFreeBks*/
518: UInt32 nextAllocation; /* start of next allocation search - vcbAllocPtr*/
519:
520: UInt32 checkedDate; /* date and time of last disk check */
521:
522: UInt64 encodingsBitmap; /* HFS Plus only*/
523: TextEncoding volumeNameEncodingHint; /* Text encoding used for volume name*/
524:
525: Ptr hintCachePtr; /* points to this volumes heuristicHint cache*/
526:
527: #if TARGET_OS_RHAPSODY
528: simple_lock_data_t vcbSimpleLock; /* simple lock to allow concurrent access to vcb data */
529: #endif
530: };
531: typedef struct ExtendedVCB ExtendedVCB;
532:
533: struct FCB {
534: UInt32 fcbFlNm; /* FCB file number. Non-zero marks FCB used */
535: SignedByte fcbFlags; /* FCB flags */
536: SignedByte fcbTypByt; /* File type byte */
537: UInt16 fcbSBlk; /* File start block (in alloc size blks) */
538: UInt32 fcbEOF; /* Logical length or EOF in bytes */
539: UInt32 fcbPLen; /* Physical file length in bytes */
540: UInt32 fcbCrPs; /* Current position within file */
541: ExtendedVCB * fcbVPtr; /* Pointer to the corresponding ExtendedVCB */
542: Ptr fcbBfAdr; /* File's buffer address */
543: unsigned short fcbFlPos; /* Directory block this file is in */
544: UInt32 fcbClmpSize; /* Number of bytes per clump */
545: Ptr fcbBTCBPtr; /* Pointer to B*-Tree control block for file */
546: HFSExtentRecord fcbExtRec; /* First 3 file extents */
547: #if TARGET_OS_MAC
548: OSType fcbFType; /* File's 4 Finder Type bytes */
549: UInt32 fcbCatPos; /* Catalog hint for use on Close */
550: UInt32 fcbDirID; /* Parent Directory ID */
551: Str31 fcbCName; /* CName of open file */
552: #endif
553: };
554: typedef struct FCB FCB;
555:
556: struct ExtendedFCB {
557: UInt32 processID1; /* these two fields are the Process Manager PID that*/
558: UInt32 processID2; /* opened the file (used to clean up at process death).*/
559: HFSPlusExtentRecord extents; /* extents for HFS+ volumes*/
560: };
561: typedef struct ExtendedFCB ExtendedFCB;
562:
563: struct ParallelFCB {
564: UInt16 count; /* number of ExtendedFCB's*/
565: UInt16 unitSize; /* size of a single ExtendedFCB (should be sizeof(ExtendedFCB))*/
566: ExtendedFCB extendedFCB[1];
567: };
568: typedef struct ParallelFCB ParallelFCB;
569:
570: struct ExtendedWDCB {
571: UInt32 processID1;
572: UInt32 processID2;
573: };
574: typedef struct ExtendedWDCB ExtendedWDCB;
575:
576:
577: struct ParallelWDCB {
578: UInt16 count; /* number of ExtendedFCB's*/
579: UInt16 unitSize; /* size of a single ExtendedFCB (should be sizeof(ExtendedFCB))*/
580: ExtendedWDCB extendedWDCB[1];
581: };
582: typedef struct ParallelWDCB ParallelWDCB;
583:
584: struct WDCBArray {
585: UInt16 count;
586: WDCBRec wdcb[1];
587: };
588: typedef struct WDCBArray WDCBArray;
589:
590: struct FCBArray {
591: UInt16 length; /* first word is FCB part length*/
592: FCB fcb[1]; /* fcb array*/
593: };
594: typedef struct FCBArray FCBArray;
595:
596: /* Volumes*/
597:
598:
599: enum {
600: vcbMaxNam = 27, /* volumes currently have a 27 byte max name length*/
601: /* VCB flags*/
602: vcbManualEjectMask = 0x0001, /* bit 0 manual-eject bit: set if volume is in a manual-eject drive*/
603: vcbFlushCriticalInfoMask = 0x0002, /* bit 1 critical info bit: set if critical MDB information needs to flush*/
604: /* IoParam->ioVAtrb*/
605: kDefaultVolumeMask = 0x0020,
606: kFilesOpenMask = 0x0040
607: };
608:
609:
610: /* Catalog Node Data - universal data returned from the Catalog Manager*/
611:
612:
613: enum {
614: kCatalogFolderNode = FOUR_CHAR_CODE('fold'),
615: kCatalogFileNode = FOUR_CHAR_CODE('file'), /* mask bits for afp's three inhibit bits which live in fdXFlags in xFndrInfo*/
616: xFFFilAttrLockMask = 0x70
617: };
618:
619: /* valence is overloaded for files and used as additional flags. 2201501*/
620:
621: enum {
622: kLargeDataForkMask = 0x00000001,
623: kLargeRsrcForkMask = 0x00000002
624: };
625:
626: struct CatalogNodeData {
627: OSType nodeType; /* 'file' or 'fold' */
628: UInt32 nodeFlags; /* node flags */
629: HFSCatalogNodeID nodeID; /* node ID */
630: UInt32 createDate; /* date and time of creation */
631: UInt32 contentModDate; /* date and time of last fork modification */
632: UInt32 backupDate; /* date and time of last backup */
633: UInt8 finderInfo[16]; /* Finder information part 1 */
634: UInt8 extFinderInfo[16]; /* Finder information part 2 */
635:
636: UInt32 valence; /* valence for folders, overloaded for files for additional flags (larger than 2 Gig flag) */
637: UInt32 textEncoding; /* hint for name conversions */
638:
639: UInt32 dataLogicalSize; /* files only */
640: UInt32 dataPhysicalSize; /* files only */
641: UInt32 rsrcLogicalSize; /* files only */
642: UInt32 rsrcPhysicalSize; /* files only */
643:
644: HFSPlusExtentRecord dataExtents; /* files only */
645: HFSPlusExtentRecord rsrcExtents; /* files only */
646: #if TARGET_OS_RHAPSODY
647: UInt32 accessDate; /* date and time of last access (Rhapsody only) */
648: UInt32 attributeModDate; /* date and time of last attribute modification (Rhapsody only) */
649: HFSPlusPermissions permissions; /* permissions (for Rhapsody) */
650: #endif
651:
652: };
653: typedef struct CatalogNodeData CatalogNodeData;
654:
655: /* Universal catalog name*/
656:
657: union CatalogName {
658: Str31 pstr;
659: HFSUniStr255 ustr;
660: };
661: typedef union CatalogName CatalogName;
662:
663: /* Unicode Conversion*/
664:
665:
666: enum {
667: kMacBaseEncodingCount = 50,
668: kTextEncodingUndefined = 0x00007FFF
669: };
670:
671: struct ConversionContext {
672: TextToUnicodeInfo toUnicode;
673: UnicodeToTextInfo fromUnicode;
674: };
675: typedef struct ConversionContext ConversionContext;
676:
677: struct CallProfile {
678: UInt16 refCount;
679: UInt16 errCount;
680: UInt32 callCount;
681: UInt32 minTime;
682: UInt32 maxTime;
683: UInt64 totalTime;
684: UInt64 startBase; /* in nanoseconds*/
685: };
686: typedef struct CallProfile CallProfile;
687:
688:
689: struct FSVarsRec {
690: #if TARGET_OS_MAC
691: short length;
692: void * gBlockCacheGlobals;
693: long XFS;
694: long BTMgr;
695: long DTDBMgr;
696: long FSMgr;
697: long QMgr;
698: ParallelFCB * fcbPBuf; /* Parallel FCB array*/
699: long wdcbPBuf;
700: short reserved1;
701: DeferredTask fsDefer; /* <in OSUtils.h>*/
702: long dtOwnCall;
703: long FSMHook;
704: short fsSelector;
705: Byte fsFlags;
706: Boolean gBlockCacheDirty;
707: ExtendedVCB * dsRecoverVCBPtr; /* pointer to VCB of volume we're doing a disk switch for*/
708: unsigned char * dsRecoverNamePtr; /* points to name of volume we're doing a disk switch for*/
709: UInt16 fsFCBBurst; /* # of FCBs that we'd like to keep free*/
710: UInt16 fsFCBGrow; /* # of FCBs to make free when we grow the array*/
711: UInt16 fsFCBMax; /* max # of FCBs to allow*/
712: UInt16 fsFCBCounter; /* counts down as files are opened*/
713: UInt32 later[4]; /* and a few more for later*/
714:
715: void * userStackPtr; /* user's A7 stack pointer*/
716: FSSpec gCatalogFSSpec; /* space to hold catalog manager's FSSpec output (70 bytes)*/
717: Boolean gUseDynamicUnicodeConverters;
718: Boolean gIsUnicodeInstalled;
719: CatalogNodeData gCatalogData; /* space to hold catalog manager's universal node data (212 bytes)*/
720:
721: UInt32 gDefaultBaseEncoding;
722: ItemCount gInstalledEncodings;
723: ConversionContext gConversionContext[50];
724: UniversalProcPtr uppCreateTextToUnicodeInfo;
725: UniversalProcPtr uppCreateUnicodeToTextInfo;
726: UniversalProcPtr uppConvertFromTextToUnicode;
727: UniversalProcPtr uppConvertFromUnicodeToText;
728: UniversalProcPtr uppUpgradeScriptInfoToTextEncoding;
729: UniversalProcPtr uppRevertTextEncodingToScriptInfo;
730: UniversalProcPtr uppLockMappingTable;
731:
732: UInt32 gNativeCPUtype; /* what processor are we running on*/
733: UInt32 gTimeBaseFactor; /* adjustment for �sec*/
734: CallProfile gCallProfile[32]; /* call profiles for unicode and b-tree calls*/
735:
736: Ptr gAttributesBuffer; /* used by attributes code to read/construct keys and/or data*/
737: UInt32 gAttributesBufferSize; /* size of block pointed to by gAttributesBuffer*/
738: SInt32 offsetToUTC; /* added to local time to produce UTC (GMT)*/
739: Ptr gBootPToUTable; /* used by boot code to find Extensions folder*/
740: UniversalProcPtr oldWriteXPRam; /* previous WriteXPRam trap address*/
741: Ptr gCatalogCacheGlobals; /* private catalog cache (for iterators)*/
742: CatalogKey gLastCatalogKey; /* keep a copy for UpdateCatalogNode*/
743: CatalogRecord gLastCatalogRecord; /* keep a copy for UpdateCatalogNode*/
744: StringPtr gTextEncodingFontName; /* points to font name (only used when no HFS Plus volumes have been mounted)*/
745: #else
746: UInt32 gDefaultBaseEncoding;
747: ItemCount gInstalledEncodings;
748: ConversionContext gConversionContext[50];
749: Ptr gBootPToUTable; /* used by boot code to find Extensions folder*/
750: StringPtr gTextEncodingFontName; /* points to font name (only used when no HFS Plus volumes have been mounted)*/
751: Boolean gUseDynamicUnicodeConverters;
752: Boolean gIsUnicodeInstalled;
753: #endif /* TARGET_OS_MAC */
754: };
755: typedef struct FSVarsRec FSVarsRec;
756:
757:
758: #if TARGET_OS_MAC
759: #define PANIC(reason) panic("\p" reason)
760: #else
761: #define PANIC(reason) panic(reason)
762: #endif /* TARGET_OS_MAC */
763:
764: EXTERN_API_C( void )
765: LMSetCacheFlag (Byte value);
766:
767: /* cache usage count now used as cache flag*/
768: #define LMSetCacheFlag( value ) (*(Ptr) 0x0377 = ( value ))
769:
770: /* Internal macros*/
771: /* Disk First Aid constants*/
772:
773: enum {
774: kHFSStage = 0,
775: kVerifyStage = 1,
776: kRepairStage = 2
777: };
778:
779: #if FORDISKFIRSTAID
780: EXTERN_API_C( FSVarsRec *)
781: LMGetFSVars (void);
782:
783: #define LMGetFSVars() LMGetFSMVars()
784: EXTERN_API_C( Ptr )
785: LMGetFCBTable (void);
786:
787: #define LMGetFCBTable() LMGetFCBSPtr()
788: EXTERN_API_C( UInt32 )
789: GetDFAStage (void);
790: #else
791: #if TARGET_OS_MAC
792: EXTERN_API_C( FSVarsRec *)
793: LMGetFSVars (void);
794:
795: #define LMGetFSVars() (*(FSVarsRec**) 0x0BB8)
796: EXTERN_API_C( Ptr )
797: LMGetFCBTable (void);
798:
799: #define LMGetFCBTable() (*(Ptr*) 0x034E)
800: EXTERN_API_C( UInt32 )
801: GetDFAStage (void);
802: #endif /* TARGET_OS_MAC */
803:
804: #define GetDFAStage() (UInt32) kHFSStage
805: #endif /* (FORDISKFIRSTAID) */
806:
807:
808: EXTERN_API_C( FileReference )
809: GetFileRefNumFromFCB (const FCB * fcb);
810:
811: #if ! TARGET_OS_RHAPSODY
812: #define GetFileRefNumFromFCB(fcb) ((short) ( ((UInt32) (fcb)) - ((UInt32) LMGetFCBTable() ) ))
813: #endif
814:
815: EXTERN_API_C( FCB *)
816: GetFileControlBlock (FileReference refNum);
817:
818: #if ! TARGET_OS_RHAPSODY
819: #define GetFileControlBlock(refNum) ((FCB*) ( (Ptr)LMGetFCBTable() + refNum ) )
820: #endif
821:
822: EXTERN_API_C( Boolean )
823: BlockCameFromDisk (void);
824:
825: #if !(FORDISKFIRSTAID || TARGET_OS_RHAPSODY)
826: #define BlockCameFromDisk() ( *(*(UInt16 **)CacheVars + 29) == 0)
827: #endif
828:
829: /* The following macro marks a VCB as dirty by setting the upper 8 bits of the flags*/
830: EXTERN_API_C( void )
831: MarkVCBDirty (ExtendedVCB * vcb);
832:
833: EXTERN_API_C( void )
834: MarkVCBClean (ExtendedVCB * vcb);
835:
836: EXTERN_API_C( Boolean )
837: IsVCBDirty (ExtendedVCB * vcb);
838:
839: #if TARGET_OS_RHAPSODY
840: #define VCB_LOCK_INIT(vcb) simple_lock_init(&vcb->vcbSimpleLock)
841: #define VCB_LOCK(vcb) simple_lock(&vcb->vcbSimpleLock)
842: #define VCB_UNLOCK(vcb) simple_unlock(&vcb->vcbSimpleLock)
843:
844: #define MarkVCBDirty(vcb) { VCB_LOCK((vcb)); ((vcb)->vcbFlags |= 0xFF00); VCB_UNLOCK((vcb)); }
845: #define MarkVCBClean(vcb) { VCB_LOCK((vcb)); ((vcb)->vcbFlags &= 0x00FF); VCB_UNLOCK((vcb)); }
846: #define IsVCBDirty(vcb) ((Boolean) ((vcb->vcbFlags & 0xFF00) != 0))
847: #else
848: #define VCB_LOCK_INIT(vcb)
849: #define VCB_LOCK(vcb)
850: #define VCB_UNLOCK(vcb)
851:
852: #define MarkVCBDirty(vcb) ((vcb)->vcbFlags |= 0xFF00)
853: #define MarkVCBClean(vcb) ((vcb)->vcbFlags &= 0x00FF)
854: #define IsVCBDirty(vcb) ((Boolean) ((vcb->vcbFlags & 0xFF00) != 0))
855: #endif
856:
857:
858: /* Test for error and return if error occurred*/
859: EXTERN_API_C( void )
860: ReturnIfError (OSErr result);
861:
862: #define ReturnIfError(result) if ( (result) != noErr ) return (result); else ;
863: /* Test for passed condition and return if true*/
864: EXTERN_API_C( void )
865: ReturnErrorIf (Boolean condition,
866: OSErr result);
867:
868: #define ReturnErrorIf(condition, error) if ( (condition) ) return( (error) );
869: /* Exit function on error*/
870: EXTERN_API_C( void )
871: ExitOnError (OSErr result);
872:
873: #define ExitOnError( result ) if ( ( result ) != noErr ) goto ErrorExit; else ;
874: /* Return the low 16 bits of a 32 bit value, pinned if too large*/
875: EXTERN_API_C( UInt16 )
876: LongToShort (UInt32 l);
877:
878: #define LongToShort( l ) l <= (UInt32)0x0000FFFF ? ((UInt16) l) : ((UInt16) 0xFFFF)
879:
880:
881: /* Catalog Manager Routines (IPI)*/
882:
883: EXTERN_API_C( OSErr )
884: CreateCatalogNode (ExtendedVCB * volume,
885: HFSCatalogNodeID parentID,
886: ConstUTF8Param name,
887: UInt32 nodeType,
888: HFSCatalogNodeID * catalogNodeID,
889: UInt32 * catalogHint);
890:
891: EXTERN_API_C( OSErr )
892: DeleteCatalogNode (ExtendedVCB * volume,
893: HFSCatalogNodeID parentID,
894: ConstUTF8Param name,
895: UInt32 hint);
896:
897: EXTERN_API_C( OSErr )
898: GetCatalogNode (ExtendedVCB * volume,
899: HFSCatalogNodeID parentID,
900: ConstUTF8Param name,
901: UInt32 hint,
902: FSSpec * nodeSpec,
903: CatalogNodeData * nodeData,
904: UInt32 * newHint);
905:
906: EXTERN_API_C( OSErr )
907: GetCatalogOffspring (ExtendedVCB * volume,
908: HFSCatalogNodeID folderID,
909: UInt16 index,
910: FSSpec * spec,
911: CatalogNodeData * nodeData,
912: UInt32 * hint);
913:
914: EXTERN_API_C( OSErr )
915: MoveRenameCatalogNode (ExtendedVCB * volume,
916: HFSCatalogNodeID srcParentID,
917: ConstUTF8Param srcName,
918: UInt32 srcHint,
919: HFSCatalogNodeID dstParentID,
920: ConstUTF8Param dstName,
921: UInt32 * newHint);
922:
923: #if TARGET_OS_MAC
924: EXTERN_API_C( OSErr )
925: UpdateCatalogNode (ExtendedVCB * volume,
926: const CatalogNodeData * nodeData,
927: UInt32 catalogHint);
928: #else
929: EXTERN_API_C( OSErr )
930: UpdateCatalogNode (ExtendedVCB * volume,
931: HFSCatalogNodeID parentID,
932: ConstUTF8Param name,
933: UInt32 catalogHint,
934: const CatalogNodeData * nodeData);
935: #endif
936:
937: EXTERN_API_C( OSErr )
938: CreateFileIDRef (ExtendedVCB * volume,
939: HFSCatalogNodeID parentID,
940: ConstUTF8Param name,
941: UInt32 hint,
942: HFSCatalogNodeID * threadID);
943:
944: EXTERN_API_C( OSErr )
945: ExchangeFileIDs (ExtendedVCB * volume,
946: ConstUTF8Param srcName,
947: ConstUTF8Param destName,
948: HFSCatalogNodeID srcID,
949: HFSCatalogNodeID destID,
950: UInt32 srcHint,
951: UInt32 destHint );
952:
953: EXTERN_API_C( OSErr )
954: LinkCatalogNode (ExtendedVCB * volume,
955: HFSCatalogNodeID parentID,
956: ConstUTF8Param name,
957: HFSCatalogNodeID linkParentID,
958: ConstUTF8Param linkName);
959:
960: EXTERN_API_C( SInt32 )
961: CompareCatalogKeys (HFSCatalogKey * searchKey,
962: HFSCatalogKey * trialKey);
963:
964: EXTERN_API_C( SInt32 )
965: CompareExtendedCatalogKeys (HFSPlusCatalogKey * searchKey,
966: HFSPlusCatalogKey * trialKey);
967:
968: EXTERN_API_C( OSErr )
969: InitCatalogCache (void);
970:
971: EXTERN_API_C( void )
972: InvalidateCatalogCache (ExtendedVCB * volume);
973:
974:
975: /* GenericMRUCache Routines*/
976: EXTERN_API_C( OSErr )
977: InitMRUCache (UInt32 bufferSize,
978: UInt32 numCacheBlocks,
979: Ptr * cachePtr);
980:
981: EXTERN_API_C( OSErr )
982: DisposeMRUCache (Ptr cachePtr);
983:
984: EXTERN_API_C( void )
985: TrashMRUCache (Ptr cachePtr);
986:
987: EXTERN_API_C( OSErr )
988: GetMRUCacheBlock (UInt32 key,
989: Ptr cachePtr,
990: Ptr * buffer);
991:
992: EXTERN_API_C( void )
993: InvalidateMRUCacheBlock (Ptr cachePtr,
994: Ptr buffer);
995:
996: EXTERN_API_C( void )
997: InsertMRUCacheBlock (Ptr cachePtr,
998: UInt32 key,
999: Ptr buffer);
1000:
1001: /* MountCheck Routines*/
1002: EXTERN_API_C( OSErr )
1003: MountCheck (ExtendedVCB * vcb,
1004: UInt32 * consistencyStatus);
1005:
1006: /* BTree Manager Routines*/
1007:
1008: typedef CALLBACK_API_C( SInt32 , KeyCompareProcPtr )(void *a, void *b);
1009:
1010: #if TARGET_OS_MAC
1011: EXTERN_API_C( OSErr )
1012: OpenBTree (FileReference refNum,
1013: KeyCompareProcPtr keyCompareProc);
1014: #endif
1015:
1016: #if TARGET_OS_MAC
1017: EXTERN_API_C( OSErr )
1018: CloseBTree (FileReference refNum);
1019: #endif
1020:
1021: #if TARGET_OS_MAC
1022: EXTERN_API_C( OSErr )
1023: FlushBTree (FileReference refNum);
1024: #endif
1025:
1026: EXTERN_API_C( OSErr )
1027: SearchBTreeRecord (FileReference refNum,
1028: const void * key,
1029: UInt32 hint,
1030: void * foundKey,
1031: void * data,
1032: UInt16 * dataSize,
1033: UInt32 * newHint);
1034: #if TARGET_OS_MAC
1035: EXTERN_API_C( OSErr )
1036: GetBTreeRecord (FileReference refNum,
1037: SInt16 selectionIndex,
1038: void * key,
1039: void * data,
1040: UInt16 * dataSize,
1041: UInt32 * newHint);
1042: #endif
1043:
1044: EXTERN_API_C( OSErr )
1045: InsertBTreeRecord (FileReference refNum,
1046: void * key,
1047: void * data,
1048: UInt16 dataSize,
1049: UInt32 * newHint);
1050:
1051: EXTERN_API_C( OSErr )
1052: DeleteBTreeRecord (FileReference refNum,
1053: void * key);
1054:
1055: EXTERN_API_C( OSErr )
1056: ReplaceBTreeRecord (FileReference refNum,
1057: const void * key,
1058: UInt32 hint,
1059: void * newData,
1060: UInt16 dataSize,
1061: UInt32 * newHint);
1062:
1063: /* From HFSVolumesInit.c*/
1064: EXTERN_API_C( void )
1065: InitBTreeHeader (UInt32 fileSize,
1066: UInt32 clumpSize,
1067: UInt16 nodeSize,
1068: UInt16 recordCount,
1069: UInt16 keySize,
1070: UInt32 attributes,
1071: UInt32 * mapNodes,
1072: void * buffer);
1073:
1074: /* Prototypes for big block cache*/
1075:
1076: EXTERN_API_C( OSErr )
1077: InitializeBlockCache (UInt32 blockSize,
1078: UInt32 blockCount);
1079:
1080: EXTERN_API_C( OSErr )
1081: FlushBlockCache (void);
1082:
1083: EXTERN_API_C( OSErr )
1084: GetCacheBlock (FileReference fileRefNum,
1085: UInt32 blockNumber,
1086: UInt32 blockSize,
1087: UInt16 options,
1088: LogicalAddress * buffer,
1089: Boolean * readFromDisk);
1090:
1091: EXTERN_API_C( OSErr )
1092: ReleaseCacheBlock (LogicalAddress buffer,
1093: UInt16 options);
1094:
1095: EXTERN_API_C( OSErr )
1096: MarkCacheBlock (LogicalAddress buffer);
1097:
1098: EXTERN_API_C( OSErr )
1099: TrashCacheBlocks (FileReference fileRefNum);
1100:
1101: /* Prototypes for C->Asm glue*/
1102: EXTERN_API_C( OSErr )
1103: GetBlock_glue (UInt16 flags,
1104: UInt32 nodeNumber,
1105: Ptr * nodeBuffer,
1106: FileReference refNum,
1107: ExtendedVCB * vcb);
1108:
1109: EXTERN_API_C( OSErr )
1110: RelBlock_glue (Ptr nodeBuffer,
1111: UInt16 flags);
1112:
1113: EXTERN_API_C( void )
1114: MarkBlock_glue (Ptr nodeBuffer);
1115:
1116: EXTERN_API_C( OSErr )
1117: C_FlushCache (ExtendedVCB * vcb,
1118: UInt32 flags,
1119: FileReference refNum);
1120:
1121: EXTERN_API_C( OSErr )
1122: CacheReadInPlace (ExtendedVCB * volume,
1123: HIOParam * iopb,
1124: UInt32 currentPosition,
1125: UInt32 maximumBytes,
1126: UInt32 * actualBytes);
1127:
1128: EXTERN_API_C( void ) TrashVolumeDiskCache(ExtendedVCB * vcb);
1129:
1130: /* Prototypes for exported routines in VolumeAllocation.c*/
1131: EXTERN_API_C( OSErr )
1132: BlockAllocate (ExtendedVCB * vcb,
1133: UInt32 startingBlock,
1134: UInt32 bytesRequested,
1135: UInt32 bytesMaximum,
1136: Boolean forceContiguous,
1137: UInt32 * startBlock,
1138: UInt32 * actualBlocks);
1139:
1140: EXTERN_API_C( OSErr )
1141: BlockDeallocate (ExtendedVCB * vcb,
1142: UInt32 firstBlock,
1143: UInt32 numBlocks);
1144:
1145: EXTERN_API_C( SInt32 )
1146: BlockCheck (ExtendedVCB * vcb,
1147: HFSPlusExtentRecord extents);
1148:
1149: EXTERN_API_C( OSErr )
1150: UpdateFreeCount (ExtendedVCB * vcb);
1151:
1152:
1153: EXTERN_API_C( OSErr )
1154: AllocateFreeSpace (ExtendedVCB * vcb,
1155: UInt32 * startBlock,
1156: UInt32 * actualBlocks);
1157:
1158: EXTERN_API_C( UInt32 )
1159: DivideAndRoundUp (UInt32 numerator,
1160: UInt32 denominator);
1161:
1162: EXTERN_API_C( OSErr )
1163: BlockAllocateAny (ExtendedVCB * vcb,
1164: UInt32 startingBlock,
1165: UInt32 endingBlock,
1166: UInt32 maxBlocks,
1167: UInt32 * actualStartBlock,
1168: UInt32 * actualNumBlocks);
1169:
1170: EXTERN_API_C( void )
1171: UpdateVCBFreeBlks (ExtendedVCB * vcb);
1172:
1173: /* File Extent Mapping routines*/
1174: EXTERN_API_C( OSErr )
1175: FlushExtentFile (ExtendedVCB * vcb);
1176:
1177: EXTERN_API_C( SInt32 )
1178: CompareExtentKeys (const HFSExtentKey * searchKey,
1179: const HFSExtentKey * trialKey);
1180:
1181: EXTERN_API_C( SInt32 )
1182: CompareExtentKeysPlus (const HFSPlusExtentKey *searchKey,
1183: const HFSPlusExtentKey *trialKey);
1184:
1185: EXTERN_API_C( OSErr )
1186: DeleteFile (ExtendedVCB * vcb,
1187: HFSCatalogNodeID parDirID,
1188: ConstUTF8Param catalogName,
1189: UInt32 catalogHint);
1190:
1191: EXTERN_API_C( OSErr )
1192: TruncateFileC (ExtendedVCB * vcb,
1193: FCB * fcb,
1194: UInt32 peof,
1195: Boolean truncateToExtent);
1196:
1197: EXTERN_API_C( OSErr )
1198: ExtendFileC (ExtendedVCB * vcb,
1199: FCB * fcb,
1200: UInt32 bytesToAdd,
1201: UInt32 flags,
1202: UInt32 * actualBytesAdded);
1203:
1204: EXTERN_API_C( OSErr )
1205: MapFileBlockC (ExtendedVCB * vcb,
1206: FCB * fcb,
1207: UInt32 numberOfBytes,
1208: UInt32 offset,
1209: UInt32 * startBlock,
1210: UInt32 * availableBytes);
1211:
1212: #if TARGET_OS_RHAPSODY
1213: EXTERN_API_C( Boolean )
1214: NodesAreContiguous (ExtendedVCB * vcb,
1215: FCB * fcb,
1216: UInt32 nodeSize);
1217: #endif
1218:
1219: EXTERN_API_C( OSErr )
1220: GrowParallelFCBs (void);
1221:
1222: EXTERN_API_C( void )
1223: AdjustEOF (FCB * sourceFCB);
1224:
1225: EXTERN_API_C( OSErr )
1226: MapLogicalToPhysical (HIOParam * pb);
1227:
1228: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1229: #pragma parameter __D0 PBMapFilePosition(__A0)
1230: #endif
1231: EXTERN_API( OSErr )
1232: PBMapFilePosition (HIOParam * pb) TWOWORDINLINE(0x7051, 0xA260);
1233:
1234: /* Extended Attributes Manager routines*/
1235: EXTERN_API_C( SInt32 )
1236: CompareAttributeKeys (const void * searchKey,
1237: const void * trialKey);
1238:
1239: EXTERN_API_C( OSErr )
1240: AttributesOpenVolume (ExtendedVCB * vcb);
1241:
1242: EXTERN_API_C( OSErr )
1243: AttributesCloseVolume (ExtendedVCB * vcb);
1244:
1245:
1246: /* Utility routines*/
1247:
1248: EXTERN_API( OSErr )
1249: HFSCommunicationProc (short message,
1250: void * paramBlock,
1251: void * globalsPtr);
1252:
1253: EXTERN_API_C( void )
1254: ClearMemory (void * start,
1255: UInt32 length);
1256:
1257: EXTERN_API_C( Boolean )
1258: UnicodeBinaryCompare (ConstHFSUniStr255Param ustr1,
1259: ConstHFSUniStr255Param ustr2);
1260:
1261: EXTERN_API_C( Boolean )
1262: PascalBinaryCompare (ConstStr31Param pstr1,
1263: ConstStr31Param pstr2);
1264:
1265: EXTERN_API_C( OSErr )
1266: VolumeWritable (ExtendedVCB * vcb);
1267:
1268: EXTERN_API_C( void )
1269: Get1stFileControlBlock (UInt16 * index,
1270: Ptr * fcbsH);
1271:
1272: EXTERN_API_C( Boolean )
1273: GetNextFileControlBlock (UInt16 * index,
1274: Ptr fcbsPtr);
1275:
1276:
1277: /*�� Obsolete this ASM call*/
1278: #if TARGET_OS_MAC
1279: EXTERN_API_C( ExtendedFCB *)
1280: ParallelFCBFromRefnum (FileReference refNum);
1281: #endif
1282:
1283: /* Assembly glue routines should use ints instead of shorts to be usable with SC compiler.*/
1284: EXTERN_API_C( ExtendedFCB *)
1285: GetParallelFCB (FileReference fref);
1286:
1287: struct FindFileNameGlueRec {
1288: UInt32 nameLength;
1289: char * nameBuffer;
1290: ExtendedVCB * vcb;
1291: WDCBRec * wdcb;
1292: Ptr volumeBuffer;
1293: CatalogNodeData * data;
1294: HFSCatalogNodeID id;
1295: UInt32 hint;
1296: };
1297: typedef struct FindFileNameGlueRec FindFileNameGlueRec;
1298:
1299: EXTERN_API_C( OSErr )
1300: FindFileName (ParamBlockRec * filePB,
1301: FindFileNameGlueRec * ff);
1302:
1303: /* Get the current time in UTC (GMT)*/
1304: EXTERN_API_C( UInt32 )
1305: GetTimeUTC (void);
1306:
1307: /* Get the current local time*/
1308: EXTERN_API_C( UInt32 )
1309: GetTimeLocal (Boolean forHFS);
1310:
1311: EXTERN_API_C( UInt32 )
1312: LocalToUTC (UInt32 localTime);
1313:
1314: EXTERN_API_C( UInt32 )
1315: UTCToLocal (UInt32 utcTime);
1316:
1317: EXTERN_API_C( UInt64 )
1318: U64Add (UInt64 x,
1319: UInt64 y);
1320:
1321: EXTERN_API_C( UInt64 )
1322: U64Subtract (UInt64 left,
1323: UInt64 right);
1324:
1325:
1326: /* Volumes routines*/
1327: EXTERN_API_C( OSErr )
1328: FlushVolumeControlBlock (ExtendedVCB * vcb);
1329:
1330: EXTERN_API_C( OSErr )
1331: CheckVolumeOffLine (ExtendedVCB * vcb);
1332:
1333: EXTERN_API_C( OSErr )
1334: CloseFile (ExtendedVCB * vcb,
1335: SInt16 index,
1336: Ptr fcbs);
1337:
1338: EXTERN_API_C( OSErr )
1339: FlushAlternateVolumeControlBlock (ExtendedVCB * vcb,
1340: Boolean isHFSPlus);
1341:
1342: EXTERN_API_C( OSErr )
1343: FindDrive (short * driverRefNum,
1344: DrvQEl ** dqe,
1345: short driveNumber);
1346:
1347: EXTERN_API_C( OSErr )
1348: GetVCBDriveNum (ExtendedVCB ** vcb,
1349: short driveNumber);
1350:
1351: EXTERN_API_C( OSErr )
1352: ValidVolumeHeader (HFSPlusVolumeHeader * volumeHeader);
1353:
1354: EXTERN_API_C( void )
1355: FillHFSStack (void);
1356:
1357: EXTERN_API_C( OSErr )
1358: UnMountVolume (VolumeParam * volume,
1359: WDCBRecPtr * wdcb);
1360:
1361: EXTERN_API_C( OSErr )
1362: MakeVCBsExtendedVCBs (void);
1363:
1364: #if TARGET_OS_MAC
1365: EXTERN_API_C( OSErr )
1366: FindFileControlBlock (UInt16 * index,
1367: Ptr * fcbsH);
1368: #else /* TARGET_OS_MAC */
1369: EXTERN_API_C( OSErr )
1370: GetNewFCB (ExtendedVCB * vcb,
1371: FileReference* fRefPtr);
1372: #endif /* TARGET_OS_MAC */
1373:
1374: EXTERN_API_C( FCB *)
1375: SetupFCB (ExtendedVCB * vcb,
1376: FileReference refNum,
1377: UInt32 fileID,
1378: UInt32 fileClumpSize);
1379:
1380: EXTERN_API_C( OSErr )
1381: AccessBTree (ExtendedVCB * vcb,
1382: FileReference refNum,
1383: UInt32 fileID,
1384: UInt32 fileClumpSize,
1385: void * CompareRoutine);
1386:
1387: EXTERN_API_C( void )
1388: RemountWrappedVolumes (void);
1389:
1390: EXTERN_API_C( OSErr )
1391: CheckVolumeConsistency (ExtendedVCB * vcb);
1392:
1393: EXTERN_API_C( void )
1394: HFSBlocksFromTotalSectors (UInt32 totalSectors,
1395: UInt32 * blockSize,
1396: UInt16 * blockCount);
1397:
1398: /* CreateEmbeddedVolume.c*/
1399: EXTERN_API_C( OSErr )
1400: CreateEmbeddedVolume (ParmBlkPtr paramBlock);
1401:
1402:
1403: /* Private Files SPI*/
1404:
1405: /*���move following to FilesPriv.i*/
1406:
1407:
1408:
1409: enum {
1410: /* Private HFSDispatch calls (currently implemented only in AppleShare or FileShare)*/
1411: selectShare = 0x42,
1412: selectUnshare = 0x43,
1413: selectGetUGEntry = 0x44,
1414: selectServerControl = 0x45,
1415: selectServerStartup = 0x46
1416: };
1417:
1418:
1419:
1420: enum {
1421: /* fields for _FSControl call:*/
1422: ioFSVrsn = 0x20, /* File system version*/
1423: ioHQElSize = 52 /* size of a standard HFS call queue element*/
1424: };
1425:
1426:
1427: struct SearchPathParam {
1428: QElemPtr qLink;
1429: short qType;
1430: short ioTrap;
1431: Ptr ioCmdAddr;
1432: IOCompletionUPP ioCompletion;
1433: OSErr ioResult;
1434: StringPtr ioNamePtr;
1435: short ioVRefNum;
1436: short ioRefNum;
1437: SInt8 ioPMSPFlg; /* Flag whether to enable the PMSP*/
1438: SInt8 filler1;
1439: Ptr ioPMSPHook; /* Pointer to PMSP hook proc*/
1440: };
1441: typedef struct SearchPathParam SearchPathParam;
1442:
1443: typedef SearchPathParam * SearchPathParamPtr;
1444: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1445: #pragma parameter __D0 FSControl(__A0)
1446: #endif
1447: EXTERN_API( OSErr )
1448: FSControl (ParmBlkPtr paramBlock) TWOWORDINLINE(0x7000, 0xA260);
1449:
1450: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1451: #pragma parameter __D0 MakeEmbeddedVolume(__A0)
1452: #endif
1453: EXTERN_API( OSErr )
1454: MakeEmbeddedVolume (ParmBlkPtr paramBlock) TWOWORDINLINE(0x701C, 0xA260);
1455:
1456: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1457: #pragma parameter __D0 SetPMSP(__A0)
1458: #endif
1459: EXTERN_API( OSErr )
1460: SetPMSP (ParmBlkPtr paramBlock) TWOWORDINLINE(0x700C, 0xA260);
1461:
1462: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1463: #pragma parameter __D0 GetParallelFCBFromRefnum(__A0)
1464: #endif
1465: EXTERN_API( OSErr )
1466: GetParallelFCBFromRefnum (ParmBlkPtr paramBlock) TWOWORDINLINE(0x7050, 0xA260);
1467:
1468: struct CreateLargeFileParam {
1469: /* The first several fields come from HFileInfo. */
1470: QElemPtr qLink; /*queue link in header*/
1471: short qType; /*type byte for safety check*/
1472: short ioTrap; /*FS: the Trap*/
1473: Ptr ioCmdAddr; /*FS: address to dispatch to*/
1474: IOCompletionUPP ioCompletion; /*completion routine addr (0 for synch calls)*/
1475: OSErr ioResult; /*result code*/
1476: StringPtr ioNamePtr; /*ptr to Vol:FileName string*/
1477: short ioVRefNum; /*volume refnum (DrvNum for Eject and MountVol)*/
1478: short ioFRefNum;
1479: SInt8 ioFVersNum;
1480: SInt8 filler1;
1481: short ioFDirIndex;
1482: SInt8 ioFlAttrib;
1483: SInt8 ioACUser;
1484: FInfo ioFlFndrInfo;
1485: long ioDirID;
1486:
1487: /* The rest of these fields are specific to the PBCreateLargeFile call. */
1488: UInt64 dataLogicalEOF;
1489: UInt64 dataPhysicalEOF;
1490: UInt64 rsrcLogicalEOF;
1491: UInt64 rsrcPhysicalEOF;
1492: };
1493: typedef struct CreateLargeFileParam CreateLargeFileParam;
1494:
1495: EXTERN_API_C( OSErr )
1496: CreateLargeFile (CreateLargeFileParam * pb);
1497:
1498: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1499: #pragma parameter __D0 PBCreateLargeFile(__A0)
1500: #endif
1501: EXTERN_API( OSErr )
1502: PBCreateLargeFile (CreateLargeFileParam * paramBlock) TWOWORDINLINE(0x7064, 0xA260);
1503:
1504: EXTERN_API_C( OSErr )
1505: LongRename (CMovePBRec * pb);
1506:
1507: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1508: #pragma parameter __D0 PBLongRenameSync(__A0)
1509: #endif
1510: EXTERN_API( OSErr )
1511: PBLongRenameSync (CMovePBRec * paramBlock) TWOWORDINLINE(0x701E, 0xA260);
1512:
1513: struct AttributeParam {
1514: QElemPtr qLink;
1515: short qType;
1516: short ioTrap;
1517: Ptr ioCmdAddr;
1518: ProcPtr ioCompletion; /* --> A pointer to a completion routine */
1519: OSErr ioResult; /* --> The result code of the function */
1520: StringPtr ioNamePtr; /* --> Pointer to pathname to object */
1521: short ioVRefNum; /* --> A volume specification */
1522: long filler1;
1523: long filler2;
1524: Ptr ioBuffer;
1525: unsigned long ioReqCount;
1526: unsigned long ioActCount;
1527: HFSUniStr255 * ioAttributeName; /* --> A pointer to the attribute name buffer */
1528: long ioDirID; /* --> A directory ID */
1529: };
1530: typedef struct AttributeParam AttributeParam;
1531:
1532: EXTERN_API_C( OSErr )
1533: CreateAttribute (AttributeParam * pb);
1534:
1535: #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
1536: #pragma parameter __D0 PBCreateAttributeSync(__A0)
1537: #endif
1538: EXTERN_API( OSErr )
1539: PBCreateAttributeSync (AttributeParam * paramBlock) TWOWORDINLINE(0x7065, 0xA260);
1540:
1541:
1542: #if PRAGMA_STRUCT_ALIGN
1543: #pragma options align=reset
1544: #elif PRAGMA_STRUCT_PACKPUSH
1545: #pragma pack(pop)
1546: #elif PRAGMA_STRUCT_PACK
1547: #pragma pack()
1548: #endif
1549:
1550: #ifdef PRAGMA_IMPORT_OFF
1551: #pragma import off
1552: #elif PRAGMA_IMPORT
1553: #pragma import reset
1554: #endif
1555:
1556: #ifdef __cplusplus
1557: }
1558: #endif
1559:
1560: #endif /* __FILEMGRINTERNAL__ */
1561:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.