From a030a9e6b788b2a8542f18efb81f4a12ad01af08 Mon Sep 17 00:00:00 2001 From: "Albert ARIBAUD (3ADEV)" Date: Fri, 8 Sep 2017 00:41:46 +0200 Subject: Y2038: add function __timer_gettime64 For Linux this uses the 32-bit time syscall, so it converts the syscall output into 64-bit time. --- rt/Versions | 3 ++ sysdeps/unix/sysv/linux/arm/librt.abilist | 1 + .../sysv/linux/powerpc/powerpc32/librt.abilist | 1 + sysdeps/unix/sysv/linux/timer_gettime.c | 33 ++++++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/rt/Versions b/rt/Versions index 91e3fd2a20..e55faa0629 100644 --- a/rt/Versions +++ b/rt/Versions @@ -37,4 +37,7 @@ librt { GLIBC_2.7 { __mq_open_2; } + GLIBC_2.29 { + __timer_gettime64; + } } diff --git a/sysdeps/unix/sysv/linux/arm/librt.abilist b/sysdeps/unix/sysv/linux/arm/librt.abilist index cfbbd27557..e18f5ee3f5 100644 --- a/sysdeps/unix/sysv/linux/arm/librt.abilist +++ b/sysdeps/unix/sysv/linux/arm/librt.abilist @@ -1,3 +1,4 @@ +GLIBC_2.29 __timer_gettime64 F GLIBC_2.4 aio_cancel F GLIBC_2.4 aio_cancel64 F GLIBC_2.4 aio_error F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist index 595f1b712a..cb6ba7248e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist @@ -27,6 +27,7 @@ GLIBC_2.2 timer_delete F GLIBC_2.2 timer_getoverrun F GLIBC_2.2 timer_gettime F GLIBC_2.2 timer_settime F +GLIBC_2.29 __timer_gettime64 F GLIBC_2.3.4 mq_close F GLIBC_2.3.4 mq_getattr F GLIBC_2.3.4 mq_notify F diff --git a/sysdeps/unix/sysv/linux/timer_gettime.c b/sysdeps/unix/sysv/linux/timer_gettime.c index 10a19d9ee7..85806f4282 100644 --- a/sysdeps/unix/sysv/linux/timer_gettime.c +++ b/sysdeps/unix/sysv/linux/timer_gettime.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "kernel-posix-timers.h" @@ -39,3 +40,35 @@ timer_gettime (timer_t timerid, struct itimerspec *value) return res; } + +/* 64-bit time version */ + +int +__timer_gettime64 (timer_t timerid, struct __itimerspec64 *value) +{ + struct itimerspec value32; + struct timer *kt = (struct timer *) timerid; + int res; + +#ifdef __NR_timer_gettime64 + if (__y2038_get_kernel_support () > 0) + { + res = INLINE_SYSCALL (timer_gettime, 2, kt->ktimerid, value); + if (res == 0 || errno != ENOSYS) + return res; + __y2038_set_kernel_support (-1); + } +#endif + + res = INLINE_SYSCALL (timer_gettime, 2, kt->ktimerid, &value32); + + if (res == 0) + { + value->it_value.tv_sec = value32.it_value.tv_sec; + value->it_value.tv_nsec = value32.it_value.tv_nsec; + value->it_interval.tv_sec = value32.it_interval.tv_sec; + value->it_interval.tv_nsec = value32.it_interval.tv_nsec; + } + + return res; +} -- cgit v1.2.3-70-g09d2