diff options
Diffstat (limited to 'lib/set-permissions.c')
-rw-r--r-- | lib/set-permissions.c | 274 |
1 files changed, 137 insertions, 137 deletions
diff --git a/lib/set-permissions.c b/lib/set-permissions.c index b30841fca40..c1a4b82a0d0 100644 --- a/lib/set-permissions.c +++ b/lib/set-permissions.c @@ -1,10 +1,10 @@ /* Set permissions of a file. -*- coding: utf-8 -*- - Copyright (C) 2002-2003, 2005-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2003, 2005-2022 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -24,7 +24,7 @@ #include "acl-internal.h" #if USE_ACL -# if ! defined HAVE_ACL_FROM_MODE && defined HAVE_ACL_FROM_TEXT /* FreeBSD, IRIX, Tru64 */ +# if ! defined HAVE_ACL_FROM_MODE && defined HAVE_ACL_FROM_TEXT /* FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */ # if HAVE_ACL_GET_FILE && !HAVE_ACL_TYPE_EXTENDED static acl_t @@ -32,7 +32,7 @@ acl_from_mode (mode_t mode) { # if HAVE_ACL_FREE_TEXT /* Tru64 */ char acl_text[] = "u::---,g::---,o::---,"; -# else /* FreeBSD, IRIX */ +# else /* FreeBSD, IRIX, Cygwin >= 2.5 */ char acl_text[] = "u::---,g::---,o::---"; # endif @@ -51,7 +51,7 @@ acl_from_mode (mode_t mode) # endif # endif -# if HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */ +# if HAVE_FACL && defined GETACL /* Solaris, Cygwin < 2.5, not HP-UX */ static int set_acls_from_mode (const char *name, int desc, mode_t mode, bool *must_chmod) { @@ -229,14 +229,14 @@ set_acls_from_mode (const char *name, int desc, mode_t mode, bool *must_chmod) if (ret < 0 && errno != EINVAL && errno != ENOTSUP) { if (errno == ENOSYS) - { - *must_chmod = true; - return 0; - } + { + *must_chmod = true; + return 0; + } return -1; } if (ret == 0) - return 0; + return 0; } # endif @@ -256,18 +256,18 @@ set_acls_from_mode (const char *name, int desc, mode_t mode, bool *must_chmod) if (desc != -1) ret = facl (desc, SETACL, - sizeof (entries) / sizeof (aclent_t), entries); + sizeof (entries) / sizeof (aclent_t), entries); else ret = acl (name, SETACL, - sizeof (entries) / sizeof (aclent_t), entries); + sizeof (entries) / sizeof (aclent_t), entries); if (ret < 0) { - if (errno == ENOSYS || errno == EOPNOTSUPP) - { - *must_chmod = true; - return 0; - } - return -1; + if (errno == ENOSYS || errno == EOPNOTSUPP) + { + *must_chmod = true; + return 0; + } + return -1; } return 0; } @@ -483,15 +483,15 @@ context_acl_from_mode (struct permission_context *ctx) static int set_acls (struct permission_context *ctx, const char *name, int desc, - int from_mode, bool *must_chmod, bool *acls_set) + int from_mode, bool *must_chmod, bool *acls_set) { int ret = 0; # if HAVE_ACL_GET_FILE /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */ - /* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */ + /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */ # if !HAVE_ACL_TYPE_EXTENDED - /* Linux, FreeBSD, IRIX, Tru64 */ + /* Linux, FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */ # ifndef HAVE_ACL_FROM_TEXT # error Must have acl_from_text (see POSIX 1003.1e draft 17). @@ -503,53 +503,53 @@ set_acls (struct permission_context *ctx, const char *name, int desc, if (! ctx->acls_not_supported) { if (ret == 0 && from_mode) - { - if (ctx->acl) - acl_free (ctx->acl); - ctx->acl = acl_from_mode (ctx->mode); - if (ctx->acl == NULL) - ret = -1; - } + { + if (ctx->acl) + acl_free (ctx->acl); + ctx->acl = acl_from_mode (ctx->mode); + if (ctx->acl == NULL) + ret = -1; + } if (ret == 0 && ctx->acl) - { - if (HAVE_ACL_SET_FD && desc != -1) - ret = acl_set_fd (desc, ctx->acl); - else - ret = acl_set_file (name, ACL_TYPE_ACCESS, ctx->acl); - if (ret != 0) - { - if (! acl_errno_valid (errno)) - { - ctx->acls_not_supported = true; - if (from_mode || acl_access_nontrivial (ctx->acl) == 0) - ret = 0; - } - } - else - { - *acls_set = true; - if (S_ISDIR(ctx->mode)) - { - if (! from_mode && ctx->default_acl && - acl_default_nontrivial (ctx->default_acl)) - ret = acl_set_file (name, ACL_TYPE_DEFAULT, - ctx->default_acl); - else - ret = acl_delete_def_file (name); - } - } - } + { + if (HAVE_ACL_SET_FD && desc != -1) + ret = acl_set_fd (desc, ctx->acl); + else + ret = acl_set_file (name, ACL_TYPE_ACCESS, ctx->acl); + if (ret != 0) + { + if (! acl_errno_valid (errno)) + { + ctx->acls_not_supported = true; + if (from_mode || acl_access_nontrivial (ctx->acl) == 0) + ret = 0; + } + } + else + { + *acls_set = true; + if (S_ISDIR(ctx->mode)) + { + if (! from_mode && ctx->default_acl && + acl_default_nontrivial (ctx->default_acl)) + ret = acl_set_file (name, ACL_TYPE_DEFAULT, + ctx->default_acl); + else + ret = acl_delete_def_file (name); + } + } + } } -# if HAVE_ACL_TYPE_NFS4 /* FreeBSD */ +# if HAVE_ACL_TYPE_NFS4 /* FreeBSD */ /* File systems either support POSIX ACLs (for example, ufs) or NFS4 ACLs (for example, zfs). */ /* TODO: Implement setting ACLs once get_permissions() reads them. */ -# endif +# endif # else /* HAVE_ACL_TYPE_EXTENDED */ /* Mac OS X */ @@ -573,38 +573,38 @@ set_acls (struct permission_context *ctx, const char *name, int desc, /* Remove ACLs if the file has ACLs. */ if (HAVE_ACL_GET_FD && desc != -1) - acl = acl_get_fd (desc); + acl = acl_get_fd (desc); else - acl = acl_get_file (name, ACL_TYPE_EXTENDED); + acl = acl_get_file (name, ACL_TYPE_EXTENDED); if (acl) - { - acl_free (acl); - - acl = acl_init (0); - if (acl) - { - if (HAVE_ACL_SET_FD && desc != -1) - ret = acl_set_fd (desc, acl); - else - ret = acl_set_file (name, ACL_TYPE_EXTENDED, acl); - acl_free (acl); - } - else - ret = -1; - } + { + acl_free (acl); + + acl = acl_init (0); + if (acl) + { + if (HAVE_ACL_SET_FD && desc != -1) + ret = acl_set_fd (desc, acl); + else + ret = acl_set_file (name, ACL_TYPE_EXTENDED, acl); + acl_free (acl); + } + else + ret = -1; + } } else { if (HAVE_ACL_SET_FD && desc != -1) - ret = acl_set_fd (desc, ctx->acl); + ret = acl_set_fd (desc, ctx->acl); else - ret = acl_set_file (name, ACL_TYPE_EXTENDED, ctx->acl); + ret = acl_set_file (name, ACL_TYPE_EXTENDED, ctx->acl); if (ret != 0) - { - if (! acl_errno_valid (errno) - && ! acl_extended_nontrivial (ctx->acl)) - ret = 0; - } + { + if (! acl_errno_valid (errno) + && ! acl_extended_nontrivial (ctx->acl)) + ret = 0; + } } *acls_set = true; @@ -626,34 +626,34 @@ set_acls (struct permission_context *ctx, const char *name, int desc, if (ret == 0 && ctx->count) { if (desc != -1) - ret = facl (desc, SETACL, ctx->count, ctx->entries); + ret = facl (desc, SETACL, ctx->count, ctx->entries); else - ret = acl (name, SETACL, ctx->count, ctx->entries); + ret = acl (name, SETACL, ctx->count, ctx->entries); if (ret < 0) - { - if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) - && acl_nontrivial (ctx->count, ctx->entries) == 0) - ret = 0; - } + { + if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + && acl_nontrivial (ctx->count, ctx->entries) == 0) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # ifdef ACE_GETACL if (ret == 0 && ctx->ace_count) { if (desc != -1) - ret = facl (desc, ACE_SETACL, ctx->ace_count, ctx->ace_entries); + ret = facl (desc, ACE_SETACL, ctx->ace_count, ctx->ace_entries); else - ret = acl (name, ACE_SETACL, ctx->ace_count, ctx->ace_entries); + ret = acl (name, ACE_SETACL, ctx->ace_count, ctx->ace_entries); if (ret < 0) - { - if ((errno == ENOSYS || errno == EINVAL || errno == ENOTSUP) - && acl_ace_nontrivial (ctx->ace_count, ctx->ace_entries) == 0) - ret = 0; - } + { + if ((errno == ENOSYS || errno == EINVAL || errno == ENOTSUP) + && acl_ace_nontrivial (ctx->ace_count, ctx->ace_entries) == 0) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # endif @@ -665,17 +665,17 @@ set_acls (struct permission_context *ctx, const char *name, int desc, if (ret == 0 && ctx->count > 0) { if (desc != -1) - ret = fsetacl (desc, ctx->count, ctx->entries); + ret = fsetacl (desc, ctx->count, ctx->entries); else - ret = setacl (name, ctx->count, ctx->entries); + ret = setacl (name, ctx->count, ctx->entries); if (ret < 0) - { - if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) - && (from_mode || !acl_nontrivial (ctx->count, ctx->entries))) - ret = 0; - } + { + if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) + && (from_mode || !acl_nontrivial (ctx->count, ctx->entries))) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # if HAVE_ACLV_H @@ -686,13 +686,13 @@ set_acls (struct permission_context *ctx, const char *name, int desc, { ret = acl ((char *) name, ACL_SET, ctx->aclv_count, ctx->aclv_entries); if (ret < 0) - { - if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) - && (from_mode || !aclv_nontrivial (ctx->aclv_count, ctx->aclv_entries))) - ret = 0; - } + { + if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) + && (from_mode || !aclv_nontrivial (ctx->aclv_count, ctx->aclv_entries))) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # endif @@ -711,16 +711,16 @@ set_acls (struct permission_context *ctx, const char *name, int desc, if (ret == 0 && ctx->have_u) { if (desc != -1) - ret = fchacl (desc, &ctx->u.a, ctx->u.a.acl_len); + ret = fchacl (desc, &ctx->u.a, ctx->u.a.acl_len); else - ret = chacl ((char *) name, &ctx->u.a, ctx->u.a.acl_len); + ret = chacl ((char *) name, &ctx->u.a, ctx->u.a.acl_len); if (ret < 0) - { - if (errno == ENOSYS && from_mode) - ret = 0; - } + { + if (errno == ENOSYS && from_mode) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # elif HAVE_ACLSORT /* NonStop Kernel */ @@ -732,12 +732,12 @@ set_acls (struct permission_context *ctx, const char *name, int desc, { ret = acl ((char *) name, ACL_SET, ctx->count, ctx->entries); if (ret != 0) - { - if (!acl_nontrivial (ctx->count, ctx->entries)) - ret = 0; - } + { + if (!acl_nontrivial (ctx->count, ctx->entries)) + ret = 0; + } else - *acls_set = true; + *acls_set = true; } # else /* No ACLs */ @@ -775,7 +775,7 @@ chmod_or_fchmod (const char *name, int desc, mode_t mode) int set_permissions (struct permission_context *ctx, const char *name, int desc) { - bool acls_set _GL_UNUSED = false; + _GL_UNUSED bool acls_set = false; bool early_chmod; bool must_chmod = false; int ret = 0; @@ -805,7 +805,7 @@ set_permissions (struct permission_context *ctx, const char *name, int desc) { ret = chmod_or_fchmod (name, desc, ctx->mode); if (ret != 0) - return -1; + return -1; } #if USE_ACL @@ -815,18 +815,18 @@ set_permissions (struct permission_context *ctx, const char *name, int desc) int saved_errno = ret ? errno : 0; /* If we can't set an acl which we expect to be able to set, try setting - the permissions to ctx->mode. Due to possible inherited permissions, - we cannot simply chmod. */ + the permissions to ctx->mode. Due to possible inherited permissions, + we cannot simply chmod. */ ret = set_acls (ctx, name, desc, true, &must_chmod, &acls_set); if (! acls_set) - must_chmod = true; + must_chmod = true; if (saved_errno) - { - errno = saved_errno; - ret = -1; - } + { + errno = saved_errno; + ret = -1; + } } #endif @@ -837,10 +837,10 @@ set_permissions (struct permission_context *ctx, const char *name, int desc) ret = chmod_or_fchmod (name, desc, ctx->mode); if (saved_errno) - { - errno = saved_errno; - ret = -1; - } + { + errno = saved_errno; + ret = -1; + } } return ret; |