]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
hwclock: make hwclock leap-second-aware
authorJoseph Parmelee <jparmele@wildbear.com>
Mon, 18 Mar 2013 04:48:57 +0000 (22:48 -0600)
committerKarel Zak <kzak@redhat.com>
Mon, 18 Mar 2013 09:31:32 +0000 (10:31 +0100)
Attached is a patch file leap_seconds.patch against util-linux-2.22.2
that allows leap seconds to be included in hwclock --show or --hctosys.
The current code uses the default UTC zonefile in reading the hardware
RTC with mktime().  This zonefile usually does not include leap
seconds.  As of this date there have been a total of 25 leap seconds
added since the epoch (start of 1970).  This is particularly a problem
for systems using ntp to maintain their system clocks because ntp does
take leap seconds into account.  A user can specify a leap-second-aware
zonefile via /etc/localtime.  By defining the environment variable
TZUTC, mktime() can be induced to use a matching UTC zonefile that
includes leap seconds.  The default behavior (TZUTC undefined) is
unchanged.

Regards,

Joseph Parmelee
jparmele at wildbear.com

sys-utils/hwclock.c

index 9256ec5bd5d9263955bda8bf02fbabee0def17d2..b7f569207a0c9c27d64114f019f633ae43ac0785 100644 (file)
@@ -382,8 +382,15 @@ mktime_tz(struct tm tm, const bool universal,
         */
        zone = getenv("TZ");    /* remember original time zone */
        if (universal) {
-               /* Set timezone to UTC */
-               setenv("TZ", "", TRUE);
+               /* Set timezone to UTC as defined by the environment
+                * variable TZUTC.  TZUTC undefined gives the default UTC
+                * zonefile which usually does not take into account leap
+                * seconds.  Define TZUTC to select your UTC zonefile which
+                * does include leap seconds.  For example, with recent GNU
+                * libc's:
+                *    TZUTC=:/usr/share/zoneinfo/right/UTC
+                */
+               setenv("TZ", getenv("TZUTC"), TRUE);
                /*
                 * Note: tzset() gets called implicitly by the time code,
                 * but only the first time. When changing the environment