2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #include <sys/types.h>
30 #include <uuid/uuid.h>
35 #define FS_VALID_UID (1<<0)
36 #define FS_VALID_GID (1<<1)
37 #define FS_VALID_UUID (1<<2)
38 #define FS_VALID_GRPUUID (1<<3)
39 #define FS_VALID_MODE (1<<4)
40 #define FS_VALID_ACL (1<<5)
50 #define FS_ISVALID(_fsec, _bit) ((_fsec)->fs_valid & (_bit))
51 #define FS_CLEAR(_fsec, _bit) ((_fsec)->fs_valid &= ~(_bit))
52 #define FS_SET(_fsec, _bit) ((_fsec)->fs_valid |= (_bit))
54 static void filesec_discard_aclbuf(struct _filesec
*fsec
);
61 fsp
= malloc(sizeof(*fsp
));
68 filesec_dup(filesec_t fsec
)
72 fsp
= malloc(sizeof(*fsp
));
75 if (FS_ISVALID(fsec
, FS_VALID_ACL
)) {
76 if (fsec
->fs_aclbuf
!= _FILESEC_REMOVE_ACL
) {
77 fsp
->fs_aclbuf
= malloc(fsec
->fs_aclsize
);
78 if (fsp
->fs_aclbuf
== NULL
) {
82 bcopy(fsec
->fs_aclbuf
, fsp
->fs_aclbuf
, fsec
->fs_aclsize
);
90 filesec_free(filesec_t fsec
)
92 filesec_discard_aclbuf(fsec
);
97 filesec_get_property(filesec_t fsec
, filesec_property_t property
, void *propptr
)
104 if (!FS_ISVALID(fsec
, FS_VALID_UID
)) {
109 *(uid_t
*)propptr
= fsec
->fs_uid
;
112 if (!FS_ISVALID(fsec
, FS_VALID_GID
)) {
117 *(gid_t
*)propptr
= fsec
->fs_gid
;
120 if (!FS_ISVALID(fsec
, FS_VALID_UUID
)) {
125 uuid_copy(*(uuid_t
*)propptr
, fsec
->fs_uuid
);
127 case FILESEC_GRPUUID
:
128 if (!FS_ISVALID(fsec
, FS_VALID_GRPUUID
)) {
133 uuid_copy(*(uuid_t
*)propptr
, fsec
->fs_grpuuid
);
136 if (!FS_ISVALID(fsec
, FS_VALID_MODE
)) {
141 *(mode_t
*)propptr
= fsec
->fs_mode
;
144 if (!FS_ISVALID(fsec
, FS_VALID_ACL
)) {
148 if (propptr
!= NULL
) {
149 if (fsec
->fs_aclbuf
== _FILESEC_REMOVE_ACL
) {
150 *(acl_t
*)propptr
= _FILESEC_REMOVE_ACL
;
152 *(acl_t
*)propptr
= acl_copy_int(fsec
->fs_aclbuf
);
153 if (*(acl_t
*)propptr
== NULL
)
158 case FILESEC_ACL_RAW
:
159 if (!FS_ISVALID(fsec
, FS_VALID_ACL
)) {
164 *(void **)propptr
= fsec
->fs_aclbuf
;
166 case FILESEC_ACL_ALLOCSIZE
:
167 if (!FS_ISVALID(fsec
, FS_VALID_ACL
)) {
172 *(size_t *)propptr
= fsec
->fs_aclsize
;
186 filesec_set_property(filesec_t fsec
, filesec_property_t property
, const void *propptr
)
189 ssize_t aclsize
, copysize
;
196 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
197 FS_CLEAR(fsec
, FS_VALID_UID
);
199 fsec
->fs_uid
= *(uid_t
*)propptr
;
200 FS_SET(fsec
, FS_VALID_UID
);
204 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
205 FS_CLEAR(fsec
, FS_VALID_GID
);
207 fsec
->fs_gid
= *(gid_t
*)propptr
;
208 FS_SET(fsec
, FS_VALID_GID
);
212 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
213 FS_CLEAR(fsec
, FS_VALID_UUID
);
215 uuid_copy(fsec
->fs_uuid
, *(uuid_t
*)propptr
);
216 FS_SET(fsec
, FS_VALID_UUID
);
219 case FILESEC_GRPUUID
:
220 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
221 FS_CLEAR(fsec
, FS_VALID_GRPUUID
);
223 uuid_copy(fsec
->fs_grpuuid
, *(uuid_t
*)propptr
);
224 FS_SET(fsec
, FS_VALID_GRPUUID
);
228 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
229 FS_CLEAR(fsec
, FS_VALID_MODE
);
231 fsec
->fs_mode
= *(mode_t
*)propptr
;
232 FS_SET(fsec
, FS_VALID_MODE
);
236 if (propptr
== _FILESEC_UNSET_PROPERTY
) {
237 filesec_discard_aclbuf(fsec
);
238 FS_CLEAR(fsec
, FS_VALID_ACL
);
239 } else if (propptr
== _FILESEC_REMOVE_ACL
) {
240 filesec_discard_aclbuf(fsec
);
241 fsec
->fs_aclbuf
= _FILESEC_REMOVE_ACL
;
242 fsec
->fs_aclsize
= 0;
243 FS_SET(fsec
, FS_VALID_ACL
);
245 acl
= *(acl_t
*)propptr
;
246 aclsize
= acl_size(acl
);
251 if ((aclbuf
= malloc(aclsize
)) == NULL
) {
255 copysize
= acl_copy_ext(aclbuf
, acl
, aclsize
);
261 filesec_discard_aclbuf(fsec
);
262 fsec
->fs_aclbuf
= aclbuf
;
263 fsec
->fs_aclsize
= aclsize
;
264 FS_SET(fsec
, FS_VALID_ACL
);
267 case FILESEC_ACL_RAW
:
268 filesec_discard_aclbuf(fsec
);
269 if ((propptr
!= NULL
) && (*(void **)propptr
!= NULL
)) {
270 fsec
->fs_aclbuf
= *(void **)propptr
;
271 FS_SET(fsec
, FS_VALID_ACL
);
274 case FILESEC_ACL_ALLOCSIZE
:
275 if (propptr
!= NULL
) {
276 fsec
->fs_aclsize
= *(size_t *)propptr
;
293 filesec_query_property(filesec_t fsec
, filesec_property_t property
, int *validptr
)
300 valid
= FS_ISVALID(fsec
, FS_VALID_UID
);
303 valid
= FS_ISVALID(fsec
, FS_VALID_GID
);
306 valid
= FS_ISVALID(fsec
, FS_VALID_UUID
);
308 case FILESEC_GRPUUID
:
309 valid
= FS_ISVALID(fsec
, FS_VALID_GRPUUID
);
312 valid
= FS_ISVALID(fsec
, FS_VALID_MODE
);
315 case FILESEC_ACL_RAW
:
316 case FILESEC_ACL_ALLOCSIZE
:
317 valid
= FS_ISVALID(fsec
, FS_VALID_ACL
);
333 filesec_discard_aclbuf(struct _filesec
*fsec
)
335 if (FS_ISVALID(fsec
, FS_VALID_ACL
)) {
336 if (fsec
->fs_aclbuf
!= _FILESEC_REMOVE_ACL
)
337 free(fsec
->fs_aclbuf
);
338 fsec
->fs_aclbuf
= NULL
;
339 fsec
->fs_aclsize
= 0;
340 FS_CLEAR(fsec
, FS_VALID_ACL
);