fix problems with includes now that our previous linux/acl.h has gone away.
[xfstests-dev.git] / src / acl_test.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  * Test our various libacl functions.
35  * Use IRIX semantics or Linux semantics if pertinent.
36  */
37  
38 #include <errno.h>
39 #include <stdio.h>
40 #include <string.h>
41 #include <getopt.h>
42 #include <sys/acl.h>
43
44 char *prog;
45 int irixsemantics = 0;
46
47 void usage(void)
48 {
49     fprintf(stderr, "usage: %s\n"
50            "    -i - use irix semantics\n" 
51            ,prog);
52            
53 }
54
55 void
56 print_err(char *msg)
57 {
58     printf("%s: %s: %s\n", prog, msg, strerror(errno));
59 }
60
61 void
62 dump_ace(acl_entry_t ace)
63 {
64     printf("<tag:%d,id:%d,perm:%u>", 
65             ace->ae_tag, ace->ae_id, ace->ae_perm);
66 }
67
68 void
69 dump_acl(acl_t acl)
70 {
71     int i;
72     printf("ACL[n=%d]: ", acl->acl_cnt);
73     for (i=0;i<acl->acl_cnt;i++) {
74         acl_entry_t ace = &acl->acl_entry[i];
75         printf("%d: ", i);
76         dump_ace(ace);
77         printf(" ");
78     }
79     printf("\n");
80
81 }
82
83 void
84 dump_acl_by_entry(acl_t acl)
85 {
86     int sts, i;
87     acl_entry_t ace; 
88
89     printf("Get 1st entry on filled ACL\n");
90     sts = acl_get_entry(acl, ACL_FIRST_ENTRY, &ace);
91     printf("acl_get_entry -> %d\n", sts);
92     if (sts > 0) {
93         printf("1: "); dump_ace(ace); printf("\n");
94     }
95
96     for(i=2;i<=acl->acl_cnt+2;i++) {
97         printf("Get %dth entry on filled ACL\n", i);
98         sts = acl_get_entry(acl, ACL_NEXT_ENTRY, &ace);
99         printf("acl_get_entry -> %d\n", sts);
100         if (sts > 0) {
101             printf("%d: ",i); dump_ace(ace); printf("\n");
102         }
103     }
104 }
105
106 /*
107  * create a full acl with entries with known bogus values
108  */
109 acl_t
110 create_filled_acl(void)
111 {
112     acl_t acl;
113     int i;
114
115     acl = acl_init(ACL_MAX_ENTRIES);    
116
117     for(i=0;i<ACL_MAX_ENTRIES;i++) {
118         acl_entry_t ace = &acl->acl_entry[i];
119         ace->ae_tag = i;
120         ace->ae_id = i+1;
121         ace->ae_perm = i+2;
122         acl->acl_cnt++;
123     }
124     return acl;
125 }
126
127 void
128 test_acl_get_qualifier(void)
129 {
130     struct acl_entry ace;
131     uid_t *uidp;
132
133     printf("*** test out acl_get_qualifier ***\n");
134
135     /* simple ace */
136     ace.ae_tag = ACL_USER;
137     ace.ae_id = 1;
138     ace.ae_perm = 1;
139
140     /* make sure we can get uid and free it */
141     uidp = acl_get_qualifier(&ace); 
142     printf("uid = %d\n", *uidp);
143     acl_free(uidp);
144
145     /* change to another valid tag with a qualifier */
146     ace.ae_tag = ACL_GROUP;
147     uidp = acl_get_qualifier(&ace); 
148     printf("uid = %d\n", *uidp);
149     acl_free(uidp);
150
151     /* let's get some errors */
152
153     ace.ae_tag = ACL_USER_OBJ;
154     uidp = acl_get_qualifier(&ace); 
155     if (uidp == NULL)
156         printf("uidp is NULL: %s\n", strerror(errno));
157     else
158         printf("Error: uidp is NOT NULL\n");
159
160     uidp = acl_get_qualifier(NULL); 
161     if (uidp == NULL)
162         printf("uidp is NULL: %s\n", strerror(errno));
163     else
164         printf("Error: uidp is NOT NULL\n");
165 }
166
167 int
168 main(int argc, char **argv)
169 {
170         int c, i;
171         acl_t acl1, acl2, acl3;
172         acl_entry_t ace1;
173
174         prog = basename(argv[0]);
175
176         while ((c = getopt(argc, argv, "i")) != -1) {
177                 switch (c) {
178                 case 'i':
179                         irixsemantics = 1;
180                         break;
181                 case '?':
182                         usage();
183                         return 1;
184                 }
185         }
186
187         if (irixsemantics) {
188             acl_set_compat(ACL_COMPAT_IRIXGET);
189         }
190
191         /* ---------------------------------------------- */
192         printf("*** test out creating an ACL ***\n");
193
194         printf("Test acl_init(ACL_MAX_ENTRIES+1)\n");
195         acl1 = acl_init(ACL_MAX_ENTRIES+1);
196         if (acl1 == NULL) {
197             print_err("acl_init(max+1)");
198         }
199         printf("Test acl_init(-1)\n");
200         acl1 = acl_init(-1);
201         if (acl1 == NULL) {
202             print_err("acl_init(-1)");
203         }
204         printf("Test acl_init(0)\n");
205         acl1 = acl_init(0);
206         if (acl1 == NULL) {
207             print_err("acl_init(0)");
208         }
209
210         printf("Test acl_create_entry(NULL, ...)\n");
211         if (acl_create_entry(NULL, &ace1) == -1) {
212             print_err("acl_create_entry(NULL,ace1)");
213         }
214         printf("Test acl_create_entry(..., NULL)\n");
215         if (acl_create_entry(&acl1, NULL) == -1) {
216             print_err("acl_create_entry(NULL,ace1)");
217         }
218         printf("Test acl_create_entry(acl1, ace1)\n");
219         acl1 = NULL;
220         if (acl_create_entry(&acl1, &ace1) == -1) {
221             print_err("acl_create_entry(*null,ace1)");
222         }
223
224         acl_free(acl1);
225         acl1 = acl_init(0);
226         for (i=0;i<=ACL_MAX_ENTRIES+1;i++) {
227             printf("%d: creating ace\n", i);
228             if (acl_create_entry(&acl1, &ace1) == -1) {
229                 print_err("acl_create_entry");
230             }
231             dump_acl(acl1);
232         }
233
234         /* ---------------------------------------------- */
235         printf("*** test out getting ACEs ***\n");
236
237         dump_acl_by_entry(acl1);
238
239         printf("dump empty ACL\n");
240         acl2 = acl_init(0);
241         if (acl2 == NULL) {
242             print_err("acl_init(0)");
243         }
244         dump_acl_by_entry(acl2);
245
246         printf("fill an ACL with known bogus values\n");
247         acl3 = create_filled_acl();     
248         dump_acl_by_entry(acl3);
249
250         /* ---------------------------------------------- */
251         printf("*** test out ACL to text for empty ACL***\n");
252         {
253             char *text;
254             ssize_t len;
255             acl_t empty_acl = acl_init(0);
256             text = acl_to_text(empty_acl, NULL); 
257             printf("acl_to_text(empty_acl,NULL) -> \"%s\"\n", text); 
258             text = acl_to_text(empty_acl, &len); 
259             printf("acl_to_text(empty_acl,NULL) -> \"%s\", len = %u\n", text, len); 
260             text = acl_to_text(NULL, NULL); 
261             printf("acl_to_text(NULL,NULL) -> \"%s\"\n", text==NULL?"NULL":text); 
262         }
263         /* NOTE: Other tests will test out the text for ACLs with ACEs.
264          *       So don't have to test it here.
265          *       It is simplest to choose ids not in /etc/passwd /etc/group
266          *       which is done already in a script. 
267          */
268
269         test_acl_get_qualifier();
270
271         return 0;
272 }