Kaynağa Gözat

FileManager: Replicate permissions on directory copy (#1437)

When copying files, the original file permissions are applied to the
copy. However, this was not done with directories. This should do it.
angel 5 yıl önce
ebeveyn
işleme
238afd37cf

+ 9 - 2
Applications/FileManager/FileUtils.cpp

@@ -93,12 +93,12 @@ bool copy_file_or_directory(const String& src_path, const String& dst_path)
     }
 
     if (S_ISDIR(src_stat.st_mode)) {
-        return copy_directory(src_path, dst_path);
+        return copy_directory(src_path, dst_path, src_stat);
     }
     return copy_file(src_path, dst_path, src_stat, src_fd);
 }
 
-bool copy_directory(const String& src_path, const String& dst_path)
+bool copy_directory(const String& src_path, const String& dst_path, const struct stat& src_stat)
 {
     int rc = mkdir(dst_path.characters(), 0755);
     if (rc < 0) {
@@ -117,6 +117,13 @@ bool copy_directory(const String& src_path, const String& dst_path)
             return false;
         }
     }
+
+    auto my_umask = umask(0);
+    umask(my_umask);
+    rc = chmod(dst_path.characters(), src_stat.st_mode & ~my_umask);
+    if (rc < 0) {
+        return false;
+    }
     return true;
 }
 

+ 1 - 1
Applications/FileManager/FileUtils.h

@@ -34,6 +34,6 @@ int delete_directory(String directory, String& file_that_caused_error);
 bool copy_file_or_directory(const String& src_path, const String& dst_path);
 String get_duplicate_name(const String& path, int duplicate_count);
 bool copy_file(const String& src_path, const String& dst_path, const struct stat& src_stat, int src_fd);
-bool copy_directory(const String& src_path, const String& dst_path);
+bool copy_directory(const String& src_path, const String& dst_path, const struct stat& src_stat);
 
 }