Author: ericwf Date: Wed Jun 22 02:57:38 2016 New Revision: 273392 URL: http://llvm.org/viewvc/llvm-project?rev=273392&view=rev Log: Cleanup filesystem::permissions ever more.
Modified: libcxx/trunk/src/experimental/filesystem/operations.cpp Modified: libcxx/trunk/src/experimental/filesystem/operations.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/filesystem/operations.cpp?rev=273392&r1=273391&r2=273392&view=diff ============================================================================== --- libcxx/trunk/src/experimental/filesystem/operations.cpp (original) +++ libcxx/trunk/src/experimental/filesystem/operations.cpp Wed Jun 22 02:57:38 2016 @@ -597,30 +597,25 @@ void __permissions(const path& p, perms 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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits