From: Joel Rosdahl Date: Sat, 2 Jul 2022 09:26:28 +0000 (+0200) Subject: enhance: Fall back to utimes(2) if utimensat(2) is unavailable X-Git-Tag: v4.6.2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97bdbd49c51e1587e9b257827f6d5d2b3733636f;p=thirdparty%2Fccache.git enhance: Fall back to utimes(2) if utimensat(2) is unavailable (cherry picked from commit d67f26e5168dc6c6dbb12b6ef55407af215218e8) --- diff --git a/cmake/GenerateConfigurationFile.cmake b/cmake/GenerateConfigurationFile.cmake index f80258b0f..5d106ff96 100644 --- a/cmake/GenerateConfigurationFile.cmake +++ b/cmake/GenerateConfigurationFile.cmake @@ -37,6 +37,7 @@ set(functions syslog unsetenv utimensat + utimes ) foreach(func IN ITEMS ${functions}) string(TOUPPER ${func} func_var) diff --git a/cmake/config.h.in b/cmake/config.h.in index bbc1397f5..e5cd5e7ba 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -175,6 +175,9 @@ // 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 diff --git a/src/util/file.cpp b/src/util/file.cpp index 722e2b28b..c7484cdf3 100644 --- a/src/util/file.cpp +++ b/src/util/file.cpp @@ -26,6 +26,8 @@ #ifdef HAVE_UTIMENSAT # include # include +#elif defined(HAVE_UTIMES) +# include #else # include # 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) {