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 */
47UInt32 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 */
61UInt32 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
77OSErr FlushVol(ConstStr63Param volName, short vRefNum)
78{
79	sync();
80
81	return (0);
82}
83
84
85OSErr MemError()
86{
87	return (0);
88}
89
90void DebugStr(ConstStr255Param debuggerMsg)
91{
92	/* DebugStr is only called when built with DEBUG_BUILD set */
93	plog ("\t%.*s\n", debuggerMsg[0], &debuggerMsg[1]);
94}
95
96
97UInt32 TickCount()
98{
99	return (0);
100}
101
102
103OSErr GetVolumeFeatures( SGlobPtr GPtr )
104{
105	GPtr->volumeFeatures = supportsTrashVolumeCacheFeatureMask + supportsHFSPlusVolsFeatureMask;
106
107	return( noErr );
108}
109
110
111Handle NewHandleClear(Size byteCount)
112{
113	return NewHandle(byteCount);
114}
115
116Handle NewHandle(Size byteCount)
117{
118	Handle h;
119	Ptr p = NULL;
120
121	if (!(h = malloc(sizeof(Ptr) + sizeof(Size))))
122		return NULL;
123
124	if (byteCount)
125		if (!(p = calloc(1, byteCount)))
126		{
127			free(h);
128			return NULL;
129		}
130
131	*h = p;
132
133	*((Size *)(h + 1)) = byteCount;
134
135	return h;
136}
137
138void DisposeHandle(Handle h)
139{
140	if (h)
141	{
142		if (*h)
143			free(*h);
144		free(h);
145	}
146}
147
148Size GetHandleSize(Handle h)
149{
150	return h ? *((Size *)(h + 1)) : 0;
151}
152
153void SetHandleSize(Handle h, Size newSize)
154{
155	Ptr p = NULL;
156
157	if (!h)
158		return;
159
160	if ((p = realloc(*h, newSize)))
161	{
162		*h = p;
163		*((Size *)(h + 1)) = newSize;
164	}
165}
166
167
168OSErr PtrAndHand(const void *ptr1, Handle hand2, long size)
169{
170	Ptr p = NULL;
171	Size old_size = 0;
172
173	if (!hand2)
174		return -109;
175
176	if (!ptr1 || size < 1)
177		return 0;
178
179	old_size = *((Size *)(hand2 + 1));
180
181	if (!(p = realloc(*hand2, size + old_size)))
182		return -108;
183
184	*hand2 = p;
185	*((Size *)(hand2 + 1)) = size + old_size;
186
187	memcpy(*hand2 + old_size, ptr1, size);
188
189	return 0;
190}
191
192
193/* deprecated call, use fsckPrint() instead */
194void WriteError( SGlobPtr GPtr, short msgID, UInt32 tarID, UInt64 tarBlock )
195{
196	fsckPrint(GPtr->context, msgID);
197
198	if ((fsckGetVerbosity(GPtr->context) > 0) &&
199	    (fsckGetOutputStyle(GPtr->context) == fsckOutputTraditional) &&
200	    (tarID | tarBlock) != 0) {
201		plog("(%ld, %qd)\n", (long)tarID, tarBlock);
202	}
203}
204