summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2017-09-08 00:41:55 +0200
committerAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2018-02-01 12:14:19 +0100
commit6ae7326e2e6ad4e5ba0651824cea9bcbd372493f (patch)
tree450b000497b8983f27061fb398eba6f7d1e88dcc
parent746c0110edacc570e1d345de6736d3825db04dfe (diff)
downloadglibc-6ae7326e2e6ad4e5ba0651824cea9bcbd372493f.tar.gz
Y2038: add function __time_t64
These implementations use only 32-bit time kernel syscalls. Therefore, stime() will always set errno to EOVERFLOW and return -1 for dates beyond Y2038.
-rw-r--r--sysdeps/posix/time.c26
-rw-r--r--sysdeps/unix/sysv/linux/time.c22
-rw-r--r--time/Versions1
-rw-r--r--time/time.c13
4 files changed, 62 insertions, 0 deletions
diff --git a/sysdeps/posix/time.c b/sysdeps/posix/time.c
index 6d0bb4bafc..1a3fd4e666 100644
--- a/sysdeps/posix/time.c
+++ b/sysdeps/posix/time.c
@@ -38,3 +38,29 @@ time (time_t *t)
return result;
}
libc_hidden_def (time)
+
+/* 64-bit time version */
+
+extern int __y2038_linux_support;
+
+__time64_t
+__time_t64 (__time64_t *t)
+{
+ struct timeval tv32;
+ __time64_t result;
+
+ if (__y2038_linux_support)
+ {
+ /* TODO: implement using 64-bit time syscall */
+ }
+
+ if (__gettimeofday (&tv32, (struct timezone *) NULL))
+ result = (__time64_t) -1;
+ else
+ result = (__time64_t) tv32.tv_sec;
+
+ if (t != NULL)
+ *t = result;
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/time.c b/sysdeps/unix/sysv/linux/time.c
index 69116af059..b68c0b7800 100644
--- a/sysdeps/unix/sysv/linux/time.c
+++ b/sysdeps/unix/sysv/linux/time.c
@@ -34,6 +34,28 @@ time (time_t *t)
}
libc_hidden_def (time)
+/* 64-BIT TIME VERSION */
+
+extern int __y2038_linux_support;
+
+__time64_t
+__time_t64 (__time64_t *t)
+{
+ INTERNAL_SYSCALL_DECL (err);
+ __time64_t res;
+
+ if (__y2038_linux_support)
+ {
+ /* TODO: implement using 64-bit time syscall */
+ }
+
+ res = INTERNAL_SYSCALL (time, err, 1, NULL);
+ /* There cannot be any error. */
+ if (t != NULL)
+ *t = res;
+ return res;
+}
+
#else
# include <sysdeps/posix/time.c>
diff --git a/time/Versions b/time/Versions
index e626dff8ec..e09465b8a1 100644
--- a/time/Versions
+++ b/time/Versions
@@ -84,5 +84,6 @@ libc {
__sigtimedwait64;
__futimes64;
__lutimes64;
+ __time_t64;
}
}
diff --git a/time/time.c b/time/time.c
index 4996d26f13..2b296b7471 100644
--- a/time/time.c
+++ b/time/time.c
@@ -31,3 +31,16 @@ time (time_t *timer)
libc_hidden_def (time)
stub_warning (time)
+
+/* 64-bit time version */
+
+__time64_t
+__time_t64 (__time64_ *timer)
+{
+ __set_errno (ENOSYS);
+
+ if (timer != NULL)
+ *timer = (__time64_t) -1;
+ return (__time64_t) -1;
+}
+libc_hidden_def (__time_t64)