]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/vfs/vfs.c
Merge master
[netatalk.git] / libatalk / vfs / vfs.c
index 0eaacfaee8af8fc5f6babb34709d2e7f7c8022f9..b33138bc26ab22efe1fbd4d795b9a1b467f18c3c 100644 (file)
@@ -505,6 +505,33 @@ static int validupath_ea(VFS_FUNC_ARGS_VALIDUPATH)
 /* ----------------- */
 static int RF_chown_ea(VFS_FUNC_ARGS_CHOWN)
 {
+    mode_t file_mode = ad_hf_mode(mode);
+    mode_t dir_mode = file_mode;
+    struct set_mode param;
+
+    if ((dir_mode & (S_IRUSR | S_IWUSR )))
+        dir_mode |= S_IXUSR;
+    if ((dir_mode & (S_IRGRP | S_IWGRP )))
+        dir_mode |= S_IXGRP;
+    if ((dir_mode & (S_IROTH | S_IWOTH )))
+        dir_mode |= S_IXOTH;
+
+       /* change folder */
+       dir_mode |= DIRBITS;
+    if (dir_rx_set(dir_mode)) {
+        if (chmod_acl( name,  dir_mode ) < 0)
+            return -1;
+    }
+    param.st = st;
+    param.mode = file_mode;
+    if (for_each_adouble("setfilmode_ads", name, ads_setfilmode_loop, &param, 0, v_umask) < 0)
+        return -1;
+
+    if (!dir_rx_set(dir_mode)) {
+        if (chmod_acl( name,  dir_mode ) < 0)
+            return -1;
+    }
+
     return 0;
 }