+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.
# 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);
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
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. */
}
}
- 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. */