1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1993-1997 by Sun Microsystems, Inc.
24 * All rights reserved
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28 /* LINTLIBRARY */
29
30 /*
31 * Convert ACL to/from permission bits
32 */
33
34 #include <errno.h>
35 #include <sys/acl.h>
36
37 int
acltomode(aclent_t * aclbufp,int nentries,mode_t * modep)38 acltomode(aclent_t *aclbufp, int nentries, mode_t *modep)
39 {
40 aclent_t *tp;
41 unsigned long mode;
42 unsigned long grpmode;
43 unsigned long mask;
44 int which;
45 int got_mask = 0;
46
47 *modep = 0;
48 if (aclcheck(aclbufp, nentries, &which) != 0) {
49 errno = EINVAL;
50 return (-1); /* errno is set in aclcheck() */
51 }
52 for (tp = aclbufp; nentries--; tp++) {
53 if (tp->a_type == USER_OBJ) {
54 mode = tp->a_perm;
55 if (mode > 07)
56 return (-1);
57 *modep |= (mode << 6);
58 continue;
59 }
60 if (tp->a_type == GROUP_OBJ) {
61 grpmode = tp->a_perm;
62 if (grpmode > 07)
63 return (-1);
64 continue;
65 }
66 if (tp->a_type == CLASS_OBJ) {
67 got_mask = 1;
68 mask = tp->a_perm;
69 if (mask > 07)
70 return (-1);
71 *modep |= (mask << 3);
72 continue;
73 }
74 if (tp->a_type == OTHER_OBJ) {
75 mode = tp->a_perm;
76 if (mode > 07)
77 return (-1);
78 *modep |= mode;
79 continue; /* we may break here if it is sorted */
80 }
81 }
82 if (!got_mask)
83 *modep |= (grpmode << 3);
84 return (0);
85 }
86
87
88 int
aclfrommode(aclent_t * aclbufp,int nentries,mode_t * modep)89 aclfrommode(aclent_t *aclbufp, int nentries, mode_t *modep)
90 {
91 aclent_t *tp;
92 aclent_t *savp;
93 mode_t mode;
94 mode_t grpmode;
95 int which;
96 int got_mask = 0;
97
98 if (aclcheck(aclbufp, nentries, &which) != 0) {
99 errno = EINVAL;
100 return (-1); /* errno is set in aclcheck() */
101 }
102 for (tp = aclbufp; nentries--; tp++) {
103 if (tp->a_type == USER_OBJ) {
104 mode = (*modep & 0700);
105 tp->a_perm = (mode >> 6);
106 continue;
107 }
108 if (tp->a_type == GROUP_OBJ) {
109 grpmode = (*modep & 070);
110 savp = tp;
111 continue;
112 }
113 if (tp->a_type == CLASS_OBJ) {
114 got_mask = 1;
115 mode = (*modep & 070);
116 tp->a_perm = (mode >> 3);
117 continue;
118 }
119 if (tp->a_type == OTHER_OBJ) {
120 mode = (*modep & 07);
121 tp->a_perm = (o_mode_t)mode;
122 continue; /* we may break here if it is sorted */
123 }
124 }
125 if (!got_mask)
126 savp->a_perm = (grpmode >> 3);
127 return (0);
128 }
129