Source: ntp
Version: 1:4.2.8p10+dfsg-1
Severity: wishlist

I posted a question to debian-users
(https://lists.debian.org/debian-user/2017/03/msg00591.html) and
nobody said "This already works" or "This is a bad idea", so I'm
filing this bug.

It would be nice if clock_gettime(CLOCK_TAI, ...) would give the
correct answer either with no special configuration or with very
little extra reconfiguration. This would probably be achieved by
downloading a table of leap seconds so it is related to #851096.

See also:
https://superuser.com/questions/1156693/is-there-a-way-of-getting-correct-clock-tai-on-linux

A test program to print out the difference between CLOCK_TAI and
CLOCK_UTC or CLOCK_REALTIME is attached. (Right-justification of
this bug report happened by accident.)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#ifndef CLOCK_TAI
# error CLOCK_TAI is not defined. Your C library is too old.
#endif

#ifndef CLOCK_UTC
# warning CLOCK_UTC is not defined, no surprise. Using CLOCK_REALTIME instead.
# define CLOCK_UTC CLOCK_REALTIME
#endif

int main()
{
    struct timespec ts_utc1, ts_tai, ts_utc2;
    long long diff1, diff2;

    if (clock_gettime(CLOCK_UTC, &ts_utc1)) {
        printf("clock_gettime(CLOCK_UTC, ...) failed\n");
        exit(1);
    }
    if (clock_gettime(CLOCK_TAI, &ts_tai)) {
        printf("clock_gettime(CLOCK_TAI, ...) failed\n");
        exit(1);
    }
    if (clock_gettime(CLOCK_UTC, &ts_utc2)) {
        printf("clock_gettime(CLOCK_UTC, ...) failed\n");
        exit(1);
    }

    diff1 = ((ts_tai.tv_nsec - ts_utc1.tv_nsec) +
             (ts_tai.tv_sec  - ts_utc1.tv_sec ) * 1000000000LL);
    diff2 = ((ts_tai.tv_nsec - ts_utc2.tv_nsec) +
             (ts_tai.tv_sec  - ts_utc2.tv_sec ) * 1000000000LL);

    printf("Expected (TAI - UTC) in 2017:\n");
    printf("%16lld\n", 37 * 1000000000LL);
    printf("Difference between CLOCK_TAI and CLOCK_UTC is in range:\n");
    printf("%16lld\n", diff2);
    printf("%16lld\n", diff1);

    return 0;
}

Reply via email to