From a9ce4dc76cbc338ea1812bd37663593e658f8f1e Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Thu, 2 Aug 2018 17:12:12 +0200
Subject: [PATCH] "Inverted" time_t value handling.
So far time_t values were interpreted as local time values. However, usually time_t values are to be interpreted as "seconds since 1 Jan 1970 in UTC". Therefore all logic handling time_t values has to be changed.
- So far gmtime() called localtime() with an adjusted time_t, now localtime() calls gmtime() with an adjusted time_t.
- mktime() has to do "the opposite" of localtime(), to keep it that way mktime() does now the inverse adjustment made by localtime().
- All currently present time() implementations internally call mktime() so they don't require individual adjustments.
---
libsrc/common/gmtime.c | 28 +++++++++++++++++++---------
libsrc/common/localtime.c | 27 ++++++---------------------
libsrc/common/mktime.c | 3 ++-
3 files changed, 27 insertions(+), 31 deletions(-)
diff --git a/libsrc/common/gmtime.c b/libsrc/common/gmtime.c
index 1a2536c5f..85e9de3d0 100644
--- a/libsrc/common/gmtime.c
+++ b/libsrc/common/gmtime.c
@@ -45,19 +45,29 @@
struct tm* __fastcall__ gmtime (const time_t* timep)
{
+ static struct tm timebuf;
time_t t;
- /* Check for a valid time spec */
- if (timep == 0) {
+ /* Check the argument */
+ if (timep == 0 || (long) (t = *timep) < 0) {
+ /* Invalid arg */
return 0;
}
- /* Get the time and correct for the time zone offset */
- t = *timep + _tz.timezone;
-
- /* Use localtime for conversion */
- return localtime (&t);
-}
-
+ /* Since our ints are just 16 bits, split the given time into seconds,
+ ** hours and days. Each of the values will fit in a 16 bit variable.
+ ** The mktime routine will then do the rest.
+ */
+ timebuf.tm_sec = t % 3600;
+ timebuf.tm_min = 0;
+ timebuf.tm_hour = (t / 3600) % 24;
+ timebuf.tm_mday = (t / (3600UL * 24UL)) + 1;
+ timebuf.tm_mon = 0;
+ timebuf.tm_year = 70; /* Base value is 1/1/1970 */
+ /* Call mktime to do the final conversion */
+ mktime (&timebuf);
+ /* Return the result */
+ return &timebuf;
+}
diff --git a/libsrc/common/localtime.c b/libsrc/common/localtime.c
index cc6298f8c..48931ea62 100644
--- a/libsrc/common/localtime.c
+++ b/libsrc/common/localtime.c
@@ -45,31 +45,16 @@
struct tm* __fastcall__ localtime (const time_t* timep)
{
- static struct tm timebuf;
time_t t;
- /* Check the argument */
- if (timep == 0 || (long) (t = *timep) < 0) {
- /* Invalid arg */
+ /* Check for a valid time spec */
+ if (timep == 0) {
return 0;
}
- /* Since our ints are just 16 bits, split the given time into seconds,
- ** hours and days. Each of the values will fit in a 16 bit variable.
- ** The mktime routine will then do the rest.
- */
- timebuf.tm_sec = t % 3600;
- timebuf.tm_min = 0;
- timebuf.tm_hour = (t / 3600) % 24;
- timebuf.tm_mday = (t / (3600UL * 24UL)) + 1;
- timebuf.tm_mon = 0;
- timebuf.tm_year = 70; /* Base value is 1/1/1970 */
+ /* Get the time and correct for the time zone offset */
+ t = *timep + _tz.timezone;
- /* Call mktime to do the final conversion */
- mktime (&timebuf);
-
- /* Return the result */
- return &timebuf;
+ /* Use gmtime for conversion */
+ return gmtime (&t);
}
-
-
diff --git a/libsrc/common/mktime.c b/libsrc/common/mktime.c
index 423727751..275589dbb 100644
--- a/libsrc/common/mktime.c
+++ b/libsrc/common/mktime.c
@@ -180,7 +180,8 @@ time_t __fastcall__ mktime (register struct tm* TM)
return DayCount * 86400UL +
((unsigned) TM->tm_hour) * 3600UL +
((unsigned) TM->tm_min) * 60U +
- ((unsigned) TM->tm_sec);
+ ((unsigned) TM->tm_sec) -
+ _tz.timezone;
Error:
/* Error exit */
--
2.39.5