1 /* Internal implementation of access control lists.
3 Copyright (C) 2002-2003, 2005-2008 Free Software Foundation, Inc.
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 Written by Paul Eggert and Andreas Gruenbacher. */
25 /* All systems define the ACL related API in <sys/acl.h>. */
29 #if defined HAVE_ACL && ! defined GETACLCNT && defined ACL_CNT
30 # define GETACLCNT ACL_CNT
33 /* On Linux, additional ACL related API is available in <acl/libacl.h>. */
34 #ifdef HAVE_ACL_LIBACL_H
35 # include <acl/libacl.h>
50 #define _(msgid) gettext (msgid)
53 # define HAVE_FCHMOD false
54 # define fchmod(fd, mode) (-1)
60 # if HAVE_ACL_GET_FILE
61 /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
62 /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
64 # ifndef MIN_ACL_ENTRIES
65 # define MIN_ACL_ENTRIES 4
68 /* POSIX 1003.1e (draft 17) */
69 # ifdef HAVE_ACL_GET_FD
70 /* Most platforms have a 1-argument acl_get_fd, only OSF/1 has a 2-argument
72 # if HAVE_ACL_FREE_TEXT /* OSF/1 */
74 rpl_acl_get_fd (int fd)
76 return acl_get_fd (fd, ACL_TYPE_ACCESS);
79 # define acl_get_fd rpl_acl_get_fd
82 # define HAVE_ACL_GET_FD false
84 # define acl_get_fd(fd) (NULL)
87 /* POSIX 1003.1e (draft 17) */
88 # ifdef HAVE_ACL_SET_FD
89 /* Most platforms have a 2-argument acl_set_fd, only OSF/1 has a 3-argument
91 # if HAVE_ACL_FREE_TEXT /* OSF/1 */
93 rpl_acl_set_fd (int fd, acl_t acl)
95 return acl_set_fd (fd, ACL_TYPE_ACCESS, acl);
98 # define acl_set_fd rpl_acl_set_fd
101 # define HAVE_ACL_SET_FD false
103 # define acl_set_fd(fd, acl) (-1)
106 /* POSIX 1003.1e (draft 13) */
107 # if ! HAVE_ACL_FREE_TEXT
108 # define acl_free_text(buf) acl_free (buf)
112 # ifndef HAVE_ACL_EXTENDED_FILE
113 # define HAVE_ACL_EXTENDED_FILE false
114 # define acl_extended_file(name) (-1)
118 # ifndef HAVE_ACL_FROM_MODE
119 # define HAVE_ACL_FROM_MODE false
120 # define acl_from_mode(mode) (NULL)
123 /* Set to 1 if a file's mode is implicit by the ACL.
124 Set to 0 if a file's mode is stored independently from the ACL. */
125 # if HAVE_ACL_COPY_EXT_NATIVE && HAVE_ACL_CREATE_ENTRY_NP /* MacOS X */
126 # define MODE_INSIDE_ACL 0
128 # define MODE_INSIDE_ACL 1
131 # if defined __APPLE__ && defined __MACH__ /* MacOS X */
132 # define ACL_NOT_WELL_SUPPORTED(Err) \
133 ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY || (Err) == ENOENT)
135 # define ACL_NOT_WELL_SUPPORTED(Err) \
136 ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY)
139 /* Define a replacement for acl_entries if needed. (Only Linux has it.) */
140 # if !HAVE_ACL_ENTRIES
141 # define acl_entries rpl_acl_entries
142 extern int acl_entries (acl_t);