diff options
author | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-09-08 00:41:57 +0200 |
---|---|---|
committer | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2018-10-24 12:53:27 +0200 |
commit | b065a273b0da04e590eaf0a8c27b136a97d20107 (patch) | |
tree | 3bb1d343eb86acb03463c494d384efc0f6ae8edf | |
parent | b1563168c4571d77a4fdfe0cd6a881d2bb29fe07 (diff) | |
download | glibc-b065a273b0da04e590eaf0a8c27b136a97d20107.tar glibc-b065a273b0da04e590eaf0a8c27b136a97d20107.tar.gz glibc-b065a273b0da04e590eaf0a8c27b136a97d20107.tar.bz2 glibc-b065a273b0da04e590eaf0a8c27b136a97d20107.zip |
Y2038: add function __utimes64
-rw-r--r-- | include/time.h | 3 | ||||
-rw-r--r-- | misc/Makefile | 2 | ||||
-rw-r--r-- | misc/utimes.c | 15 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/utimes64.c | 48 | ||||
-rw-r--r-- | time/Versions | 1 |
5 files changed, 68 insertions, 1 deletions
diff --git a/include/time.h b/include/time.h index 2bfba396fe..5ea0aa3303 100644 --- a/include/time.h +++ b/include/time.h @@ -50,6 +50,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 7ced1eac88..e30685093e 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -71,7 +71,7 @@ routines := brk sbrk sstk ioctl \ fgetxattr flistxattr fremovexattr fsetxattr getxattr \ listxattr lgetxattr llistxattr lremovexattr lsetxattr \ removexattr setxattr getauxval ifunc-impl-list makedev \ - allocate_once y2038-support + allocate_once y2038-support utimes64 generated += tst-error1.mtrace tst-error1-mem.out \ tst-allocate_once.mtrace tst-allocate_once-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..b17f9977e5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/utimes64.c @@ -0,0 +1,48 @@ +/* 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> +#include <fcntl.h> + +/* 64-bit-time variant */ + +int +__utimes64 (const char *file, const struct __timeval64 tvp[2]) +{ + struct timespec ts32[2], *tsp32 = NULL; + + if (tvp != NULL) + { + if (tvp[0].tv_sec > INT_MAX || tvp[1].tv_sec > INT_MAX) + { + __set_errno(EOVERFLOW); + return -1; + } + ts32[0].tv_sec = tvp[0].tv_sec; + ts32[0].tv_nsec = tvp[0].tv_usec * 1000; + ts32[1].tv_sec = tvp[1].tv_sec; + ts32[1].tv_nsec = tvp[1].tv_usec * 1000; + tsp32 = ts32; + } + + /* use utimensat rather than utimes which not all arches can use */ + return INLINE_SYSCALL (utimensat, 4, AT_FDCWD, file, tsp32, 0); +} diff --git a/time/Versions b/time/Versions index e8b63d25ae..c28dab69a1 100644 --- a/time/Versions +++ b/time/Versions @@ -84,5 +84,6 @@ libc { __settimeofday64; __time64; __stime64; + __utimes64; } } |