1/* 2 * Copyright (c) 2003-2005 Apple Computer, 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/* 24 * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved 25 * 26 * File: libc/sys/gettimeofday.c 27 */ 28 29#include <time.h> 30#include <tzfile.h> 31#include <sys/time.h> 32#include <errno.h> 33#include <unistd.h> 34 35#define __APPLE_API_PRIVATE 36#include <machine/cpu_capabilities.h> 37#undef __APPLE_API_PRIVATE 38 39extern int __gettimeofday(struct timeval *, struct timezone *); 40extern int __commpage_gettimeofday(struct timeval *); 41 42int gettimeofday (struct timeval *tp, void *vtzp) 43{ 44 static int validtz = 0; 45 static struct timezone cached_tz = {0}; 46 struct timezone *tzp = (struct timezone *)vtzp; 47 struct timeval atv; 48 49 if (tp == NULL) { 50 if (tzp == NULL) 51 return (0); 52 tp = &atv; 53 } 54 55 if (__commpage_gettimeofday(tp)) { /* first try commpage */ 56 if (__gettimeofday(tp, NULL) < 0) { /* if it fails, use syscall */ 57 return (-1); 58 } 59 } 60 61 if (tzp) { 62 if (validtz == 0) { 63 struct tm *localtm = localtime ((time_t *)&tp->tv_sec); 64 cached_tz.tz_dsttime = localtm->tm_isdst; 65 cached_tz.tz_minuteswest = 66 (-localtm->tm_gmtoff / SECSPERMIN) + 67 (localtm->tm_isdst * MINSPERHOUR); 68 validtz = 1; 69 } 70 tzp->tz_dsttime = cached_tz.tz_dsttime; 71 tzp->tz_minuteswest = cached_tz.tz_minuteswest; 72 } 73 return (0); 74} 75