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
This commit is contained in:
Jonathan Wakely 2016-10-24 17:45:40 +01:00 committed by Jonathan Wakely
parent b3dec9e57e
commit cfef9c1ea7
2 changed files with 6 additions and 13 deletions

View File

@ -1,5 +1,9 @@
2016-10-24 Jonathan Wakely <jwakely@redhat.com>
* 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

View File

@ -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;
};