3762
|
1 /* acl.c - access control lists |
|
2 |
4517
|
3 Copyright (C) 2002, 2003 Free Software Foundation, Inc. |
3762
|
4 |
|
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 2, or (at your option) |
|
8 any later version. |
|
9 |
|
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. |
|
14 |
|
15 You should have received a copy of the GNU General Public License |
|
16 along with this program; if not, write to the Free Software Foundation, |
|
17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
18 |
|
19 Written by Paul Eggert. */ |
|
20 |
|
21 #if HAVE_CONFIG_H |
|
22 # include <config.h> |
|
23 #endif |
|
24 |
4517
|
25 #include <sys/types.h> |
3762
|
26 #include <sys/stat.h> |
|
27 #ifndef S_ISLNK |
|
28 # define S_ISLNK(Mode) 0 |
|
29 #endif |
|
30 |
|
31 #include "acl.h" |
|
32 |
|
33 #include <errno.h> |
|
34 #ifndef ENOSYS |
|
35 # define ENOSYS (-1) |
|
36 #endif |
|
37 |
|
38 #ifndef MIN_ACL_ENTRIES |
|
39 # define MIN_ACL_ENTRIES 4 |
|
40 #endif |
|
41 |
|
42 /* Return 1 if PATH has a nontrivial access control list, 0 if not, |
|
43 and -1 (setting errno) if an error is encountered. */ |
|
44 |
|
45 int |
|
46 file_has_acl (char const *path, struct stat const *pathstat) |
|
47 { |
|
48 /* FIXME: This implementation should work on recent-enough versions |
|
49 of HP-UX, Solaris, and Unixware, but it simply returns 0 with |
|
50 POSIX 1003.1e (draft 17 -- abandoned), AIX, GNU/Linux, Irix, and |
|
51 Tru64. Please see Samba's source/lib/sysacls.c file for |
|
52 fix-related ideas. */ |
|
53 |
|
54 #if HAVE_ACL && defined GETACLCNT |
|
55 if (! S_ISLNK (pathstat->st_mode)) |
|
56 { |
|
57 int n = acl (path, GETACLCNT, 0, NULL); |
|
58 return n < 0 ? (errno == ENOSYS ? 0 : -1) : (MIN_ACL_ENTRIES < n); |
|
59 } |
|
60 #endif |
|
61 |
|
62 return 0; |
|
63 } |