- From 83b989ecee478be083db8dc0cc7a5387615bd3cb Mon Sep 17 00:00:00 2001
- From: Andrey Semashev <andrey.semashev@gmail.com>
- Date: Wed, 31 Jul 2019 16:28:05 +0300
- Subject: [PATCH] Added support for utimensat for better POSIX.1-2008
- compliance.
-
- POSIX.1-2008 marks utime as obsolete and replaces it with utimensat.
- uClibc-ng has an option for removing utime, including the corresponding
- header.
-
- Closes https://github.com/boostorg/filesystem/pull/115.
- ---
- libs/filesystem/src/operations.cpp | 24 ++++++++++++++++++++++--
- 1 file changed, 22 insertions(+), 2 deletions(-)
-
- diff --git a/src/operations.cpp b/src/operations.cpp
- index 9bba1cf7a..038109d35 100644
- --- a/libs/filesystem/src/operations.cpp
- +++ b/libs/filesystem/src/operations.cpp
- @@ -62,7 +62,7 @@
- #endif
-
- #ifndef _POSIX_PTHREAD_SEMANTICS
- -# define _POSIX_PTHREAD_SEMANTICS // Sun readdir_r()needs this
- +# define _POSIX_PTHREAD_SEMANTICS // Sun readdir_r() needs this
- #endif
-
- #include <boost/filesystem/operations.hpp>
- @@ -119,7 +119,9 @@ using std::wstring;
- # include <dirent.h>
- # include <unistd.h>
- # include <fcntl.h>
- -# include <utime.h>
- +# if _POSIX_C_SOURCE < 200809L
- +# include <utime.h>
- +# endif
- # include "limits.h"
-
- # else // BOOST_WINDOW_API
- @@ -1459,6 +1461,22 @@ namespace detail
- system::error_code* ec)
- {
- # ifdef BOOST_POSIX_API
- +# if _POSIX_C_SOURCE >= 200809L
- +
- + struct timespec times[2] = {};
- +
- + // Keep the last access time unchanged
- + times[0].tv_nsec = UTIME_OMIT;
- +
- + times[1].tv_sec = new_time;
- +
- + if (BOOST_UNLIKELY(::utimensat(AT_FDCWD, p.c_str(), times, 0) != 0))
- + {
- + error(BOOST_ERRNO, p, ec, "boost::filesystem::last_write_time");
- + return;
- + }
- +
- +# else // _POSIX_C_SOURCE >= 200809L
-
- struct stat path_stat;
- if (error(::stat(p.c_str(), &path_stat)!= 0,
- @@ -1470,6 +1488,8 @@ namespace detail
- error(::utime(p.c_str(), &buf)!= 0 ? BOOST_ERRNO : 0,
- p, ec, "boost::filesystem::last_write_time");
-
- +# endif // _POSIX_C_SOURCE >= 200809L
- +
- # else
-
- handle_wrapper hw(
|