From cfef9c1ea79749cb3fc40b3ef869a29470c6073c Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 24 Oct 2016 17:45:40 +0100 Subject: [PATCH] Do not retry failed close(3) in filesystem::copy * src/filesystem/ops.cc (close_fd): Remove. (do_copy_file): Just use close(3) instead of close_fd, to prevent retrying on error. From-SVN: r241485 --- libstdc++-v3/ChangeLog | 4 ++++ libstdc++-v3/src/filesystem/ops.cc | 15 ++------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 112e941..577c88f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2016-10-24 Jonathan Wakely + * src/filesystem/ops.cc (close_fd): Remove. + (do_copy_file): Just use close(3) instead of close_fd, to prevent + retrying on error. + * src/filesystem/ops.cc (do_copy_file): Return an error if either source or destination is not a regular file. (copy): Update comment to refer to LWG 2681. Implement 2682 and 2683 diff --git a/libstdc++-v3/src/filesystem/ops.cc b/libstdc++-v3/src/filesystem/ops.cc index 6f76053..f8ba74e 100644 --- a/libstdc++-v3/src/filesystem/ops.cc +++ b/libstdc++-v3/src/filesystem/ops.cc @@ -308,17 +308,6 @@ namespace return fs::file_time_type{seconds{s} + ns}; } - // Returns true if the file descriptor was successfully closed, - // otherwise returns false and the reason will be in errno. - inline bool - close_fd(int fd) - { - while (::close(fd)) - if (errno != EINTR) - return false; - return true; - } - bool do_copy_file(const fs::path& from, const fs::path& to, fs::copy_options option, @@ -405,8 +394,8 @@ namespace } struct CloseFD { - ~CloseFD() { if (fd != -1) close_fd(fd); } - bool close() { return close_fd(std::exchange(fd, -1)); } + ~CloseFD() { if (fd != -1) ::close(fd); } + bool close() { return ::close(std::exchange(fd, -1)) == 0; } int fd; }; -- 2.7.4