diff options
author | wtc%netscape.com <devnull@localhost> | 2003-01-14 13:24:12 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 2003-01-14 13:24:12 +0000 |
commit | 56cb4035007abfcfe7d6cd1bea966d5244cdf566 (patch) | |
tree | 63e8c995b4c09bf3702201da57c2069b155dad93 | |
parent | 5492bfdf5b1d4b2c7f16fcc53925c6cb1ae1f03f (diff) | |
download | nspr-hg-56cb4035007abfcfe7d6cd1bea966d5244cdf566.tar.gz |
Bug 188396: don't use ftime because its 32-bit timestamp will overflow
around year 2038. Use GetSystemTimeAsFileTime instead. The patch is
contributed by timeless@bemail.org.
Modified files: config/now.c _win95.h _winnt.h ntio.c ntmisc.c w95io.c
Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH
-rw-r--r-- | config/now.c | 17 | ||||
-rw-r--r-- | pr/include/md/_win95.h | 3 | ||||
-rw-r--r-- | pr/include/md/_winnt.h | 3 | ||||
-rw-r--r-- | pr/src/md/windows/ntio.c | 2 | ||||
-rw-r--r-- | pr/src/md/windows/ntmisc.c | 18 | ||||
-rw-r--r-- | pr/src/md/windows/w95io.c | 2 |
6 files changed, 25 insertions, 20 deletions
diff --git a/config/now.c b/config/now.c index 784b5cea..dec53239 100644 --- a/config/now.c +++ b/config/now.c @@ -39,7 +39,9 @@ #include <sys/timeb.h> #elif defined(XP_UNIX) || defined(XP_OS2_EMX) || defined(XP_BEOS) #include <sys/time.h> -#elif defined(WIN32) || defined(XP_OS2_VACPP) +#elif defined(WIN32) +#include <windows.h> +#elif defined(XP_OS2_VACPP) #include <sys/timeb.h> #else #error "Architecture not supported" @@ -86,11 +88,14 @@ int main(int argc, char **argv) #elif defined(WIN32) __int64 now; - struct timeb b; - ftime(&b); - now = b.time; - now *= 1000000; - now += (1000 * b.millitm); + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + CopyMemory(&now, &ft, sizeof(now)); + /* + * 116444736000000000 is the number of 100-nanosecond intervals + * between Jan. 1, 1601 and Jan. 1, 1970. + */ + now = (now - 116444736000000000i64) / 10i64; fprintf(stdout, "%I64d", now); #elif defined(XP_OS2_VACPP) diff --git a/pr/include/md/_win95.h b/pr/include/md/_win95.h index 5060be6f..5307a881 100644 --- a/pr/include/md/_win95.h +++ b/pr/include/md/_win95.h @@ -424,6 +424,9 @@ extern PRStatus _PR_KillWindowsProcess(struct PRProcess *process); #define _MD_INTERVAL_PER_MILLISEC() (_PR_MD_INTERVAL_PER_SEC() / 1000) #define _MD_INTERVAL_PER_MICROSEC() (_PR_MD_INTERVAL_PER_SEC() / 1000000) +/* --- Time --- */ +extern void _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm); + /* --- Native-Thread Specific Definitions ------------------------------- */ extern struct PRThread * _MD_CURRENT_THREAD(void); diff --git a/pr/include/md/_winnt.h b/pr/include/md/_winnt.h index 8a5b7041..321150eb 100644 --- a/pr/include/md/_winnt.h +++ b/pr/include/md/_winnt.h @@ -451,6 +451,9 @@ extern PRStatus _PR_KillWindowsProcess(struct PRProcess *process); #define _MD_INTERVAL_PER_MILLISEC() (_PR_MD_INTERVAL_PER_SEC() / 1000) #define _MD_INTERVAL_PER_MICROSEC() (_PR_MD_INTERVAL_PER_SEC() / 1000000) +/* --- Time --- */ +extern void _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm); + /* --- Native-Thread Specific Definitions ------------------------------- */ extern BOOL _pr_use_static_tls; diff --git a/pr/src/md/windows/ntio.c b/pr/src/md/windows/ntio.c index 299033cc..f38b2e6a 100644 --- a/pr/src/md/windows/ntio.c +++ b/pr/src/md/windows/ntio.c @@ -2815,7 +2815,7 @@ _PR_MD_DELETE(const char *name) } } -static void +void _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm) { PR_ASSERT(sizeof(FILETIME) == sizeof(PRTime)); diff --git a/pr/src/md/windows/ntmisc.c b/pr/src/md/windows/ntmisc.c index c4bb8511..41535e83 100644 --- a/pr/src/md/windows/ntmisc.c +++ b/pr/src/md/windows/ntmisc.c @@ -84,18 +84,12 @@ PRIntn _PR_MD_PUT_ENV(const char *name) PR_IMPLEMENT(PRTime) PR_Now(void) { - PRInt64 s, ms, ms2us, s2us; - struct timeb b; - - ftime(&b); - LL_I2L(ms2us, PR_USEC_PER_MSEC); - LL_I2L(s2us, PR_USEC_PER_SEC); - LL_I2L(s, b.time); - LL_I2L(ms, b.millitm); - LL_MUL(ms, ms, ms2us); - LL_MUL(s, s, s2us); - LL_ADD(s, s, ms); - return s; + PRTime prt; + FILETIME ft; + + GetSystemTimeAsFileTime(&ft); + _PR_FileTimeToPRTime(&ft, &prt); + return prt; } /* diff --git a/pr/src/md/windows/w95io.c b/pr/src/md/windows/w95io.c index 99b1a0b6..6ccdf410 100644 --- a/pr/src/md/windows/w95io.c +++ b/pr/src/md/windows/w95io.c @@ -579,7 +579,7 @@ _PR_MD_DELETE(const char *name) } } -static void +void _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm) { PR_ASSERT(sizeof(FILETIME) == sizeof(PRTime)); |