summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2017-09-08 00:41:37 +0200
committerAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2018-04-11 22:39:43 +0200
commit6e3710a0c6b342c279a09ae4f9c54ec0a54c8354 (patch)
tree840cfb4dbf934d5222480a9b98c19a238ef0a24f
parent8d4b047106755fdbbb7e7ae5b9664385d6c16c53 (diff)
downloadglibc-6e3710a0c6b342c279a09ae4f9c54ec0a54c8354.tar.gz
Y2038: add function __clock_nanosleep64
-rw-r--r--include/time.h3
-rw-r--r--sysdeps/unix/sysv/linux/clock_nanosleep.c42
-rw-r--r--time/Versions1
3 files changed, 45 insertions, 1 deletions
diff --git a/include/time.h b/include/time.h
index f836438e82..11f57839ae 100644
--- a/include/time.h
+++ b/include/time.h
@@ -58,6 +58,9 @@ extern int __clock_settime64 (clockid_t __clock_id,
const struct __timespec64 *__tp) __THROW;
extern int __clock_getres64 (clockid_t __clock_id,
struct __timespec64 *__res) __THROW;
+extern int __clock_nanosleep64 (clockid_t __clock_id, int __flags,
+ const struct __timespec64 *__req,
+ struct __timespec64 *__rem);
/* Now define the internal interfaces. */
struct tm;
diff --git a/sysdeps/unix/sysv/linux/clock_nanosleep.c b/sysdeps/unix/sysv/linux/clock_nanosleep.c
index 93d5d6ef12..4249ccd3ff 100644
--- a/sysdeps/unix/sysv/linux/clock_nanosleep.c
+++ b/sysdeps/unix/sysv/linux/clock_nanosleep.c
@@ -21,7 +21,6 @@
#include <sysdep-cancel.h>
#include "kernel-posix-cpu-timers.h"
-
/* We can simply use the syscall. The CPU clocks are not supported
with this function. */
int
@@ -52,3 +51,44 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
? INTERNAL_SYSCALL_ERRNO (r, err) : 0);
}
weak_alias (__clock_nanosleep, clock_nanosleep)
+
+/* 64-bit time version */
+
+extern int __y2038_linux_support;
+
+int
+__clock_nanosleep64 (clockid_t clock_id, int flags,
+ const struct __timespec64 *req,
+ struct __timespec64 *rem)
+{
+ /* Until Linux provides a 64-bit syscall, use the 32-bit one */
+ INTERNAL_SYSCALL_DECL (err);
+ int r;
+ struct timespec req32, rem32, *rem32p = NULL;
+
+ if (req == NULL)
+ {
+ __set_errno(EFAULT);
+ return -1;
+ }
+
+ if (req->tv_sec > INT32_MAX || req->tv_sec < INT32_MIN)
+ {
+ __set_errno(EOVERFLOW);
+ return -1;
+ }
+
+ req32.tv_sec = req->tv_sec;
+ req32.tv_nsec = req->tv_nsec;
+ if (rem !=NULL) rem32p = &rem32;
+
+ r = clock_nanosleep(clock_id, flags, &req32, rem32p);
+
+ if (r == 0 && rem != NULL)
+ {
+ rem->tv_sec = rem32.tv_sec;
+ rem->tv_nsec = rem32.tv_nsec;
+ }
+
+ return r;
+}
diff --git a/time/Versions b/time/Versions
index 98ac0abfbe..6fe9373913 100644
--- a/time/Versions
+++ b/time/Versions
@@ -77,5 +77,6 @@ libc {
__y2038_kernel_support;
__clock_settime64;
__clock_getres64;
+ __clock_nanosleep64;
}
}