changeset 10181:5282ccc922b9

Add support for Cygwin ACLs.
author Bruno Haible <bruno@clisp.org>
date Sun, 08 Jun 2008 16:52:23 +0200
parents 9f98a7fc375c
children 4a177f4b083f
files ChangeLog lib/acl-internal.h lib/copy-acl.c lib/set-mode-acl.c
diffstat 4 files changed, 20 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-06-08  Bruno Haible  <bruno@clisp.org>
+
+	Add support for Cygwin ACLs.
+	* lib/acl-internal.h (MODE_INSIDE_ACL): New macro for Solaris-like API.
+	* lib/set-mode-acl.c (qset_acl) [!MODE_INSIDE_ACL]: Don't optimize away
+	the chmod_or_fchmod call.
+	* lib/copy-acl.c (qcopy_acl) [!MODE_INSIDE_ACL]: Likewise.
+
 2008-06-08  Bruno Haible  <bruno@clisp.org>
 
 	Fix bug with setuid modes in Solaris 10+ code.
--- a/lib/acl-internal.h
+++ b/lib/acl-internal.h
@@ -160,6 +160,14 @@
 
 # elif HAVE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
 
+/* Set to 1 if a file's mode is implicit by the ACL.
+   Set to 0 if a file's mode is stored independently from the ACL.  */
+#  if defined __CYGWIN__ /* Cygwin */
+#   define MODE_INSIDE_ACL 0
+#  else /* Solaris */
+#   define MODE_INSIDE_ACL 1
+#  endif
+
 /* Return 1 if the given ACL is non-trivial.
    Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.  */
 extern int acl_nontrivial (int count, aclent_t *entries);
--- a/lib/copy-acl.c
+++ b/lib/copy-acl.c
@@ -330,8 +330,7 @@
     if (count == 0)
       return qset_acl (dst_name, dest_desc, mode);
 
-  did_chmod = 0; /* set to 1 once the mode bits in 0777 have been set,
-		    set to 2 once the mode bits other than 0777 have been set */
+  did_chmod = 0; /* set to 1 once the mode bits in 0777 have been set */
   saved_errno = 0; /* the first non-ignorable error code */
 
   /* If both ace_entries and entries are available, try SETACL before
@@ -371,7 +370,8 @@
   free (ace_entries);
 #  endif
 
-  if (did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0))
+  if (!MODE_INSIDE_ACL
+      || did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0))
     {
       /* We did not call chmod so far, and either the mode and the ACL are
 	 separate or special bits are to be set which don't fit into ACLs.  */
--- a/lib/set-mode-acl.c
+++ b/lib/set-mode-acl.c
@@ -305,7 +305,7 @@
       }
   }
   
-  if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+  if (!MODE_INSIDE_ACL || (mode & (S_ISUID | S_ISGID | S_ISVTX)))
     {
       /* We did not call chmod so far, so the special bits have not yet
          been set.  */