aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/src
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-05-10 14:04:21 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-05-10 14:04:21 +0100
commitf9a39467b6a282bc7fba47fd8cf1e44413e7508f (patch)
treeb0b5ace8f7cf34e0f069359df6dc21b5023946eb /libstdc++-v3/src
parent927d22fa017bb0bdfcb221e64f13b4e548f697aa (diff)
downloadgcc-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.cc12
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