[[PATCH,RFC,2] 27/63] Y2038: add function __timer_gettime64

Message ID 20180418201819.15952-28-albert.aribaud@3adev.fr
State New, archived
Headers

Commit Message

Albert ARIBAUD April 18, 2018, 8:17 p.m. UTC
  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          |  2 ++
 .../sysv/linux/powerpc/powerpc32/librt.abilist     |  2 ++
 sysdeps/unix/sysv/linux/timer_gettime.c            | 22 ++++++++++++++++++++++
 4 files changed, 29 insertions(+)
  

Patch

diff --git a/rt/Versions b/rt/Versions
index 91e3fd2a20..8fcfba84fe 100644
--- a/rt/Versions
+++ b/rt/Versions
@@ -37,4 +37,7 @@  librt {
   GLIBC_2.7 {
    __mq_open_2;
   }
+  GLIBC_2.27 {
+   __timer_gettime64;
+  }
 }
diff --git a/sysdeps/unix/sysv/linux/arm/librt.abilist b/sysdeps/unix/sysv/linux/arm/librt.abilist
index b47aa0cc9c..f942d47058 100644
--- a/sysdeps/unix/sysv/linux/arm/librt.abilist
+++ b/sysdeps/unix/sysv/linux/arm/librt.abilist
@@ -1,3 +1,5 @@ 
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __timer_gettime64 F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 aio_cancel F
 GLIBC_2.4 aio_cancel64 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist
index 15e4418863..519a6f7657 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist
@@ -29,6 +29,8 @@  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.27 GLIBC_2.27 A
+GLIBC_2.27 __timer_gettime64 F
 GLIBC_2.3.4 GLIBC_2.3.4 A
 GLIBC_2.3.4 mq_close F
 GLIBC_2.3.4 mq_getattr F
diff --git a/sysdeps/unix/sysv/linux/timer_gettime.c b/sysdeps/unix/sysv/linux/timer_gettime.c
index 10a19d9ee7..94be3af4a2 100644
--- a/sysdeps/unix/sysv/linux/timer_gettime.c
+++ b/sysdeps/unix/sysv/linux/timer_gettime.c
@@ -39,3 +39,25 @@  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;
+
+  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;
+}