| /* |
| * Copyright (c) 2016 Christian Huitema <huitema@huitema.net> |
| * |
| * Permission to use, copy, modify, and distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| #ifdef _WINDOWS |
| #include "wincompat.h" |
| |
| /* |
| * This is a simple replacement for the "gettimeofday" finction, |
| * which is not available on Windows |
| */ |
| |
| int wintimeofday(struct timeval* tv, struct timezone* tz) |
| { |
| FILETIME ft; |
| uint64_t now = 0; |
| |
| /* |
| * The GetSystemTimeAsFileTime API returns the number |
| * of 100-nanosecond intervals since January 1, 1601 (UTC), |
| * in FILETIME format. |
| */ |
| GetSystemTimePreciseAsFileTime(&ft); |
| |
| /* |
| * Convert to plain 64 bit format, without making |
| * assumptions about the FILETIME structure alignment. |
| */ |
| now = ft.dwHighDateTime; |
| now <<= 32; |
| now |= ft.dwLowDateTime; |
| /* |
| * Convert units from 100ns to 1us |
| */ |
| now /= 10; |
| /* |
| * Account for microseconds elapsed between 1601 and 1970. |
| */ |
| now -= 11644473600000000ULL; |
| |
| if (tv != NULL) |
| { |
| uint64_t sec = now / 1000000; |
| uint64_t usec = now % 1000000; |
| |
| tv->tv_sec = (long)sec; |
| tv->tv_usec = (long)usec; |
| } |
| |
| if (tz != NULL) |
| { |
| /* |
| * TODO: implement a timezone retrieval function. |
| * Not urgent, since the GetDNS code always set this parameter to NULL. |
| */ |
| return -1; |
| } |
| |
| return 0; |
| } |
| #endif /* WIN32 */ |