Cleanup filesystem::permissions ever more.

llvm-svn: 273392
This commit is contained in:
Eric Fiselier 2016-06-22 07:57:38 +00:00
parent c4f6eda006
commit e357c0ad3b
1 changed files with 14 additions and 19 deletions

View File

@ -597,30 +597,25 @@ void __permissions(const path& p, perms prms, std::error_code *ec)
const bool resolve_symlinks = !bool(perms::symlink_nofollow & prms);
const bool add_perms = bool(perms::add_perms & prms);
const bool remove_perms = bool(perms::remove_perms & prms);
_LIBCPP_ASSERT(!(add_perms && remove_perms),
"Both add_perms and remove_perms are set");
std::error_code m_ec;
file_status st = resolve_symlinks ? detail::posix_stat(p, &m_ec)
: detail::posix_lstat(p, &m_ec);
if (m_ec) return set_or_throw(m_ec, ec, "permissions", p);
// AT_SYMLINK_NOFOLLOW can only be used on symlinks, using it on a regular
// file will cause fchmodat to report an error on some systems.
const bool set_sym_perms = is_symlink(st) && !resolve_symlinks;
if ((resolve_symlinks && is_symlink(st)) && (add_perms || remove_perms)) {
st = detail::posix_stat(p, &m_ec);
bool set_sym_perms = false;
prms &= perms::mask;
if (!resolve_symlinks || (add_perms || remove_perms)) {
std::error_code m_ec;
file_status st = resolve_symlinks ? detail::posix_stat(p, &m_ec)
: detail::posix_lstat(p, &m_ec);
set_sym_perms = is_symlink(st);
if (m_ec) return set_or_throw(m_ec, ec, "permissions", p);
_LIBCPP_ASSERT(st.permissions() != perms::unknown,
"Permissions unexpectedly unknown");
if (add_perms)
prms |= st.permissions();
else if (remove_perms)
prms = st.permissions() & ~prms;
}
prms = prms & perms::mask;
if (add_perms)
prms |= st.permissions();
else if (remove_perms)
prms = st.permissions() & ~prms;
auto real_perms = detail::posix_convert_perms(prms);
const auto real_perms = detail::posix_convert_perms(prms);
# if defined(AT_SYMLINK_NOFOLLOW) && defined(AT_FDCWD)
const int flags = set_sym_perms ? AT_SYMLINK_NOFOLLOW : 0;