about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2019-03-09 01:43:55 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2019-03-09 01:43:55 +0000
commit4cd78d818a6d4af2a200899feaff7cdd2ddca81f (patch)
tree8feec1ca74ed7d5a023f0d05f8d3026848ffd9ce
parente5e3b2e7078c3755fa6aedf1f03c6abd44aec151 (diff)
downloadskalibs-4cd78d818a6d4af2a200899feaff7cdd2ddca81f.tar.gz
skalibs-4cd78d818a6d4af2a200899feaff7cdd2ddca81f.tar.xz
skalibs-4cd78d818a6d4af2a200899feaff7cdd2ddca81f.zip
Respect POSIX "Seconds since the Epoch" when hitting a leap second
-rw-r--r--src/libstddjb/leapsecs_add.c2
-rw-r--r--src/libstddjb/leapsecs_sub.c2
-rw-r--r--src/libstddjb/localtm_from_ltm64.c7
3 files changed, 5 insertions, 6 deletions
diff --git a/src/libstddjb/leapsecs_add.c b/src/libstddjb/leapsecs_add.c
index 7473693..b65b2a8 100644
--- 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
index f5c1c9b..c9fd66c 100644
--- 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
index a115cdc..8eba409 100644
--- 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 ;
 }