1 /* Test whether a file has a nontrivial access control list.
3 Copyright (C) 2002, 2003, 2005, 2006, 2007 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. */
24 #include "acl-internal.h"
26 /* Return 1 if NAME has a nontrivial access control list, 0 if NAME
27 only has no or a base access control list, and -1 (setting errno)
28 on error. SB must be set to the stat buffer of FILE. */
31 file_has_acl (char const *name, struct stat const *sb)
33 if (! S_ISLNK (sb->st_mode))
35 #if USE_ACL && HAVE_ACL_TRIVIAL
37 /* Solaris 10, which also has NFSv4 and ZFS style ACLs. */
38 return acl_trivial (name);
40 #elif USE_ACL && HAVE_ACL && defined GETACLCNT
42 /* Solaris 2.5 through Solaris 9, and contemporaneous versions of
43 HP-UX and Unixware. */
44 int n = acl (name, GETACLCNT, 0, NULL);
45 return n < 0 ? (errno == ENOSYS ? 0 : -1) : (MIN_ACL_ENTRIES < n);
47 #elif USE_ACL && HAVE_ACL_GET_FILE && HAVE_ACL_FREE
49 /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
52 if (HAVE_ACL_EXTENDED_FILE)
53 ret = acl_extended_file (name);
56 acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
59 ret = (3 < acl_entries (acl));
61 if (ret == 0 && S_ISDIR (sb->st_mode))
63 acl = acl_get_file (name, ACL_TYPE_DEFAULT);
66 ret = (0 < acl_entries (acl));
77 return ACL_NOT_WELL_SUPPORTED (errno) ? 0 : -1;
82 /* FIXME: Add support for AIX, Irix, and Tru64. Please see Samba's
83 source/lib/sysacls.c file for fix-related ideas. */