diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/timer_gettime.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/timer_gettime.c | 33 |
1 files changed, 33 insertions, 0 deletions
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; +} |