|
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
|