Ondrej Vasik 393646
From b566edc2489a889d97416d2390be7796aa8cdbeb Mon Sep 17 00:00:00 2001
Ondrej Vasik 393646
From: Eric Blake <ebb9@byu.net>
Ondrej Vasik 393646
Date: Mon, 2 Jun 2008 15:08:14 -0600
Ondrej Vasik 393646
Subject: [PATCH] Provide futimens/utimensat fallbacks for older kernels.
Ondrej Vasik 393646
Ondrej Vasik 393646
* lib/utimens.c (gl_futimens) [HAVE_UTIMENSAT, HAVE_FUTIMENS]:
Ondrej Vasik 393646
Provide runtime fallback if kernel lacks support.
Ondrej Vasik 393646
Reported by Mike Frysinger.
Ondrej Vasik 393646
Ondrej Vasik 393646
Signed-off-by: Eric Blake <ebb9@byu.net>
Ondrej Vasik 393646
---
Ondrej Vasik 393646
 lib/utimens.c |   43 ++++++++++++++++++++++++++-----------------
Ondrej Vasik 393646
 1 file changed, 26 insertions(+), 17 deletions(-)
Ondrej Vasik 393646
Ondrej Vasik 393646
diff --git a/lib/utimens.c b/lib/utimens.c
Ondrej Vasik 393646
index 25bc965..134310b 100644
Ondrej Vasik 393646
--- a/lib/utimens.c
Ondrej Vasik 393646
+++ b/lib/utimens.c
Ondrej Vasik 393646
@@ -96,20 +96,30 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
Ondrej Vasik 393646
 #endif
Ondrej Vasik 393646
 
Ondrej Vasik 393646
   /* POSIX 200x added two interfaces to set file timestamps with
Ondrej Vasik 393646
-     nanosecond resolution.  */
Ondrej Vasik 393646
+     nanosecond resolution.  We provide a fallback for ENOSYS (for
Ondrej Vasik 393646
+     example, compiling against Linux 2.6.25 kernel headers and glibc
Ondrej Vasik 393646
+     2.7, but running on Linux 2.6.18 kernel).  */
Ondrej Vasik 393646
 #if HAVE_UTIMENSAT
Ondrej Vasik 393646
   if (fd < 0)
Ondrej Vasik 393646
-    return utimensat (AT_FDCWD, file, timespec, 0);
Ondrej Vasik 393646
+    {
Ondrej Vasik 393646
+      int result = utimensat (AT_FDCWD, file, timespec, 0);
Ondrej Vasik 393646
+      if (result == 0 || errno != ENOSYS)
Ondrej Vasik 393646
+        return result;
Ondrej Vasik 393646
+    }
Ondrej Vasik 393646
 #endif
Ondrej Vasik 393646
 #if HAVE_FUTIMENS
Ondrej Vasik 393646
-  return futimens (fd, timespec);
Ondrej Vasik 393646
-#else
Ondrej Vasik 393646
+  {
Ondrej Vasik 393646
+    int result = futimens (fd, timespec);
Ondrej Vasik 393646
+    if (result == 0 || errno != ENOSYS)
Ondrej Vasik 393646
+      return result;
Ondrej Vasik 393646
+  }
Ondrej Vasik 393646
+#endif
Ondrej Vasik 393646
 
Ondrej Vasik 393646
   /* The platform lacks an interface to set file timestamps with
Ondrej Vasik 393646
      nanosecond resolution, so do the best we can, discarding any
Ondrej Vasik 393646
      fractional part of the timestamp.  */
Ondrej Vasik 393646
   {
Ondrej Vasik 393646
-# if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
Ondrej Vasik 393646
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
Ondrej Vasik 393646
     struct timeval timeval[2];
Ondrej Vasik 393646
     struct timeval const *t;
Ondrej Vasik 393646
     if (timespec)
Ondrej Vasik 393646
@@ -125,9 +135,9 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
Ondrej Vasik 393646
 
Ondrej Vasik 393646
     if (fd < 0)
Ondrej Vasik 393646
       {
Ondrej Vasik 393646
-#  if HAVE_FUTIMESAT
Ondrej Vasik 393646
+# if HAVE_FUTIMESAT
Ondrej Vasik 393646
 	return futimesat (AT_FDCWD, file, t);
Ondrej Vasik 393646
-#  endif
Ondrej Vasik 393646
+# endif
Ondrej Vasik 393646
       }
Ondrej Vasik 393646
     else
Ondrej Vasik 393646
       {
Ondrej Vasik 393646
@@ -141,21 +151,21 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
Ondrej Vasik 393646
 	   worth optimizing, and who knows what other messed-up systems
Ondrej Vasik 393646
 	   are out there?  So play it safe and fall back on the code
Ondrej Vasik 393646
 	   below.  */
Ondrej Vasik 393646
-#  if HAVE_FUTIMESAT
Ondrej Vasik 393646
+# if HAVE_FUTIMESAT
Ondrej Vasik 393646
 	if (futimesat (fd, NULL, t) == 0)
Ondrej Vasik 393646
 	  return 0;
Ondrej Vasik 393646
-#  elif HAVE_FUTIMES
Ondrej Vasik 393646
+# elif HAVE_FUTIMES
Ondrej Vasik 393646
 	if (futimes (fd, t) == 0)
Ondrej Vasik 393646
 	  return 0;
Ondrej Vasik 393646
-#  endif
Ondrej Vasik 393646
+# endif
Ondrej Vasik 393646
       }
Ondrej Vasik 393646
-# endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
Ondrej Vasik 393646
+#endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
Ondrej Vasik 393646
 
Ondrej Vasik 393646
     if (!file)
Ondrej Vasik 393646
       {
Ondrej Vasik 393646
-# if ! (HAVE_FUTIMESAT || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
Ondrej Vasik 393646
+#if ! (HAVE_FUTIMESAT || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
Ondrej Vasik 393646
 	errno = ENOSYS;
Ondrej Vasik 393646
-# endif
Ondrej Vasik 393646
+#endif
Ondrej Vasik 393646
 
Ondrej Vasik 0e0613
 	/* Prefer EBADF to ENOSYS if both error numbers apply.  */
Ondrej Vasik 0e0613
 	if (errno == ENOSYS)
Ondrej Vasik 393646
@@ -170,9 +180,9 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
Ondrej Vasik 0e0613
 	return -1;
Ondrej Vasik 393646
       }
Ondrej Vasik 393646
 
Ondrej Vasik 393646
-# if HAVE_WORKING_UTIMES
Ondrej Vasik 393646
+#if HAVE_WORKING_UTIMES
Ondrej Vasik 393646
     return utimes (file, t);
Ondrej Vasik 393646
-# else
Ondrej Vasik 393646
+#else
Ondrej Vasik 393646
     {
Ondrej Vasik 393646
       struct utimbuf utimbuf;
Ondrej Vasik 393646
       struct utimbuf const *ut;
Ondrej Vasik 393646
@@ -187,9 +197,8 @@ gl_futimens (int fd ATTRIBUTE_UNUSED,
Ondrej Vasik 393646
 
Ondrej Vasik 393646
       return utime (file, ut);
Ondrej Vasik 393646
     }
Ondrej Vasik 393646
-# endif /* !HAVE_WORKING_UTIMES */
Ondrej Vasik 393646
+#endif /* !HAVE_WORKING_UTIMES */
Ondrej Vasik 393646
   }
Ondrej Vasik 393646
-#endif /* !HAVE_FUTIMENS */
Ondrej Vasik 393646
 }
Ondrej Vasik 393646
 
Ondrej Vasik 393646
 /* Set the access and modification time stamps of FILE to be
Ondrej Vasik 393646
-- 
Ondrej Vasik 393646
1.5.5.1