[2/3] y2038: linux: Provide __lutimes64 implementation

Message ID 20200217131735.18180-3-lukma@denx.de
State Committed
Headers

Commit Message

Lukasz Majewski Feb. 17, 2020, 1:17 p.m. UTC
  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.
---
 include/time.h                    |  3 +++
 sysdeps/unix/sysv/linux/lutimes.c | 37 ++++++++++++++++++++-----------
 2 files changed, 27 insertions(+), 13 deletions(-)
  

Comments

Lukasz Majewski Feb. 28, 2020, 5:06 p.m. UTC | #1
Dear All,

> 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.
> ---
>  include/time.h                    |  3 +++
>  sysdeps/unix/sysv/linux/lutimes.c | 37
> ++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13
> deletions(-)
> 
> diff --git a/include/time.h b/include/time.h
> index c24066bf3a..685075f095 100644
> --- a/include/time.h
> +++ b/include/time.h
> @@ -211,10 +211,13 @@ libc_hidden_proto (__utimensat64_helper);
>  
>  #if __TIMESIZE == 64
>  # define __futimes64 __futimes
> +# define __lutimes64 __lutimes
>  # define __futimens64 __futimens
>  #else
>  extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]);
>  libc_hidden_proto (__futimes64);
> +extern int __lutimes64 (const char *file, const struct __timeval64
> tvp64[2]); +libc_hidden_proto (__lutimes64);
>  extern int __futimens64 (int fd, const struct __timespec64 tsp[2]);
>  libc_hidden_proto (__futimens64);
>  #endif
> 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)

Gentle ping on this patch.

Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
  
Andreas Schwab March 2, 2020, 5:05 p.m. UTC | #2
Ok.

Andreas.
  

Patch

diff --git a/include/time.h b/include/time.h
index c24066bf3a..685075f095 100644
--- a/include/time.h
+++ b/include/time.h
@@ -211,10 +211,13 @@  libc_hidden_proto (__utimensat64_helper);
 
 #if __TIMESIZE == 64
 # define __futimes64 __futimes
+# define __lutimes64 __lutimes
 # define __futimens64 __futimens
 #else
 extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]);
 libc_hidden_proto (__futimes64);
+extern int __lutimes64 (const char *file, const struct __timeval64 tvp64[2]);
+libc_hidden_proto (__lutimes64);
 extern int __futimens64 (int fd, const struct __timespec64 tsp[2]);
 libc_hidden_proto (__futimens64);
 #endif
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)