From c3dcd03b1c12d7a7e80e573dd09168feb469b1e2 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 8 Jun 2008 16:52:23 +0200 Subject: [PATCH] Add support for Cygwin ACLs. --- ChangeLog | 8 ++++++++ lib/acl-internal.h | 8 ++++++++ lib/copy-acl.c | 6 +++--- lib/set-mode-acl.c | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8a464f74..9ff15ce1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-06-08 Bruno Haible + 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 + Fix bug with setuid modes in Solaris 10+ code. * lib/set-mode-acl.c (qset_acl): Call chmod_or_fchmod when acl_set succeeded, when the mode contains some special bits. diff --git a/lib/acl-internal.h b/lib/acl-internal.h index 0ecd22f7e..f629eeb1f 100644 --- a/lib/acl-internal.h +++ b/lib/acl-internal.h @@ -160,6 +160,14 @@ extern int acl_access_nontrivial (acl_t); # 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); diff --git a/lib/copy-acl.c b/lib/copy-acl.c index 34f02923a..d20fa04bb 100644 --- a/lib/copy-acl.c +++ b/lib/copy-acl.c @@ -330,8 +330,7 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name, 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 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name, 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. */ diff --git a/lib/set-mode-acl.c b/lib/set-mode-acl.c index 0a7fa73ce..b5b14ad4d 100644 --- a/lib/set-mode-acl.c +++ b/lib/set-mode-acl.c @@ -305,7 +305,7 @@ qset_acl (char const *name, int desc, mode_t mode) } } - 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. */ -- 2.11.0