Loading...
gen/filesec.c Libc-1725.40.4 /dev/null
--- Libc/Libc-1725.40.4/gen/filesec.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-#include <sys/types.h>
-#include <sys/acl.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <errno.h>
-#include <uuid/uuid.h>
-
-/*
- * Versions of copy_int/copy_ext that retain native endianity.
- */
-extern ssize_t	acl_copy_ext_native(void *buf_p, acl_t acl, ssize_t size);
-extern acl_t	acl_copy_int_native(const void *buf_p);
-
-struct _filesec {
-	int	fs_valid;
-#define FS_VALID_UID		(1<<0)
-#define FS_VALID_GID		(1<<1)
-#define FS_VALID_UUID		(1<<2)
-#define FS_VALID_GRPUUID	(1<<3)
-#define	FS_VALID_MODE		(1<<4)
-#define FS_VALID_ACL		(1<<5)
-	uid_t	fs_uid;
-	gid_t	fs_gid;
-	uuid_t	fs_uuid;
-	uuid_t	fs_grpuuid;
-	mode_t	fs_mode;
-	size_t	fs_aclsize;
-	void	*fs_aclbuf;
-};
-
-#define FS_ISVALID(_fsec, _bit)	((_fsec)->fs_valid & (_bit))
-#define FS_CLEAR(_fsec, _bit)	((_fsec)->fs_valid &= ~(_bit))
-#define FS_SET(_fsec, _bit)	((_fsec)->fs_valid |= (_bit))
-
-static void	filesec_discard_aclbuf(struct _filesec *fsec);
-
-filesec_t
-filesec_init(void)
-{
-	struct _filesec	*fsp;
-
-	fsp = malloc(sizeof(*fsp));
-	if (fsp != NULL)
-		fsp->fs_valid = 0;
-	return(fsp);
-}
-
-filesec_t
-filesec_dup(filesec_t fsec)
-{
-	struct _filesec *fsp;
-
-	fsp = malloc(sizeof(*fsp));
-	if (fsp != NULL) {
-		*fsp = *fsec;
-		if (FS_ISVALID(fsec, FS_VALID_ACL)) {
-			if (fsec->fs_aclbuf != _FILESEC_REMOVE_ACL) {
-				fsp->fs_aclbuf = malloc(fsec->fs_aclsize);
-				if (fsp->fs_aclbuf == NULL) {
-					free(fsp);
-					return(NULL);
-				}
-				bcopy(fsec->fs_aclbuf, fsp->fs_aclbuf, fsec->fs_aclsize);
-			}
-		}
-	}
-	return(fsp);
-}
-
-void
-filesec_free(filesec_t fsec)
-{
-	filesec_discard_aclbuf(fsec);
-	free(fsec);
-}
-
-int
-filesec_get_property(filesec_t fsec, filesec_property_t property, void *propptr)
-{
-	int		error;
-
-	error = 0;
-	switch(property) {
-	case FILESEC_OWNER:
-		if (!FS_ISVALID(fsec, FS_VALID_UID)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			*(uid_t *)propptr = fsec->fs_uid;
-		break;
-	case FILESEC_GROUP:
-		if (!FS_ISVALID(fsec, FS_VALID_GID)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			*(gid_t *)propptr = fsec->fs_gid;
-		break;
-	case FILESEC_UUID:
-		if (!FS_ISVALID(fsec, FS_VALID_UUID)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			uuid_copy(*(uuid_t *)propptr, fsec->fs_uuid);
-		break;
-	case FILESEC_GRPUUID:
-		if (!FS_ISVALID(fsec, FS_VALID_GRPUUID)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			uuid_copy(*(uuid_t *)propptr, fsec->fs_grpuuid);
-		break;
-	case FILESEC_MODE:
-		if (!FS_ISVALID(fsec, FS_VALID_MODE)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			*(mode_t *)propptr = fsec->fs_mode;
-		break;
-	case FILESEC_ACL:
-		if (!FS_ISVALID(fsec, FS_VALID_ACL)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL) {
-			if (fsec->fs_aclbuf == _FILESEC_REMOVE_ACL) {
-				*(acl_t *)propptr = _FILESEC_REMOVE_ACL;
-			} else {
-				*(acl_t *)propptr = acl_copy_int_native(fsec->fs_aclbuf);
-				if (*(acl_t *)propptr == NULL)
-					error = errno;
-			}
-		}
-		break;
-	case FILESEC_ACL_RAW:
-		if (!FS_ISVALID(fsec, FS_VALID_ACL)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			*(void **)propptr = fsec->fs_aclbuf;
-		break;
-	case FILESEC_ACL_ALLOCSIZE:
-		if (!FS_ISVALID(fsec, FS_VALID_ACL)) {
-			error = ENOENT;
-			break;
-		}
-		if (propptr != NULL)
-			*(size_t *)propptr = fsec->fs_aclsize;
-		break;
-	default:
-		error = EINVAL;
-		break;
-	}
-	if (error) {
-		errno = error;
-		return(-1);
-	}
-	return(0);
-}
-
-int
-filesec_set_property(filesec_t fsec, filesec_property_t property, const void *propptr)
-{
-	void	*aclbuf;
-	ssize_t	aclsize, copysize;
-	acl_t	acl;
-	int	error;
-
-	error = 0;
-	switch(property) {
-	case FILESEC_OWNER:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			FS_CLEAR(fsec, FS_VALID_UID);
-		} else {
-			fsec->fs_uid = *(uid_t *)propptr;
-			FS_SET(fsec, FS_VALID_UID);
-		}
-		break;
-	case FILESEC_GROUP:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			FS_CLEAR(fsec, FS_VALID_GID);
-		} else {
-			fsec->fs_gid = *(gid_t *)propptr;
-			FS_SET(fsec, FS_VALID_GID);
-		}
-		break;
-	case FILESEC_UUID:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			FS_CLEAR(fsec, FS_VALID_UUID);
-		} else {
-			uuid_copy(fsec->fs_uuid, *(uuid_t *)propptr);
-			FS_SET(fsec, FS_VALID_UUID);
-		}
-		break;
-	case FILESEC_GRPUUID:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			FS_CLEAR(fsec, FS_VALID_GRPUUID);
-		} else {
-			uuid_copy(fsec->fs_grpuuid, *(uuid_t *)propptr);
-			FS_SET(fsec, FS_VALID_GRPUUID);
-		}
-		break;
-	case FILESEC_MODE:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			FS_CLEAR(fsec, FS_VALID_MODE);
-		} else {
-			fsec->fs_mode = *(mode_t *)propptr;
-			FS_SET(fsec, FS_VALID_MODE);
-		}
-		break;
-	case FILESEC_ACL:
-		if (propptr == _FILESEC_UNSET_PROPERTY) {
-			filesec_discard_aclbuf(fsec);
-			FS_CLEAR(fsec, FS_VALID_ACL);
-		} else if (propptr == _FILESEC_REMOVE_ACL) {
-			filesec_discard_aclbuf(fsec);
-			fsec->fs_aclbuf = _FILESEC_REMOVE_ACL;
-			fsec->fs_aclsize = 0;
-			FS_SET(fsec, FS_VALID_ACL);
-		} else {
-			acl = *(acl_t *)propptr;
-			aclsize = acl_size(acl);
-			if (aclsize < 0) {
-				error = errno;
-				break;
-			}
-			if ((aclbuf = malloc(aclsize)) == NULL) {
-				error = errno;
-				break;
-			}
-			copysize = acl_copy_ext_native(aclbuf, acl, aclsize);
-			if (copysize < 0) {
-				free(aclbuf);
-				error = EINVAL;
-				break;
-			}
-			filesec_discard_aclbuf(fsec);
-			fsec->fs_aclbuf = aclbuf;
-			fsec->fs_aclsize = aclsize;
-			FS_SET(fsec, FS_VALID_ACL);
-		}
-		break;
-	case FILESEC_ACL_RAW:
-		filesec_discard_aclbuf(fsec);
-		if ((propptr != NULL) && (*(void **)propptr != NULL)) {
-			fsec->fs_aclbuf = *(void **)propptr;
-			FS_SET(fsec, FS_VALID_ACL);
-		}
-		break;
-	case FILESEC_ACL_ALLOCSIZE:
-		if (propptr != NULL) {
-			fsec->fs_aclsize = *(size_t *)propptr;
-		} else {
-			error = EINVAL;
-		}
-		break;
-	default:
-		error = EINVAL;
-		break;
-	}
-	if (error != 0) {
-		errno = error;
-		return (-1);
-	}
-	return (0);
-}
-
-int
-filesec_unset_property(filesec_t fsec, filesec_property_t property)
-{
-	return filesec_set_property(fsec, property, _FILESEC_UNSET_PROPERTY);
-}
-
-int
-filesec_query_property(filesec_t fsec, filesec_property_t property, int *validptr)
-{
-	int	valid, error;
-
-	error = 0;
-	switch(property) {
-	case FILESEC_OWNER:
-		valid = FS_ISVALID(fsec, FS_VALID_UID);
-		break;
-	case FILESEC_GROUP:
-		valid = FS_ISVALID(fsec, FS_VALID_GID);
-		break;
-	case FILESEC_UUID:
-		valid = FS_ISVALID(fsec, FS_VALID_UUID);
-		break;
-	case FILESEC_GRPUUID:
-		valid = FS_ISVALID(fsec, FS_VALID_GRPUUID);
-		break;
-	case FILESEC_MODE:
-		valid = FS_ISVALID(fsec, FS_VALID_MODE);
-		break;
-	case FILESEC_ACL:
-	case FILESEC_ACL_RAW:
-	case FILESEC_ACL_ALLOCSIZE:
-		valid = FS_ISVALID(fsec, FS_VALID_ACL);
-		break;
-	default:
-		error = EINVAL;
-		break;
-	}
-
-	if (error != 0) {
-		errno = error;
-		return(-1);
-	}
-	*validptr = valid;
-	return(0);
-}
-
-static void
-filesec_discard_aclbuf(struct _filesec *fsec)
-{
-	if (FS_ISVALID(fsec, FS_VALID_ACL)) {
-		if (fsec->fs_aclbuf != _FILESEC_REMOVE_ACL)
-			free(fsec->fs_aclbuf);
-		fsec->fs_aclbuf = NULL;
-		fsec->fs_aclsize = 0;
-		FS_CLEAR(fsec, FS_VALID_ACL);
-	}
-}