From: Albert ARIBAUD (3ADEV) Date: Thu, 7 Sep 2017 22:41:57 +0000 (+0200) Subject: Y2038: add function __utimes64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b065a273b0da04e590eaf0a8c27b136a97d20107;p=thirdparty%2Fglibc.git Y2038: add function __utimes64 --- diff --git a/include/time.h b/include/time.h index 2bfba396fe8..5ea0aa33031 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 7ced1eac88e..e30685093ea 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 0ae69461429..cdb43f6688a 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 00000000000..b17f9977e5f --- /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 + . */ + +#include +#include +#include +#include +#include +#include + +/* 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 e8b63d25aec..c28dab69a15 100644 --- a/time/Versions +++ b/time/Versions @@ -84,5 +84,6 @@ libc { __settimeofday64; __time64; __stime64; + __utimes64; } }