From: Mark Andrews Date: Thu, 13 Aug 2009 03:40:57 +0000 (+0000) Subject: 2648. [port] win32: isc_time_seconds() was broken. [RT #19900] X-Git-Tag: v9.5.2b1~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29f607744a06e601fe9e957c258b9c1e10fb0d3c;p=thirdparty%2Fbind9.git 2648. [port] win32: isc_time_seconds() was broken. [RT #19900] --- diff --git a/CHANGES b/CHANGES index 083cb437eab..941b0db3aac 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +2648. [port] win32: isc_time_seconds() was broken. [RT #19900] + 2646. [bug] Incorrect cleanup on error in socket.c. [RT #19987] 2645. [port] "gcc -m32" didn't work on amd64 and x86_64 platforms diff --git a/lib/isc/win32/time.c b/lib/isc/win32/time.c index de29aaa1164..580bec6b27f 100644 --- a/lib/isc/win32/time.c +++ b/lib/isc/win32/time.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: time.c,v 1.43.128.2 2008/08/29 23:46:52 tbox Exp $ */ +/* $Id: time.c,v 1.43.128.3 2009/08/13 03:40:57 marka Exp $ */ #include @@ -205,28 +205,30 @@ isc_time_microdiff(const isc_time_t *t1, const isc_time_t *t2) { isc_uint32_t isc_time_seconds(const isc_time_t *t) { - SYSTEMTIME st; + SYSTEMTIME epoch = { 1970, 1, 4, 1, 0, 0, 0, 0 }; + FILETIME temp; + ULARGE_INTEGER i1, i2; + LONGLONG i3; - /* - * Convert the time to a SYSTEMTIME structure and the grab the - * milliseconds - */ - FileTimeToSystemTime(&t->absolute, &st); + SystemTimeToFileTime(&epoch, &temp); + + i1.LowPart = t->absolute.dwLowDateTime; + i1.HighPart = t->absolute.dwHighDateTime; + i2.LowPart = temp.dwLowDateTime; + i2.HighPart = temp.dwHighDateTime; + + i3 = (i1.QuadPart - i2.QuadPart) / 10000000; - return ((isc_uint32_t)(st.wMilliseconds / 1000)); + return ((isc_uint32_t)i3) } isc_uint32_t isc_time_nanoseconds(const isc_time_t *t) { - SYSTEMTIME st; - - /* - * Convert the time to a SYSTEMTIME structure and the grab the - * milliseconds - */ - FileTimeToSystemTime(&t->absolute, &st); + ULARGE_INTEGER i; - return ((isc_uint32_t)(st.wMilliseconds * 1000000)); + i.LowPart = t->absolute.dwLowDateTime; + i.HighPart = t->absolute.dwHighDateTime; + return ((isc_uint32_t)(i.QuadPart % 10000000) * 100); } void