aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorLukasz Majewski <lukma@denx.de>2020-02-16 23:02:05 +0100
committerLukasz Majewski <lukma@denx.de>2020-03-09 10:26:46 +0100
commit1a5e12826c02bce330be3f3592c5405314495d66 (patch)
tree12e2cb238b2514baa8b110ff2cdbf6da8161c78b /sysdeps
parentf072671cf50262cea93cfdc6f8a92ffc8d698e53 (diff)
downloadglibc-1a5e12826c02bce330be3f3592c5405314495d66.tar
glibc-1a5e12826c02bce330be3f3592c5405314495d66.tar.gz
glibc-1a5e12826c02bce330be3f3592c5405314495d66.tar.bz2
glibc-1a5e12826c02bce330be3f3592c5405314495d66.zip
y2038: linux: Provide __lutimes64 implementation
This conversion patch for supporting 64 bit time for lutimes mostly differs from the work performed for futimes (when providing __futimes64) with adding the AT_SYMLINK_NOFOLLOW flag to utimensat. It also supports passing file name instead of file descriptor number, but this is not relevant for utimensat used to implement it. All the design and conversion decisions are exactly the same as for futimens conversion.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/unix/sysv/linux/lutimes.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/sysdeps/unix/sysv/linux/lutimes.c b/sysdeps/unix/sysv/linux/lutimes.c
index 59ab1f065a..778e4e61d8 100644
--- a/sysdeps/unix/sysv/linux/lutimes.c
+++ b/sysdeps/unix/sysv/linux/lutimes.c
@@ -20,25 +20,36 @@
#include <errno.h>
#include <fcntl.h>
#include <time.h>
-#include <sys/time.h>
-#include <sysdep.h>
+int
+__lutimes64 (const char *file, const struct __timeval64 tvp64[2])
+{
+ struct __timespec64 ts64[2];
+ if (tvp64 != NULL)
+ {
+ ts64[0] = timeval64_to_timespec64 (tvp64[0]);
+ ts64[1] = timeval64_to_timespec64 (tvp64[1]);
+ }
+
+ return __utimensat64_helper (AT_FDCWD, file, tvp64 ? &ts64[0] : NULL,
+ AT_SYMLINK_NOFOLLOW);
+}
+
+#if __TIMESIZE != 64
+libc_hidden_def (__lutimes64)
int
-lutimes (const char *file, const struct timeval tvp[2])
+__lutimes (const char *file, const struct timeval tvp[2])
{
- /* The system call espects timespec, not timeval. */
- struct timespec ts[2];
+ struct __timeval64 tv64[2];
+
if (tvp != NULL)
{
- if (tvp[0].tv_usec < 0 || tvp[0].tv_usec >= 1000000
- || tvp[1].tv_usec < 0 || tvp[1].tv_usec >= 1000000)
- return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-
- TIMEVAL_TO_TIMESPEC (&tvp[0], &ts[0]);
- TIMEVAL_TO_TIMESPEC (&tvp[1], &ts[1]);
+ tv64[0] = valid_timeval_to_timeval64 (tvp[0]);
+ tv64[1] = valid_timeval_to_timeval64 (tvp[1]);
}
- return INLINE_SYSCALL (utimensat, 4, AT_FDCWD, file, tvp ? ts : NULL,
- AT_SYMLINK_NOFOLLOW);
+ return __lutimes64 (file, tvp ? &tv64[0] : NULL);
}
+#endif
+weak_alias (__lutimes, lutimes)