From 02ae9a86077c629eb6f998c4f824bb9b9c4e60ce Mon Sep 17 00:00:00 2001 From: Patrick Oppenlander Date: Thu, 8 Feb 2024 14:36:26 +1100 Subject: [PATCH] leapdb: make twice per day check logic common We want to do the twice per day check regardless of the data source. Move the check up one level from get_tz_leap() into LDB_GetLeap(). --- leapdb.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/leapdb.c b/leapdb.c index 676a0d5..32f753a 100644 --- a/leapdb.c +++ b/leapdb.c @@ -41,24 +41,10 @@ static char *leap_tzname; static NTP_Leap get_tz_leap(time_t when, int *tai_offset) { - static time_t last_tz_leap_check; - static NTP_Leap tz_leap; - static int tz_tai_offset; - struct tm stm, *tm; time_t t; char *tz_env, tz_orig[128]; - - *tai_offset = tz_tai_offset; - - /* Do this check at most twice a day */ - when = when / (12 * 3600) * (12 * 3600); - if (last_tz_leap_check == when) - return tz_leap; - - last_tz_leap_check = when; - tz_leap = LEAP_Normal; - tz_tai_offset = 0; + NTP_Leap tz_leap = LEAP_Normal; tm = gmtime(&when); if (!tm) @@ -79,7 +65,7 @@ get_tz_leap(time_t when, int *tai_offset) /* Get the TAI-UTC offset, which started at the epoch at 10 seconds */ t = mktime(&stm); if (t != -1) - tz_tai_offset = t - when + 10; + *tai_offset = t - when + 10; /* Set the time to 23:59:60 and see how it overflows in mktime() */ stm.tm_sec = 60; @@ -102,8 +88,6 @@ get_tz_leap(time_t when, int *tai_offset) else if (stm.tm_sec == 1) tz_leap = LEAP_DeleteSecond; - *tai_offset = tz_tai_offset; - return tz_leap; } @@ -132,10 +116,25 @@ LDB_Initialise(void) NTP_Leap LDB_GetLeap(time_t when, int *tai_offset) { - *tai_offset = 0; + static time_t last_ldb_leap_check; + static NTP_Leap ldb_leap; + static int ldb_tai_offset; + + /* Do this check at most twice a day */ + when = when / (12 * 3600) * (12 * 3600); + if (last_ldb_leap_check == when) + goto out; + + last_ldb_leap_check = when; + ldb_leap = LEAP_Normal; + ldb_tai_offset = 0; + if (leap_tzname) - return get_tz_leap(when, tai_offset); - return LEAP_Normal; + ldb_leap = get_tz_leap(when, &ldb_tai_offset); + +out: + *tai_offset = ldb_tai_offset; + return ldb_leap; } /* ================================================== */