]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
enhance: Fall back to utimes(2) if utimensat(2) is unavailable
authorJoel Rosdahl <joel@rosdahl.net>
Sat, 2 Jul 2022 09:26:28 +0000 (11:26 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 20 Aug 2022 11:55:59 +0000 (13:55 +0200)
(cherry picked from commit d67f26e5168dc6c6dbb12b6ef55407af215218e8)

cmake/GenerateConfigurationFile.cmake
cmake/config.h.in
src/util/file.cpp

index f80258b0f7f9257a0889f693dc395e053d44c9f3..5d106ff9679825f32bc22d1dec953894eea89ca8 100644 (file)
@@ -37,6 +37,7 @@ set(functions
     syslog
     unsetenv
     utimensat
+    utimes
 )
 foreach(func IN ITEMS ${functions})
   string(TOUPPER ${func} func_var)
index bbc1397f536b52bbbb3cb1d96b6c86e1760e7bd1..e5cd5e7ba827538a9121fd863daf377a5c9be487 100644 (file)
 // Define if you have the "utimensat" function.
 #cmakedefine HAVE_UTIMENSAT
 
+// Define if you have the "utimes" function.
+#cmakedefine HAVE_UTIMES
+
 // Define if you have the "PTHREAD_MUTEX_ROBUST" constant.
 #cmakedefine HAVE_PTHREAD_MUTEX_ROBUST
 
index 722e2b28b17ff9a7aa056510104bd9e63aa9b405..c7484cdf3230383126260dfcfc0d7947c1453d4d 100644 (file)
@@ -26,6 +26,8 @@
 #ifdef HAVE_UTIMENSAT
 #  include <fcntl.h>
 #  include <sys/stat.h>
+#elif defined(HAVE_UTIMES)
+#  include <sys/time.h>
 #else
 #  include <sys/types.h>
 #  ifdef HAVE_UTIME_H
@@ -69,8 +71,16 @@ set_timestamps(const std::string& path,
     atime_mtime[0] = atime ? *atime : *mtime;
     atime_mtime[1] = *mtime;
   }
-  const timespec* const timespecs = mtime ? atime_mtime : nullptr;
-  utimensat(AT_FDCWD, path.c_str(), timespecs, 0);
+  utimensat(AT_FDCWD, path.c_str(), mtime ? atime_mtime : nullptr, 0);
+#elif defined(HAVE_UTIMES)
+  timeval atime_mtime[2];
+  if (mtime) {
+    atime_mtime[0].tv_sec = atime ? atime->tv_sec : mtime->tv_sec;
+    atime_mtime[0].tv_usec = (atime ? atime->tv_nsec : mtime->tv_nsec) / 1000;
+    atime_mtime[1].tv_sec = mtime->tv_sec;
+    atime_mtime[1].tv_usec = mtime->tv_nsec / 1000;
+  }
+  utimes(path.c_str(), mtime ? atime_mtime : nullptr);
 #else
   utimbuf atime_mtime;
   if (mtime) {