[[PATCH,RFC,2] 40/63] Y2038: add function __utimes64

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

Commit Message

Albert ARIBAUD April 18, 2018, 8:17 p.m. UTC
  ---
 include/time.h                     |  3 +++
 misc/Makefile                      |  3 ++-
 misc/utimes.c                      | 15 +++++++++++
 sysdeps/unix/sysv/linux/utimes64.c | 54 ++++++++++++++++++++++++++++++++++++++
 time/Versions                      |  1 +
 5 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/unix/sysv/linux/utimes64.c
  

Patch

diff --git a/include/time.h b/include/time.h
index 68c52220fd..5e601adbd4 100644
--- a/include/time.h
+++ b/include/time.h
@@ -43,6 +43,9 @@  extern int __clock_nanosleep64 (clockid_t __clock_id, int __flags,
 				const struct __timespec64 *__req,
 				struct __timespec64 *__rem);
 
+extern int __utimes64 (const char *file,
+                       const struct __timeval64 tvp[2]);
+
 /* Now define the internal interfaces.  */
 struct tm;
 
diff --git a/misc/Makefile b/misc/Makefile
index a5076b3672..f3463620fb 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -70,7 +70,8 @@  routines := brk sbrk sstk ioctl \
 	    getloadavg getclktck \
 	    fgetxattr flistxattr fremovexattr fsetxattr getxattr \
 	    listxattr lgetxattr llistxattr lremovexattr lsetxattr \
-	    removexattr setxattr getauxval ifunc-impl-list makedev
+	    removexattr setxattr getauxval ifunc-impl-list makedev \
+	    utimes64
 
 generated += tst-error1.mtrace tst-error1-mem.out
 
diff --git a/misc/utimes.c b/misc/utimes.c
index 0ae6946142..cdb43f6688 100644
--- a/misc/utimes.c
+++ b/misc/utimes.c
@@ -38,3 +38,18 @@  __utimes (const char *file, const struct timeval tvp[2])
 weak_alias (__utimes, utimes)
 
 stub_warning (utimes)
+
+int
+__utimes64 (const char *file, const struct __timeval64 tvp[2])
+{
+  if (file == NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  __set_errno (ENOSYS);
+  return -1;
+}
+
+stub_warning (__utimes64)
diff --git a/sysdeps/unix/sysv/linux/utimes64.c b/sysdeps/unix/sysv/linux/utimes64.c
new file mode 100644
index 0000000000..eb9022a2d9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/utimes64.c
@@ -0,0 +1,54 @@ 
+/* Copyright (C) 1995-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <stddef.h>
+#include <utime.h>
+#include <sys/time.h>
+#include <sysdep.h>
+
+
+/* Consider moving to syscalls.list.  */
+
+extern int __y2038_linux_support;
+
+int
+__utimes64 (const char *file, const struct __timeval64 tvp[2])
+{
+  struct timeval tv32[2], *tvp32 = NULL;
+
+  if (__y2038_linux_support)
+    {
+      /* TODO: implement using 64-bit time syscall */
+    }
+
+  if (tvp != NULL)
+    {
+      if (tvp[0].tv_sec > INT_MAX || tvp[1].tv_sec > INT_MAX)
+        {
+          __set_errno(EOVERFLOW);
+          return -1;
+        }
+      tv32[0].tv_sec = tvp[0].tv_sec;
+      tv32[0].tv_usec = tvp[0].tv_usec;
+      tv32[1].tv_sec = tvp[1].tv_sec;
+      tv32[1].tv_usec = tvp[1].tv_usec;
+      tvp32 = tv32;
+    }
+
+  return INLINE_SYSCALL (utimes, 2, file, tvp32);
+}
diff --git a/time/Versions b/time/Versions
index 6b1ca80c1e..86ced5a7c7 100644
--- a/time/Versions
+++ b/time/Versions
@@ -88,5 +88,6 @@  libc {
     __settimeofday64;
     __time64;
     __stime64;
+    __utimes64;
   }
 }