summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>2003-01-14 13:24:12 +0000
committerwtc%netscape.com <devnull@localhost>2003-01-14 13:24:12 +0000
commit56cb4035007abfcfe7d6cd1bea966d5244cdf566 (patch)
tree63e8c995b4c09bf3702201da57c2069b155dad93
parent5492bfdf5b1d4b2c7f16fcc53925c6cb1ae1f03f (diff)
downloadnspr-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.c17
-rw-r--r--pr/include/md/_win95.h3
-rw-r--r--pr/include/md/_winnt.h3
-rw-r--r--pr/src/md/windows/ntio.c2
-rw-r--r--pr/src/md/windows/ntmisc.c18
-rw-r--r--pr/src/md/windows/w95io.c2
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));