[libcxx] r273392 - Cleanup filesystem::permissions ever more.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 22 00:57:39 PDT 2016


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;




More information about the cfe-commits mailing list