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().
This commit is contained in:
Patrick Oppenlander 2024-02-08 14:36:26 +11:00 committed by Miroslav Lichvar
parent 017d6f8f56
commit 02ae9a8607

View file

@ -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;
}
/* ================================================== */