Loading...
sys/statx_np.c Libc-1725.40.4 /dev/null
--- Libc/Libc-1725.40.4/sys/statx_np.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2004, 2006 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 <sys/stat.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <string.h>
-#include <stdio.h>
-
-#define ACL_MIN_SIZE_HEURISTIC (KAUTH_FILESEC_SIZE(16))
-
-static int	statx_syscall(void *obj, void  *sbptr, void *fsacl, size_t *fsacl_size);
-static int	fstatx_syscall(void *obj, void  *sbptr, void *fsacl, size_t *fsacl_size);
-static int	lstatx_syscall(void *obj, void  *sbptr, void *fsacl, size_t *fsacl_size);
-
-static int	statx1(void *obj,
-		       int (* stat_syscall)(void *obj, void *sbptr, void *fsacl, size_t *fsacl_size),
-		       void *sbptr, filesec_t fsec);
-
-/*
- * Stat interfaces.
- */
-int
-statx_np(const char *path, struct stat *sb, filesec_t fsec)
-{
-	if (fsec == NULL)
-		return(stat(path, sb));
-	return(statx1((void *)&path, statx_syscall, (void *)sb, fsec));
-}
-
-int
-fstatx_np(int fd, struct stat *sb, filesec_t fsec)
-{
-	if (fsec == NULL)
-		return(fstat(fd, sb));
-	return(statx1((void *)&fd, fstatx_syscall, (void *)sb, fsec));
-}
-
-int
-lstatx_np(const char *path, struct stat *sb, filesec_t fsec)
-{
-	if (fsec == NULL)
-		return(lstat(path, sb));
-	return(statx1((void *)&path, lstatx_syscall, (void *)sb, fsec));
-}
-
-
-#if __DARWIN_64_BIT_INO_T && !__DARWIN_ONLY_64_BIT_INO_T
-int
-statx64_np(const char *path, struct stat64 *sb, filesec_t fsec)
-{
-	return(statx_np(path, (struct stat *)sb, fsec));
-}
-
-int
-fstatx64_np(int fd, struct stat64 *sb, filesec_t fsec)
-{
-	return(fstatx_np(fd, (struct stat *)sb, fsec));
-}
-
-int
-lstatx64_np(const char *path, struct stat64 *sb, filesec_t fsec)
-{
-	return(lstatx_np(path, (struct stat *)sb, fsec));
-}
-#endif /* __DARWIN_64_BIT_INO_T && !__DARWIN_ONLY_64_BIT_INO_T */
-
-/*
- * Stat syscalls
- */
-#if __DARWIN_64_BIT_INO_T
-extern int __fstat64_extended(int, struct stat *, void *, size_t *);
-extern int __lstat64_extended(const char *, struct stat *, void *, size_t *);
-extern int __stat64_extended(const char *, struct stat *, void *, size_t *);
-#else /* !__DARWIN_64_BIT_INO_T */
-extern int __fstat_extended(int, struct stat *, void *, size_t *);
-extern int __lstat_extended(const char *, struct stat *, void *, size_t *);
-extern int __stat_extended(const char *, struct stat *, void *, size_t *);
-#endif /* __DARWIN_64_BIT_INO_T */
-
-static int
-statx_syscall(void *obj, void  *sb, void *fsacl, size_t *fsacl_size)
-{
-	const char *path = *(const char **)obj;
-#if __DARWIN_64_BIT_INO_T
-	return(__stat64_extended(path, (struct stat *)sb, fsacl, fsacl_size));
-#else /* !__DARWIN_64_BIT_INO_T */
-	return(__stat_extended(path, (struct stat *)sb, fsacl, fsacl_size));
-#endif /* __DARWIN_64_BIT_INO_T */
-}
-
-static int
-fstatx_syscall(void *obj, void  *sb, void *fsacl, size_t *fsacl_size)
-{
-	int fd = *(int *)obj;
-#if __DARWIN_64_BIT_INO_T
-	return(__fstat64_extended(fd, (struct stat *)sb, fsacl, fsacl_size));
-#else /* !__DARWIN_64_BIT_INO_T */
-	return(__fstat_extended(fd, (struct stat *)sb, fsacl, fsacl_size));
-#endif /* __DARWIN_64_BIT_INO_T */
-}
-
-static int
-lstatx_syscall(void *obj, void  *sb, void *fsacl, size_t *fsacl_size)
-{
-	const char *path = *(const char **)obj;
-#if __DARWIN_64_BIT_INO_T
-	return(__lstat64_extended(path, (struct stat *)sb, fsacl, fsacl_size));
-#else /* !__DARWIN_64_BIT_INO_T */
-	return(__lstat_extended(path, (struct stat *)sb, fsacl, fsacl_size));
-#endif /* __DARWIN_64_BIT_INO_T */
-}
-
-/*
- * Stat internals
- */
-static int
-statx1(void *obj,
-    int (* stat_syscall)(void *obj, void *sbptr, void *fsacl, size_t *fsacl_size),
-    void  *sbptr, filesec_t fsec)
-{
-	kauth_filesec_t fsacl, ofsacl;
-	size_t fsacl_size, buffer_size;
-	int error;
-	struct stat * sb = (struct stat *)0;
-
-	fsacl = NULL;
-	error = 0;
-	
-	sb = (struct stat *)sbptr;
-		
-	/*
-	 * Allocate an initial buffer.
-	 */
-	if ((fsacl = malloc(ACL_MIN_SIZE_HEURISTIC)) == NULL) {
-		error = ENOMEM;
-		goto out;
-	}		
-	buffer_size = ACL_MIN_SIZE_HEURISTIC;
-
-	/*
-	 * Loop until we have the ACL.
-	 */
-	for (;;) {
-		fsacl_size = buffer_size;
-
-		if ((error = stat_syscall(obj, sbptr, fsacl, &fsacl_size)) != 0)
-			goto out;
-
-		/*
-		 * No error, did we get the ACL?
-		 */
-		if (fsacl_size <= buffer_size)
-			break;
-
-		/* no, use supplied buffer size plus some padding */
-		ofsacl = fsacl;
-		fsacl = realloc(fsacl, fsacl_size + sizeof(struct kauth_ace) * 2);
-		if (fsacl == NULL) {
-			fsacl = ofsacl;
-			errno = ENOMEM;
-			goto out;
-		}
-		buffer_size = fsacl_size;
-	}
-	
-	/* populate filesec with values from stat */
-	filesec_set_property(fsec, FILESEC_OWNER, &(sb->st_uid));
-	filesec_set_property(fsec, FILESEC_GROUP, &(sb->st_gid));
-	filesec_set_property(fsec, FILESEC_MODE, &(sb->st_mode));
-
-	/* if we got a kauth_filesec, take values from there too */
-	if (fsacl_size >= sizeof(struct kauth_filesec)) {
-		filesec_set_property(fsec, FILESEC_UUID, &fsacl->fsec_owner);
-		filesec_set_property(fsec, FILESEC_GRPUUID, &fsacl->fsec_group);
-		
-		/* check to see whether there's actually an ACL here */
-		if (fsacl->fsec_acl.acl_entrycount != KAUTH_FILESEC_NOACL) {
-		    filesec_set_property(fsec, FILESEC_ACL_ALLOCSIZE, &fsacl_size);
-		    filesec_set_property(fsec, FILESEC_ACL_RAW, &fsacl);
-		    fsacl = NULL;	/* avoid freeing it below */
-		} else {
-		    filesec_set_property(fsec, FILESEC_ACL_ALLOCSIZE, NULL);
-		    filesec_set_property(fsec, FILESEC_ACL_RAW, NULL);
-		}
-	} else {
-		filesec_set_property(fsec, FILESEC_UUID, NULL);
-		filesec_set_property(fsec, FILESEC_GRPUUID, NULL);
-		filesec_set_property(fsec, FILESEC_ACL_ALLOCSIZE, NULL);
-		filesec_set_property(fsec, FILESEC_ACL_RAW, NULL);
-	}
-out:
-	if (fsacl != NULL)
-		free(fsacl);
-	return(error);
-}