]> git.saurik.com Git - hfs.git/blob - fsck_hfs/dfalib/SStubs.c
Separate dataExtents / rsrcExtents (gcc noticed).
[hfs.git] / fsck_hfs / dfalib / SStubs.c
1 /*
2 * Copyright (c) 1999, 2002-2003, 2005-2008 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 /* SStubs.c */
24
25
26 #include <unistd.h>
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <errno.h>
30 #include <sys/time.h>
31
32 #include "Scavenger.h"
33 #include "../fsck_messages.h"
34
35
36 /*
37 * This is the straight GMT conversion constant:
38 * 00:00:00 January 1, 1970 - 00:00:00 January 1, 1904
39 * (3600 * 24 * ((365 * (1970 - 1904)) + (((1970 - 1904) / 4) + 1)))
40 */
41 #define MAC_GMT_FACTOR 2082844800UL
42
43 /*
44 * GetTimeUTC - get the GMT Mac OS time (in seconds since 1/1/1904)
45 *
46 */
47 UInt32 GetTimeUTC(void)
48 {
49 struct timeval time;
50 struct timezone zone;
51
52 (void) gettimeofday(&time, &zone);
53
54 return time.tv_sec + MAC_GMT_FACTOR;
55 }
56
57 /*
58 * GetTimeLocal - get the local Mac OS time (in seconds since 1/1/1904)
59 *
60 */
61 UInt32 GetTimeLocal(Boolean forHFS)
62 {
63 struct timeval time;
64 struct timezone zone;
65 time_t localTime;
66
67 (void) gettimeofday(&time, &zone);
68 localTime = time.tv_sec + MAC_GMT_FACTOR - (zone.tz_minuteswest * 60);
69
70 if (forHFS && zone.tz_dsttime)
71 localTime += 3600;
72
73 return (UInt32)localTime;
74 }
75
76
77 OSErr FlushVol(ConstStr63Param volName, short vRefNum)
78 {
79 sync();
80
81 return (0);
82 }
83
84
85 OSErr MemError()
86 {
87 return (0);
88 }
89
90
91 UInt32 TickCount()
92 {
93 return (0);
94 }
95
96
97 OSErr GetVolumeFeatures( SGlobPtr GPtr )
98 {
99 GPtr->volumeFeatures = supportsTrashVolumeCacheFeatureMask + supportsHFSPlusVolsFeatureMask;
100
101 return( noErr );
102 }
103
104
105 Handle NewHandleClear(Size byteCount)
106 {
107 return NewHandle(byteCount);
108 }
109
110 Handle NewHandle(Size byteCount)
111 {
112 Handle h;
113 Ptr p = NULL;
114
115 if (!(h = malloc(sizeof(Ptr) + sizeof(Size))))
116 return NULL;
117
118 if (byteCount)
119 if (!(p = calloc(1, byteCount)))
120 {
121 free(h);
122 return NULL;
123 }
124
125 *h = p;
126
127 *((Size *)(h + 1)) = byteCount;
128
129 return h;
130 }
131
132 void DisposeHandle(Handle h)
133 {
134 if (h)
135 {
136 if (*h)
137 free(*h);
138 free(h);
139 }
140 }
141
142 Size GetHandleSize(Handle h)
143 {
144 return h ? *((Size *)(h + 1)) : 0;
145 }
146
147 void SetHandleSize(Handle h, Size newSize)
148 {
149 Ptr p = NULL;
150
151 if (!h)
152 return;
153
154 if ((p = realloc(*h, newSize)))
155 {
156 *h = p;
157 *((Size *)(h + 1)) = newSize;
158 }
159 }
160
161
162 OSErr PtrAndHand(const void *ptr1, Handle hand2, long size)
163 {
164 Ptr p = NULL;
165 Size old_size = 0;
166
167 if (!hand2)
168 return -109;
169
170 if (!ptr1 || size < 1)
171 return 0;
172
173 old_size = *((Size *)(hand2 + 1));
174
175 if (!(p = realloc(*hand2, size + old_size)))
176 return -108;
177
178 *hand2 = p;
179 *((Size *)(hand2 + 1)) = size + old_size;
180
181 memcpy(*hand2 + old_size, ptr1, size);
182
183 return 0;
184 }
185
186
187 /* deprecated call, use fsckPrint() instead */
188 void WriteError( SGlobPtr GPtr, short msgID, UInt32 tarID, UInt64 tarBlock )
189 {
190 fsckPrint(GPtr->context, msgID);
191
192 if ((fsckGetVerbosity(GPtr->context) > 0) &&
193 (fsckGetOutputStyle(GPtr->context) == fsckOutputTraditional) &&
194 (tarID | tarBlock) != 0) {
195 plog("(%ld, %qd)\n", (long)tarID, tarBlock);
196 }
197 }