diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-05-10 14:04:21 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-05-10 14:04:21 +0100 |
commit | f9a39467b6a282bc7fba47fd8cf1e44413e7508f (patch) | |
tree | b0b5ace8f7cf34e0f069359df6dc21b5023946eb /libstdc++-v3/src | |
parent | 927d22fa017bb0bdfcb221e64f13b4e548f697aa (diff) | |
download | gcc-f9a39467b6a282bc7fba47fd8cf1e44413e7508f.zip gcc-f9a39467b6a282bc7fba47fd8cf1e44413e7508f.tar.gz gcc-f9a39467b6a282bc7fba47fd8cf1e44413e7508f.tar.bz2 |
libstdc++/71036 Handle EEXIST in filesystem::create_directory
PR libstdc++/71036
* src/filesystem/ops.cc (create_dir): Handle EEXIST from mkdir.
* testsuite/experimental/filesystem/operations/create_directory.cc:
New test.
From-SVN: r236076
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/filesystem/ops.cc | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libstdc++-v3/src/filesystem/ops.cc b/libstdc++-v3/src/filesystem/ops.cc index e18c751..fab4235 100644 --- a/libstdc++-v3/src/filesystem/ops.cc +++ b/libstdc++-v3/src/filesystem/ops.cc @@ -660,22 +660,26 @@ namespace bool create_dir(const fs::path& p, fs::perms perm, std::error_code& ec) { + bool created = false; #ifdef _GLIBCXX_HAVE_SYS_STAT_H ::mode_t mode = static_cast<std::underlying_type_t<fs::perms>>(perm); if (::mkdir(p.c_str(), mode)) { - ec.assign(errno, std::generic_category()); - return false; + const int err = errno; + if (err != EEXIST || !is_directory(p)) + ec.assign(err, std::generic_category()); + else + ec.clear(); } else { ec.clear(); - return true; + created = true; } #else ec = std::make_error_code(std::errc::not_supported); - return false; #endif + return created; } } // namespace |