#include <time.h>
#include <tzfile.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/syscall.h>
#include <unistd.h>
#define __APPLE_API_PRIVATE
#include <machine/cpu_capabilities.h>
#undef __APPLE_API_PRIVATE
#ifdef __ppc__
#define expand(arg) strgfy(arg)
#define strgfy(arg) #arg
static __attribute__ ((noinline))
int commpage_gettimeofday(struct timeval *tp)
{
asm volatile("ba " expand(_COMM_PAGE_GETTIMEOFDAY) );
return 1;
}
#endif
int gettimeofday (struct timeval *tp, struct timezone *tzp)
{
static int validtz = 0;
static struct timezone cached_tz = {0};
struct timeval localtv;
if (tp == NULL) {
tp = &localtv;
}
#ifdef __ppc__
{
extern int __ppc_gettimeofday(struct timeval *, struct timezone *);
if (commpage_gettimeofday(tp)) {
if (__ppc_gettimeofday(tp,tzp)) {
return (-1);
}
}
}
#else
if (syscall (SYS_gettimeofday, tp, tzp) < 0) {
return (-1);
}
#endif
if (tzp) {
if (validtz == 0) {
struct tm *localtm = localtime ((time_t *)&tp->tv_sec);
cached_tz.tz_dsttime = localtm->tm_isdst;
cached_tz.tz_minuteswest =
(-localtm->tm_gmtoff / SECSPERMIN) +
(localtm->tm_isdst * MINSPERHOUR);
validtz = 1;
}
tzp->tz_dsttime = cached_tz.tz_dsttime;
tzp->tz_minuteswest = cached_tz.tz_minuteswest;
}
return (0);
}