3762
|
1 /* acl.c - access control lists |
|
2 |
|
3 Copyright (C) 2002 Free Software Foundation, Inc. |
|
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 |
|
25 #include <sys/stat.h> |
|
26 #ifndef S_ISLNK |
|
27 # define S_ISLNK(Mode) 0 |
|
28 #endif |
|
29 |
|
30 #include "acl.h" |
|
31 |
|
32 #include <errno.h> |
|
33 #ifndef ENOSYS |
|
34 # define ENOSYS (-1) |
|
35 #endif |
|
36 |
|
37 #ifndef MIN_ACL_ENTRIES |
|
38 # define MIN_ACL_ENTRIES 4 |
|
39 #endif |
|
40 |
|
41 /* Return 1 if PATH has a nontrivial access control list, 0 if not, |
|
42 and -1 (setting errno) if an error is encountered. */ |
|
43 |
|
44 int |
|
45 file_has_acl (char const *path, struct stat const *pathstat) |
|
46 { |
|
47 /* FIXME: This implementation should work on recent-enough versions |
|
48 of HP-UX, Solaris, and Unixware, but it simply returns 0 with |
|
49 POSIX 1003.1e (draft 17 -- abandoned), AIX, GNU/Linux, Irix, and |
|
50 Tru64. Please see Samba's source/lib/sysacls.c file for |
|
51 fix-related ideas. */ |
|
52 |
|
53 #if HAVE_ACL && defined GETACLCNT |
|
54 if (! S_ISLNK (pathstat->st_mode)) |
|
55 { |
|
56 int n = acl (path, GETACLCNT, 0, NULL); |
|
57 return n < 0 ? (errno == ENOSYS ? 0 : -1) : (MIN_ACL_ENTRIES < n); |
|
58 } |
|
59 #endif |
|
60 |
|
61 return 0; |
|
62 } |