|
|
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: FileMgrInit.c
27:
28: Contains: Initialization code for HFS Plus
29:
30: Version: HFS Plus 1.0
31:
32: Copyright: � 1997-1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: Don Brady
37:
38: Other Contact: xxx put other contact here xxx
39:
40: Technology: xxx put technology here xxx
41:
42: Writers:
43:
44: (DSH) Deric Horn
45: (msd) Mark Day
46: (djb) Don Brady
47:
48: Change History (most recent first):
49: <Rhap> 4/3/98 djb Clean up usage of FSVar based globals.
50:
51: <CS9> 10/13/97 djb Set initial default text encoding to kTextEncodingUndefined.
52: <CS8> 10/1/97 djb Call InitCatalogCache to allocate catalog iterator cache.
53: <CS7> 9/16/97 msd Fix bug #1679792 by tail patching WriteXParam to do a
54: ReadLocation.
55: <CS6> 7/28/97 msd Allocate a 32K attributes buffer in PostInitFS.
56: <CS5> 7/16/97 DSH FilesInternal.i renamed FileMgrInternal.i to avoid name
57: collision
58: <CS4> 7/8/97 DSH Loading PrecompiledHeaders from define passed in on C line
59: <CS3> 6/17/97 msd In PostInitFS, set up the offset to GMT.
60: <CS2> 5/7/97 djb Turn on the gestaltDTMgrSupportsFSM bit.
61: <CS1> 4/25/97 djb first checked in
62:
63: <HFS2> 4/10/97 msd Remove enums gestaltFSNoMFSVols and
64: gestaltFSSupportsHFSPlusVols, since they are now in Gestalt.i.
65: <HFS1> 3/31/97 djb first checked in
66: */
67:
68: #if ( PRAGMA_LOAD_SUPPORTED )
69: #pragma load PrecompiledHeaders
70: #else
71: #if TARGET_OS_MAC
72: #include <Types.h>
73: #include <Gestalt.h>
74: #include <OSUtils.h>
75: #include <LowMemPriv.h>
76: #include <Patches.h>
77: #else
78: #include "../../hfs.h"
79: #include "../headers/system/MacOSStubs.h"
80: #endif /* TARGET_OS_MAC */
81: #endif /* PRAGMA_LOAD_SUPPORTED */
82:
83: #include "../headers/FileMgrInternal.h"
84:
85: OSErr PostInitFS(void);
86:
87: pascal OSErr FSAttrGestaltFunction( OSType selector, long *response );
88: extern long WriteXPRamPatch(void);
89: void UpdateGMTDelta(void);
90:
91:
92:
93: OSErr PostInitFS(void)
94: {
95: #if TARGET_OS_MAC
96: SelectorFunctionUPP oldGestaltFunction;
97: #endif
98: OSErr result;
99: FSVarsRec *fsVars;
100:
101: fsVars = (FSVarsRec *) LMGetFSMVars();
102:
103:
104: fsVars->gDefaultBaseEncoding = kTextEncodingUndefined;
105:
106: //
107: // Allocate Catalog Iterator cache...
108: //
109: result = InitCatalogCache();
110: ReturnIfError(result);
111:
112: //
113: // Allocate a 32K buffer used by CatSearch, attributes, ExchangeFiles.
114: //�� constant should really be in FileMgrInternal.i
115: //
116: #if TARGET_OS_MAC
117: fsVars->gAttributesBuffer = NewPtrSys(32768);
118: if (fsVars->gAttributesBuffer == NULL)
119: {
120: #if DEBUG_BUILD
121: DebugStr("\pFATAL: No memory for File Manager");
122: #endif
123:
124: return MemError();
125: }
126: fsVars->gAttributesBufferSize = 32768;
127: #endif
128:
129: //
130: // Update the GMT offset
131: //
132: UpdateGMTDelta();
133:
134: #if TARGET_OS_MAC
135: //
136: // Patch the WriteXPRam trap so we can update the GMT offset when it changes.
137: //
138: fsVars->oldWriteXPRam = GetOSTrapAddress(_WriteXPRam);
139: SetOSTrapAddress(WriteXPRamPatch, _WriteXPRam);
140:
141: //
142: // Fix up the gestalt value we return (for new flags)
143: //
144: result = ReplaceGestalt(gestaltFSAttr, FSAttrGestaltFunction, &oldGestaltFunction);
145: #else
146: #pragma unused(oldGestaltFunction)
147: #endif /* TARGET_OS_MAC */
148:
149: return result;
150: }
151:
152:
153:
154: #if TARGET_OS_MAC
155:
156: pascal OSErr FSAttrGestaltFunction( OSType selector, long *response )
157: {
158: #pragma unused (selector)
159:
160: *response = (1 << gestaltFullExtFSDispatching)
161: | (1 << gestaltHasFSSpecCalls)
162: | (1 << gestaltHasFileSystemManager)
163: | (1 << gestaltFSMDoesDynamicLoad)
164: | (1 << gestaltFSSupports4GBVols)
165: | (1 << gestaltFSSupports2TBVols)
166: | (1 << gestaltHasExtendedDiskInit)
167: | (1 << gestaltDTMgrSupportsFSM)
168:
169: | (1 << gestaltFSNoMFSVols)
170: | (1 << gestaltFSSupportsHFSPlusVols);
171:
172: return noErr;
173: }
174: #endif /* TARGET_OS_MAC */
175:
176:
177:
178: void UpdateGMTDelta(void)
179: {
180: /* ### */
181: #if TARGET_OS_MAC
182: long gmtDelta;
183: FSVarsRec *fsVars = (FSVarsRec *) LMGetFSMVars();
184: MachineLocation location;
185:
186: //
187: // Determine the offset from GMT to local time (local - GMT)
188: //
189: ReadLocation(&location);
190: gmtDelta = location.u.gmtDelta & 0x00FFFFFF; // value is low 24 bits
191: if (gmtDelta & 0x00800000) // negative?
192: gmtDelta |= 0xFF000000; // if so, sign extend
193:
194: fsVars->offsetToUTC = gmtDelta;
195: #endif /* TARGET_OS_MAC */
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.