From 0067832fa6c7b190fc1e806f1cff6f4941a2270d Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Thu, 4 Aug 2022 20:01:40 +0200 Subject: enhance: Support Stat::{atim,ctim,mtim} on macOS (cherry picked from commit bcdaeb5c6082717bac984ab2ffafd0bdee552458) --- cmake/GenerateConfigurationFile.cmake | 6 ++++++ cmake/config.h.in | 9 +++++++++ src/InodeCache.cpp | 18 +----------------- src/Stat.hpp | 6 ++++++ unittest/test_Stat.cpp | 6 ++++++ 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/cmake/GenerateConfigurationFile.cmake b/cmake/GenerateConfigurationFile.cmake index 5d106ff9..8e2c2202 100644 --- a/cmake/GenerateConfigurationFile.cmake +++ b/cmake/GenerateConfigurationFile.cmake @@ -68,6 +68,12 @@ check_struct_has_member("struct stat" st_ctim sys/stat.h HAVE_STRUCT_STAT_ST_CTIM LANGUAGE CXX) check_struct_has_member("struct stat" st_mtim sys/stat.h HAVE_STRUCT_STAT_ST_MTIM LANGUAGE CXX) +check_struct_has_member("struct stat" st_atimespec sys/stat.h + HAVE_STRUCT_STAT_ST_ATIMESPEC LANGUAGE CXX) +check_struct_has_member("struct stat" st_ctimespec sys/stat.h + HAVE_STRUCT_STAT_ST_CTIMESPEC LANGUAGE CXX) +check_struct_has_member("struct stat" st_mtimespec sys/stat.h + HAVE_STRUCT_STAT_ST_MTIMESPEC LANGUAGE CXX) check_struct_has_member("struct statfs" f_fstypename sys/mount.h HAVE_STRUCT_STATFS_F_FSTYPENAME LANGUAGE CXX) diff --git a/cmake/config.h.in b/cmake/config.h.in index e5cd5e7b..f575c53f 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -124,6 +124,15 @@ // Define if "st_mtim" is a member of "struct stat". #cmakedefine HAVE_STRUCT_STAT_ST_MTIM +// Define if "st_atimespec" is a member of "struct stat". +#cmakedefine HAVE_STRUCT_STAT_ST_ATIMESPEC + +// Define if "st_ctimespec" is a member of "struct stat". +#cmakedefine HAVE_STRUCT_STAT_ST_CTIMESPEC + +// Define if "st_mtimespec" is a member of "struct stat". +#cmakedefine HAVE_STRUCT_STAT_ST_MTIMESPEC + // Define if you have the "syslog" function. #cmakedefine HAVE_SYSLOG diff --git a/src/InodeCache.cpp b/src/InodeCache.cpp index 15a33928..db411c35 100644 --- a/src/InodeCache.cpp +++ b/src/InodeCache.cpp @@ -90,17 +90,9 @@ struct InodeCache::Key dev_t st_dev; ino_t st_ino; mode_t st_mode; -#ifdef HAVE_STRUCT_STAT_ST_MTIM timespec st_mtim; -#else - time_t st_mtim; -#endif -#ifdef HAVE_STRUCT_STAT_ST_CTIM timespec st_ctim; // Included for sanity checking. -#else - time_t st_ctim; // Included for sanity checking. -#endif - off_t st_size; // Included for sanity checking. + off_t st_size; // Included for sanity checking. bool sloppy_time_macros; }; @@ -188,16 +180,8 @@ InodeCache::hash_inode(const std::string& path, key.st_dev = stat.device(); key.st_ino = stat.inode(); key.st_mode = stat.mode(); -#ifdef HAVE_STRUCT_STAT_ST_MTIM key.st_mtim = stat.mtim(); -#else - key.st_mtim = stat.mtime(); -#endif -#ifdef HAVE_STRUCT_STAT_ST_CTIM key.st_ctim = stat.ctim(); -#else - key.st_ctim = stat.ctime(); -#endif key.st_size = stat.size(); Hash hash; diff --git a/src/Stat.hpp b/src/Stat.hpp index 53aed648..e31a6b13 100644 --- a/src/Stat.hpp +++ b/src/Stat.hpp @@ -270,6 +270,8 @@ Stat::atim() const { #if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_ATIM) return m_stat.st_atim; +#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC) + return m_stat.st_atimespec; #else return {m_stat.st_atime, 0}; #endif @@ -280,6 +282,8 @@ Stat::ctim() const { #if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_CTIM) return m_stat.st_ctim; +#elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC) + return m_stat.st_ctimespec; #else return {m_stat.st_ctime, 0}; #endif @@ -290,6 +294,8 @@ Stat::mtim() const { #if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_MTIM) return m_stat.st_mtim; +#elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC) + return m_stat.st_mtimespec; #else return {m_stat.st_mtime, 0}; #endif diff --git a/unittest/test_Stat.cpp b/unittest/test_Stat.cpp index 3a3586e2..a6e41b33 100644 --- a/unittest/test_Stat.cpp +++ b/unittest/test_Stat.cpp @@ -284,6 +284,9 @@ TEST_CASE("Return values when file exists") # ifdef HAVE_STRUCT_STAT_ST_CTIM CHECK(stat.ctim().tv_sec == st.st_ctim.tv_sec); CHECK(stat.ctim().tv_nsec == st.st_ctim.tv_nsec); +# elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC) + CHECK(stat.ctim().tv_sec == st.st_ctimespec.tv_sec); + CHECK(stat.ctim().tv_nsec == st.st_ctimespec.tv_nsec); # else CHECK(stat.ctim().tv_sec == st.st_ctime); CHECK(stat.ctim().tv_nsec == 0); @@ -292,6 +295,9 @@ TEST_CASE("Return values when file exists") # ifdef HAVE_STRUCT_STAT_ST_MTIM CHECK(stat.mtim().tv_sec == st.st_mtim.tv_sec); CHECK(stat.mtim().tv_nsec == st.st_mtim.tv_nsec); +# elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC) + CHECK(stat.mtim().tv_sec == st.st_mtimespec.tv_sec); + CHECK(stat.mtim().tv_nsec == st.st_mtimespec.tv_nsec); # else CHECK(stat.mtim().tv_sec == st.st_mtime); CHECK(stat.mtim().tv_nsec == 0); -- cgit v1.2.1