public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: "Albert ARIBAUD (3ADEV)" <albert.aribaud@3adev.fr>
To: libc-alpha@sourceware.org
Cc: "Albert ARIBAUD (3ADEV)" <albert.aribaud@3adev.fr>
Subject: [RFC PATCH 08/52] Y2038: add function __clock_settime64
Date: Thu, 07 Sep 2017 22:43:00 -0000	[thread overview]
Message-ID: <20170907224219.12483-9-albert.aribaud@3adev.fr> (raw)
In-Reply-To: <20170907224219.12483-8-albert.aribaud@3adev.fr>

Signed-off-by: Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>
---
 include/time.h                          |  2 ++
 sysdeps/unix/clock_settime.c            | 56 ++++++++++++++++++++++++++++++++-
 sysdeps/unix/sysv/linux/arm/Versions    |  1 +
 sysdeps/unix/sysv/linux/clock_settime.c | 23 ++++++++++++++
 4 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/include/time.h b/include/time.h
index eeefbb4e98..63237e23f4 100644
--- a/include/time.h
+++ b/include/time.h
@@ -50,6 +50,8 @@ extern __typeof (clock_getcpuclockid) __clock_getcpuclockid;
 
 extern int __clock_gettime64 (clockid_t __clock_id,
 			      struct __timespec64 *__tp) __THROW;
+extern int __clock_settime64 (clockid_t __clock_id,
+			       const struct __timespec64 *__tp) __THROW;
 
 /* Now define the internal interfaces.  */
 struct tm;
diff --git a/sysdeps/unix/clock_settime.c b/sysdeps/unix/clock_settime.c
index e744cae6a9..8d7de2a310 100644
--- a/sysdeps/unix/clock_settime.c
+++ b/sysdeps/unix/clock_settime.c
@@ -68,8 +68,62 @@ hp_timing_settime (clockid_t clock_id, const struct timespec *tp)
 }
 #endif
 
+/* Set CLOCK to value TP, 64-bit Y2038-safe version.  */
+int
+__clock_settime64 (clockid_t clock_id, const struct __timespec64 *tp)
+{
+  int retval = EOVERFLOW;
+
+  /* Make sure the time cvalue is OK.  */
+  if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  switch (clock_id)
+    {
+#define HANDLE_REALTIME \
+      do {								      \
+	struct timeval tv;						      \
+	TIMESPEC_TO_TIMEVAL (&tv, tp);					      \
+									      \
+	retval = settimeofday (&tv, NULL);				      \
+      } while (0)
+
+#ifdef SYSDEP_SETTIME64
+      SYSDEP_SETTIME64;
+#endif
+
+#ifndef HANDLED_REALTIME
+    case CLOCK_REALTIME:
+      HANDLE_REALTIME;
+      break;
+#endif
+
+    default:
+#ifdef SYSDEP_SETTIME64_CPU
+      SYSDEP_SETTIME64_CPU;
+#endif
+#ifndef HANDLED_CPUTIME
+# if HP_TIMING_AVAIL
+      if (CPUCLOCK_WHICH (clock_id) == CLOCK_PROCESS_CPUTIME_ID
+	  || CPUCLOCK_WHICH (clock_id) == CLOCK_THREAD_CPUTIME_ID)
+	retval = hp_timing_settime (clock_id, tp);
+      else
+# endif
+	{
+	  __set_errno (EINVAL);
+	  retval = -1;
+	}
+#endif
+      break;
+    }
+
+  return retval;
+}
 
-/* Set CLOCK to value TP.  */
+/* Set CLOCK to value TP, 64-bit Y2038-unsafe version.  */
 int
 __clock_settime (clockid_t clock_id, const struct timespec *tp)
 {
diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions
index a2655d6262..553cdd7543 100644
--- a/sysdeps/unix/sysv/linux/arm/Versions
+++ b/sysdeps/unix/sysv/linux/arm/Versions
@@ -30,5 +30,6 @@ libc {
     __clock_gettime64;
     __vdso_clock_gettime64;
     __y2038_kernel_support;
+    __clock_settime64;
   }
 }
diff --git a/sysdeps/unix/sysv/linux/clock_settime.c b/sysdeps/unix/sysv/linux/clock_settime.c
index 058c518e5a..40760ff494 100644
--- a/sysdeps/unix/sysv/linux/clock_settime.c
+++ b/sysdeps/unix/sysv/linux/clock_settime.c
@@ -35,4 +35,27 @@
 #define SYSDEP_SETTIME_CPU \
   retval = INLINE_SYSCALL (clock_settime, 2, clock_id, tp)
 
+/* 64-bit time version */
+
+extern int __y2038_linux_support;
+
+#define SYSDEP_SETTIME64 \
+  case CLOCK_REALTIME:							      \
+    if (__y2038_linux_support)						      \
+      {									      \
+        struct __timespec64 ts64;					      \
+        ts64.tv_sec = tp->tv_sec;					      \
+        ts64.tv_nsec = tp->tv_nsec;					      \
+        ts64.tv_pad = 0;						      \
+        retval = INLINE_SYSCALL (clock_settime64, 2, clock_id, &ts64);	      \
+      }									      \
+    else if (tp->tv_sec <= INT_MAX)					      \
+      {									      \
+        struct timespec ts32;						      \
+        ts32.tv_sec = tp->tv_sec;					      \
+        ts32.tv_nsec = tp->tv_nsec;					      \
+        retval = INLINE_SYSCALL (clock_settime, 2, clock_id, &ts32);	      \
+      }									      \
+    break
+
 #include <sysdeps/unix/clock_settime.c>
-- 
2.11.0

  reply	other threads:[~2017-09-07 22:43 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-07 22:42 [RFC PATCH 00/52] Make GLIBC Y2038-proof Albert ARIBAUD (3ADEV)
2017-09-07 22:42 ` [RFC PATCH 01/52] Y2038: add type __time64_t Albert ARIBAUD (3ADEV)
2017-09-07 22:42   ` [RFC PATCH 02/52] Y2038: add function __difftime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:42     ` [RFC PATCH 03/52] Y2038: add functions using struct tm Albert ARIBAUD (3ADEV)
2017-09-07 22:42       ` [RFC PATCH 04/52] Y2038: add function __mktime64 (and timelocal) Albert ARIBAUD (3ADEV)
2017-09-07 22:42         ` [RFC PATCH 05/52] Y2038: add function __timegm64 Albert ARIBAUD (3ADEV)
2017-09-07 22:42           ` [RFC PATCH 06/52] Y2038: add struct __timespec64 Albert ARIBAUD (3ADEV)
2017-09-07 22:42             ` [RFC PATCH 07/52] Y2038: add function __clock_gettime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43               ` Albert ARIBAUD (3ADEV) [this message]
2017-09-07 22:43                 ` [RFC PATCH 09/52] Y2038: add function __clock_getres64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                   ` [RFC PATCH 10/52] Y2038: add function __clock_nanosleep64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                     ` [RFC PATCH 11/52] Y2038: add function __timespec_get64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                       ` [RFC PATCH 12/52] Y2038: add function __futimens64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                         ` [RFC PATCH 13/52] Y2038: add function __utimensat64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                           ` [RFC PATCH 14/52] Y2038: add function __sigtimedwait64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                             ` [RFC PATCH 15/52] Y2038: add struct __timeval64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                               ` [RFC PATCH 16/52] Y2038: add function __futimes64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                                 ` [RFC PATCH 17/52] Y2038: add function __lutimes64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                                   ` [RFC PATCH 18/52] Y2038: add struct __itimerspec64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                                     ` [RFC PATCH 19/52] Y2038: add function __timer_gettime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                                       ` [RFC PATCH 20/52] Y2038: add function __timer_settime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:43                                         ` [RFC PATCH 21/52] Y2038: add function __timerfd_gettime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                           ` [RFC PATCH 22/52] Y2038: add function __timerfd_settime64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                             ` [RFC PATCH 23/52] Y2038: add struct __stat64_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                               ` [RFC PATCH 24/52] Y2038: add function __fstat64_t64 (and __fxstat64_t64) Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                 ` [RFC PATCH 25/52] Y2038: add function __stat64_t64 (and __xstat64_t64) Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                   ` [RFC PATCH 26/52] Y2038: add function __lstat64_t64 (and __lxstat64_t64) Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                     ` [RFC PATCH 27/52] Y2038: add function __fstatat64_t64 (and __fxstatat_t64) Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                       ` [RFC PATCH 28/52] Y2038: add function __time_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                         ` [RFC PATCH 29/52] Y2038: add function __stime_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                           ` [RFC PATCH 30/52] Y2038: add function __utimes_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                             ` [RFC PATCH 31/52] Y2038: add function __gettimeofday_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                               ` [RFC PATCH 32/52] Y2038: add function __settimeofday_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                                 ` [RFC PATCH 33/52] Y2038: add function __mq_timedsend_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                                   ` [RFC PATCH 34/52] Y2038: add function __mq_timedreceive_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:44                                                                     ` [RFC PATCH 35/52] Y2038: add function __msgctl_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                       ` [RFC PATCH 36/52] Y2038: add function __sched_rr_get_interval_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                         ` [RFC PATCH 37/52] Y2038: add function __nanosleep64_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                           ` [RFC PATCH 38/52] Y2038: add function __adjtime_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                             ` [RFC PATCH 39/52] Y2038: add function __utime_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                               ` [RFC PATCH 40/52] Y2038: add struct __itimerval_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                 ` [RFC PATCH 41/52] Y2038: add function __getitimer_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                   ` [RFC PATCH 42/52] Y2038: add function __setitimer_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                     ` [RFC PATCH 43/52] Y2038: add functions using futexes Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                       ` [RFC PATCH 44/52] Y2038: add function __getrusage_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                         ` [RFC PATCH 45/52] Y2038: add struct __ntp_timeval_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                           ` [RFC PATCH 46/52] Y2038: add function __ntp_gettime_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                             ` [RFC PATCH 47/52] Y2038: add function __ntp_gettimex_t64 Albert ARIBAUD (3ADEV)
2017-09-07 22:45                                                                                               ` [RFC PATCH 48/52] Y2038: add function __adjtimex_t64 (and __ntp_adjtime_t64) Albert ARIBAUD (3ADEV)
2017-09-07 22:46                                                                                                 ` [RFC PATCH 49/52] Y2038: add function pselect Albert ARIBAUD (3ADEV)
2017-09-08 17:49                                                                                                   ` [RFC PATCH 50/52] Y2038: add function select Albert ARIBAUD (3ADEV)
2017-09-08 17:49                                                                                                     ` [RFC PATCH 51/52] Y2038: add RPC functions Albert ARIBAUD (3ADEV)
2017-09-08 17:49                                                                                                       ` [RFC PATCH 52/52] Y2038: add _TIME_BITS==64 support Albert ARIBAUD (3ADEV)
2017-09-08 19:47                                                                                                         ` Joseph Myers
2017-09-08 19:47                                                                                                       ` [RFC PATCH 51/52] Y2038: add RPC functions Joseph Myers
2017-09-08 19:59                                                                                                       ` Paul Eggert
2017-09-09 14:37                                                                                                         ` Albert ARIBAUD
2017-09-11  6:33                                                                                                           ` Paul Eggert
2017-09-11  7:06                                                                                                         ` Paul Eggert
2017-09-11 14:07                                                                                                           ` Paul Eggert
2017-09-11 15:59                                                                                                             ` Albert ARIBAUD
2017-09-07 23:21 ` [RFC PATCH 00/52] Make GLIBC Y2038-proof Joseph Myers
2017-09-08 16:19   ` Zack Weinberg
2017-09-08 16:43     ` Joseph Myers
2017-09-08 16:54       ` Paul Eggert
2017-09-08 17:01       ` Zack Weinberg
2017-09-08 17:24         ` Joseph Myers
2017-09-08 18:32           ` Zack Weinberg
2017-09-08 17:42     ` Albert ARIBAUD
2017-09-08 17:59       ` Joseph Myers
2017-09-08 18:16         ` Albert ARIBAUD
2017-09-08 18:36           ` Zack Weinberg
2017-09-08 17:08   ` Albert ARIBAUD
2017-09-08 17:26     ` Joseph Myers
2017-09-08 19:19       ` Albert ARIBAUD
2017-09-08  4:23 ` Albert ARIBAUD

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170907224219.12483-9-albert.aribaud@3adev.fr \
    --to=albert.aribaud@3adev.fr \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).