diff options
author | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-09-08 00:41:46 +0200 |
---|---|---|
committer | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2018-10-24 12:53:27 +0200 |
commit | a030a9e6b788b2a8542f18efb81f4a12ad01af08 (patch) | |
tree | 8d958627422b8a614e0da10fdb20fa09e947f67a | |
parent | 395890236462f1e59128b794152e99a0e2330a08 (diff) | |
download | glibc-a030a9e6b788b2a8542f18efb81f4a12ad01af08.tar glibc-a030a9e6b788b2a8542f18efb81f4a12ad01af08.tar.gz glibc-a030a9e6b788b2a8542f18efb81f4a12ad01af08.tar.bz2 glibc-a030a9e6b788b2a8542f18efb81f4a12ad01af08.zip |
Y2038: add function __timer_gettime64
For Linux this uses the 32-bit time syscall, so it
converts the syscall output into 64-bit time.
-rw-r--r-- | rt/Versions | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/librt.abilist | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/timer_gettime.c | 33 |
4 files changed, 38 insertions, 0 deletions
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 <stdlib.h> #include <time.h> #include <sysdep.h> +#include <y2038-support.h> #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; +} |