Commit 7195dfe9 by Jonathan Wakely Committed by Jonathan Wakely

Handle negative times in filesystem::last_write_time

	* src/filesystem/ops.cc
	(last_write_time(const path&, file_time_type, error_code&)): Handle
	negative times correctly.
	* testsuite/experimental/filesystem/operations/last_write_time.cc:
	Test writing file times.

From-SVN: r241522
parent ec04aad7
2016-10-25 Jonathan Wakely <jwakely@redhat.com> 2016-10-25 Jonathan Wakely <jwakely@redhat.com>
* src/filesystem/ops.cc
(last_write_time(const path&, file_time_type, error_code&)): Handle
negative times correctly.
* testsuite/experimental/filesystem/operations/last_write_time.cc:
Test writing file times.
* src/filesystem/ops.cc (do_copy_file): Report an error if source or * src/filesystem/ops.cc (do_copy_file): Report an error if source or
destination is not a regular file (LWG 2712). destination is not a regular file (LWG 2712).
(equivalent): Fix error handling and result when only one file exists. (equivalent): Fix error handling and result when only one file exists.
......
...@@ -1100,6 +1100,11 @@ fs::last_write_time(const path& p __attribute__((__unused__)), ...@@ -1100,6 +1100,11 @@ fs::last_write_time(const path& p __attribute__((__unused__)),
auto s = chrono::duration_cast<chrono::seconds>(d); auto s = chrono::duration_cast<chrono::seconds>(d);
#if _GLIBCXX_USE_UTIMENSAT #if _GLIBCXX_USE_UTIMENSAT
auto ns = chrono::duration_cast<chrono::nanoseconds>(d - s); auto ns = chrono::duration_cast<chrono::nanoseconds>(d - s);
if (ns < ns.zero()) // tv_nsec must be non-negative and less than 10e9.
{
--s;
ns += chrono::seconds(1);
}
struct ::timespec ts[2]; struct ::timespec ts[2];
ts[0].tv_sec = 0; ts[0].tv_sec = 0;
ts[0].tv_nsec = UTIME_OMIT; ts[0].tv_nsec = UTIME_OMIT;
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
void void
test01() test01()
{ {
// read times
using time_type = std::experimental::filesystem::file_time_type; using time_type = std::experimental::filesystem::file_time_type;
auto p = __gnu_test::nonexistent_path(); auto p = __gnu_test::nonexistent_path();
...@@ -103,8 +105,46 @@ test01() ...@@ -103,8 +105,46 @@ test01()
#endif #endif
} }
void
test02()
{
// write times
using time_type = std::experimental::filesystem::file_time_type;
__gnu_test::scoped_file f;
std::error_code ec;
time_type time;
time = last_write_time(f.path);
last_write_time(f.path, time, ec);
VERIFY( !ec );
VERIFY( last_write_time(f.path) == time );
time -= std::chrono::milliseconds(1000 * 60 * 10 + 15);
last_write_time(f.path, time, ec);
VERIFY( !ec );
VERIFY( last_write_time(f.path) == time );
time += std::chrono::milliseconds(1000 * 60 * 20 + 15);
last_write_time(f.path, time, ec);
VERIFY( !ec );
VERIFY( last_write_time(f.path) == time );
time = time_type();
last_write_time(f.path, time, ec);
VERIFY( !ec );
VERIFY( last_write_time(f.path) == time );
time -= std::chrono::milliseconds(1000 * 60 * 10 + 15);
last_write_time(f.path, time, ec);
VERIFY( !ec );
VERIFY( last_write_time(f.path) == time );
}
int int
main() main()
{ {
test01(); test01();
test02();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment