fix problems with includes now that our previous linux/acl.h has gone away.
[xfstests-dev.git] / src / acl_get.c
1 /*
2  * Copyright (c) 2001 Silicon Graphics, Inc.  All Rights Reserved.
3  * 
4  * This prog is free software; you can redistribute it and/or modify it
5  * under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  * 
8  * This prog is distributed in the hope that it would be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * 
12  * Further, this software is distributed without any warranty that it is
13  * free of the rightful claim of any third person regarding infringement
14  * or the like.  Any license provided herein, whether implied or
15  * otherwise, applies only to this software file.  Patent licenses, if
16  * any, provided herein do not apply to combinations of this prog with
17  * other software, or any other product whatsoever.
18  * 
19  * You should have received a copy of the GNU General Public License along
20  * with this prog; if not, write the Free Software Foundation, Inc., 59
21  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22  * 
23  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24  * Mountain View, CA  94043, or:
25  * 
26  * http://www.sgi.com 
27  * 
28  * For further information regarding this notice, see: 
29  * 
30  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31  */
32
33 /*
34  * Get an access or default acl on a file
35  * using IRIX semantics or Linux semantics
36  */
37  
38 #include <errno.h>
39 #include <fcntl.h>
40 #include <stdio.h>
41 #include <string.h>
42 #include <getopt.h>
43 #include <sys/types.h>
44 #include <sys/stat.h>
45 #include <sys/acl.h>
46
47 char *prog;
48
49 void usage(void)
50 {
51     fprintf(stderr, "usage: %s [-a] [-d] [-f] [-i] path\n"
52            "flags:\n"
53            "    -a - get access ACL\n"
54            "    -d - get default ACL\n" 
55            "    -f - get access ACL using file descriptor\n" 
56            "    -i - use irix semantics\n" 
57            ,prog);
58            
59 }
60
61
62
63 int
64 main(int argc, char **argv)
65 {
66         int c;
67         char *file;
68         int getaccess = 0;
69         int getdefault = 0;
70         int irixsemantics = 0;
71         int usefd = 0;
72         int fd = -1;
73         acl_t acl;
74         char *buf_acl;
75
76         prog = basename(argv[0]);
77
78         while ((c = getopt(argc, argv, "adif")) != -1) {
79                 switch (c) {
80                 case 'a':
81                         getaccess = 1;
82                         break;
83                 case 'd':
84                         getdefault = 1;
85                         break;
86                 case 'i':
87                         irixsemantics = 1;
88                         break;
89                 case 'f':
90                         usefd = 1;
91                         break;
92                 case '?':
93                         usage();
94                         return 1;
95                 }
96         }
97
98         if (getdefault && usefd) {
99             fprintf(stderr, "%s: -f and -d are not compatible\n", prog);
100             return 1;
101         }
102
103         /* need path */
104         if (optind == argc) {
105             usage();
106             exit(1);
107         }
108         else {
109             file = argv[optind];
110         } 
111
112         if (irixsemantics) {
113             acl_set_compat(ACL_COMPAT_IRIXGET);
114         }
115
116         if (usefd) {
117             fd = open(file, O_RDONLY);
118             if (fd < 0) {
119                 fprintf (stderr, "%s: error opening \"%s\": %s\n",
120                              prog, file, strerror(errno));
121                 usage(); 
122                 return 1;
123
124             }   
125         }
126
127         if (getaccess) {
128             if (usefd) { 
129                 acl = acl_get_fd(fd);
130             }
131             else {
132                 acl = acl_get_file(file, ACL_TYPE_ACCESS);
133             }
134             if (acl == NULL) {
135                 fprintf (stderr, "%s: error getting access ACL on \"%s\": %s\n",
136                              prog, file, strerror(errno));
137                 return 0;
138             }
139             if (irixsemantics && acl->acl_cnt == ACL_NOT_PRESENT) {
140                 buf_acl = strdup("irix-empty");
141             }
142             else {      
143                 buf_acl = acl_to_short_text (acl, (ssize_t *) NULL);
144                 if (buf_acl == NULL) {
145                     fprintf (stderr, "%s: error converting ACL to short text "
146                                      "for file \"%s\": %s\n",
147                                  prog, file, strerror(errno));
148                     return 0;
149                 }
150             }
151             printf("%s: access %s\n", file, buf_acl);
152             acl_free(acl);
153             acl_free(buf_acl);  
154         }
155
156         if (getdefault) {
157             acl = acl_get_file(file, ACL_TYPE_DEFAULT);
158             if (acl == NULL) {
159                 fprintf (stderr, "%s: error getting default ACL on \"%s\": %s\n",
160                              prog, file, strerror(errno));
161                 return 0;
162             }
163             if (irixsemantics && acl->acl_cnt == ACL_NOT_PRESENT) {
164                 buf_acl = strdup("irix-empty");
165             }
166             else if (!irixsemantics && acl->acl_cnt == 0) {
167                 buf_acl = strdup("linux-empty");
168             }
169             else {      
170                 buf_acl = acl_to_short_text (acl, (ssize_t *) NULL);
171                 if (buf_acl == NULL) {
172                     fprintf (stderr, "%s: error converting ACL to short text "
173                                      "for file \"%s\": %s\n",
174                                  prog, file, strerror(errno));
175                     return 0;
176                 }
177             }
178             printf("%s: default %s\n", file, buf_acl);
179             acl_free(acl);
180             acl_free(buf_acl);
181         }
182
183         return 0;
184 }