commit 4cd78d818a6d4af2a200899feaff7cdd2ddca81f
parent e5e3b2e7078c3755fa6aedf1f03c6abd44aec151
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date: Sat, 9 Mar 2019 01:43:55 +0000
Respect POSIX "Seconds since the Epoch" when hitting a leap second
Diffstat:
3 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/libstddjb/leapsecs_add.c b/src/libstddjb/leapsecs_add.c
@@ -5,7 +5,7 @@
void leapsecs_add (uint64_t *t, int hit)
{
- uint64_t u = *t ;
+ uint64_t u = *t - !!hit ;
unsigned int i = 0 ;
for (; i < leapsecs_table_len ; i++)
{
diff --git a/src/libstddjb/leapsecs_sub.c b/src/libstddjb/leapsecs_sub.c
@@ -12,8 +12,8 @@ int leapsecs_sub (uint64_t *t)
for (; i < leapsecs_table_len ; i++)
{
if (u < leapsecs_table[i]) break ;
- ++d ;
if (u == leapsecs_table[i]) hit = 1 ;
+ else d++ ;
}
*t = u - d ;
return hit ;
diff --git a/src/libstddjb/localtm_from_ltm64.c b/src/libstddjb/localtm_from_ltm64.c
@@ -14,15 +14,14 @@
int localtm_from_ltm64 (struct tm *l, uint64_t uu, int tzh)
{
+ time_t u ;
if (uu < TAI_MAGIC) return (errno = EINVAL, 0) ;
uu -= TAI_MAGIC ;
#if SKALIBS_SIZEOFTIME != 8
if (uu > 0xFFFFFFFFUL) return (errno = EOVERFLOW, 0) ;
#endif
- {
- time_t u = (time_t)uu ;
- if (tzh & 1 ? !localtime_r(&u, l) : !gmtime_r(&u, l)) return 0 ;
- }
+ u = (time_t)uu - !!(tzh & 2) ;
+ if (tzh & 1 ? !localtime_r(&u, l) : !gmtime_r(&u, l)) return 0 ;
if (tzh & 2) l->tm_sec++ ;
return 1 ;
}