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 /* LINTLIBRARY */
28
29 /*
30 * Convert ACL to/from permission bits
31 */
32
33 #include <errno.h>
34 #include <sys/acl.h>
35
36 int
acltomode(aclent_t * aclbufp,int nentries,mode_t * modep)37 acltomode(aclent_t *aclbufp, int nentries, mode_t *modep)
38 {
39 aclent_t *tp;
40 unsigned long mode;
41 unsigned long grpmode;
42 unsigned long mask;
43 int which;
44 int got_mask = 0;
45
46 *modep = 0;
47 if (aclcheck(aclbufp, nentries, &which) != 0) {
48 errno = EINVAL;
49 return (-1); /* errno is set in aclcheck() */
50 }
51 for (tp = aclbufp; nentries--; tp++) {
52 if (tp->a_type == USER_OBJ) {
53 mode = tp->a_perm;
54 if (mode > 07)
55 return (-1);
56 *modep |= (mode << 6);
57 continue;
58 }
59 if (tp->a_type == GROUP_OBJ) {
60 grpmode = tp->a_perm;
61 if (grpmode > 07)
62 return (-1);
63 continue;
64 }
65 if (tp->a_type == CLASS_OBJ) {
66 got_mask = 1;
67 mask = tp->a_perm;
68 if (mask > 07)
69 return (-1);
70 *modep |= (mask << 3);
71 continue;
72 }
73 if (tp->a_type == OTHER_OBJ) {
74 mode = tp->a_perm;
75 if (mode > 07)
76 return (-1);
77 *modep |= mode;
78 continue; /* we may break here if it is sorted */
79 }
80 }
81 if (!got_mask)
82 *modep |= (grpmode << 3);
83 return (0);
84 }
85
86
87 int
aclfrommode(aclent_t * aclbufp,int nentries,mode_t * modep)88 aclfrommode(aclent_t *aclbufp, int nentries, mode_t *modep)
89 {
90 aclent_t *tp;
91 aclent_t *savp;
92 mode_t mode;
93 mode_t grpmode;
94 int which;
95 int got_mask = 0;
96
97 if (aclcheck(aclbufp, nentries, &which) != 0) {
98 errno = EINVAL;
99 return (-1); /* errno is set in aclcheck() */
100 }
101 for (tp = aclbufp; nentries--; tp++) {
102 if (tp->a_type == USER_OBJ) {
103 mode = (*modep & 0700);
104 tp->a_perm = (mode >> 6);
105 continue;
106 }
107 if (tp->a_type == GROUP_OBJ) {
108 grpmode = (*modep & 070);
109 savp = tp;
110 continue;
111 }
112 if (tp->a_type == CLASS_OBJ) {
113 got_mask = 1;
114 mode = (*modep & 070);
115 tp->a_perm = (mode >> 3);
116 continue;
117 }
118 if (tp->a_type == OTHER_OBJ) {
119 mode = (*modep & 07);
120 tp->a_perm = (o_mode_t)mode;
121 continue; /* we may break here if it is sorted */
122 }
123 }
124 if (!got_mask)
125 savp->a_perm = (grpmode >> 3);
126 return (0);
127 }
128