| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the w64 mingw-runtime package. |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| */ |
| #include <time.h> |
| #include <sys/time.h> |
| #include <sys/timeb.h> |
| #include <errno.h> |
| #include <windows.h> |
| |
| #define FILETIME_1970 116444736000000000ull /* seconds between 1/1/1601 and 1/1/1970 */ |
| #define HECTONANOSEC_PER_SEC 10000000ull |
| |
| int getntptimeofday (struct timespec *, struct timezone *); |
| |
| int getntptimeofday (struct timespec *tp, struct timezone *z) |
| { |
| int res = 0; |
| union { |
| unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */ |
| FILETIME ft; |
| } _now; |
| TIME_ZONE_INFORMATION TimeZoneInformation; |
| DWORD tzi; |
| |
| if (z != NULL) |
| { |
| if ((tzi = GetTimeZoneInformation(&TimeZoneInformation)) != TIME_ZONE_ID_INVALID) { |
| z->tz_minuteswest = TimeZoneInformation.Bias; |
| if (tzi == TIME_ZONE_ID_DAYLIGHT) |
| z->tz_dsttime = 1; |
| else |
| z->tz_dsttime = 0; |
| } |
| else |
| { |
| z->tz_minuteswest = 0; |
| z->tz_dsttime = 0; |
| } |
| } |
| |
| if (tp != NULL) { |
| GetSystemTimeAsFileTime (&_now.ft); /* 100-nanoseconds since 1-1-1601 */ |
| /* The actual accuracy on XP seems to be 125,000 nanoseconds = 125 microseconds = 0.125 milliseconds */ |
| _now.ns100 -= FILETIME_1970; /* 100 nano-seconds since 1-1-1970 */ |
| tp->tv_sec = _now.ns100 / HECTONANOSEC_PER_SEC; /* seconds since 1-1-1970 */ |
| tp->tv_nsec = (long) (_now.ns100 % HECTONANOSEC_PER_SEC) * 100; /* nanoseconds */ |
| } |
| return res; |
| } |
| |
| int __cdecl gettimeofday (struct timeval *p, void *z) |
| { |
| struct timespec tp; |
| |
| if (getntptimeofday (&tp, (struct timezone *) z)) |
| return -1; |
| p->tv_sec=tp.tv_sec; |
| p->tv_usec=(tp.tv_nsec/1000); |
| return 0; |
| } |
| |
| int __cdecl mingw_gettimeofday (struct timeval *p, struct timezone *z) |
| { |
| struct timespec tp; |
| |
| if (getntptimeofday (&tp, z)) |
| return -1; |
| p->tv_sec=tp.tv_sec; |
| p->tv_usec=(tp.tv_nsec/1000); |
| return 0; |
| } |