acl_get.c revision 75492
156055Srwatson/*-
274191Srwatson * Copyright (c) 1999, 2000, 2001 Robert N. M. Watson
356055Srwatson * All rights reserved.
456055Srwatson *
556055Srwatson * Redistribution and use in source and binary forms, with or without
656055Srwatson * modification, are permitted provided that the following conditions
756055Srwatson * are met:
856055Srwatson * 1. Redistributions of source code must retain the above copyright
956055Srwatson *    notice, this list of conditions and the following disclaimer.
1056055Srwatson * 2. Redistributions in binary form must reproduce the above copyright
1156055Srwatson *    notice, this list of conditions and the following disclaimer in the
1256055Srwatson *    documentation and/or other materials provided with the distribution.
1356055Srwatson *
1456055Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1556055Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1656055Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1756055Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1856055Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1956055Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2056055Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2156055Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2256055Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2356055Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2456055Srwatson * SUCH DAMAGE.
2556055Srwatson *
2674191Srwatson * $FreeBSD: head/lib/libc/posix1e/acl_get.c 75492 2001-04-13 19:37:04Z jedgar $
2756055Srwatson */
2856055Srwatson/*
2956055Srwatson * acl_get_file - syscall wrapper for retrieving ACL by filename
3056625Srwatson * acl_get_fd - syscall wrapper for retrieving access ACL by fd
3156625Srwatson * acl_get_fd_np - syscall wrapper for retrieving ACL by fd (non-POSIX)
3275492Sjedgar * acl_get_perm_np() checks if a permission is in the specified
3375492Sjedgar *                   permset (non-POSIX)
3474667Sjedgar * acl_get_permset() returns the permission set in the ACL entry
3574667Sjedgar * acl_get_qualifier() retrieves the qualifier of the tag from the ACL entry
3674667Sjedgar * acl_get_tag_type() returns the tag type for the ACL entry entry_d
3756055Srwatson */
3856055Srwatson
3956055Srwatson#include <sys/types.h>
4075185Stmm#include "namespace.h"
4156055Srwatson#include <sys/acl.h>
4275185Stmm#include "un-namespace.h"
4374667Sjedgar
4474667Sjedgar#include <errno.h>
4556055Srwatson#include <stdlib.h>
4674667Sjedgar#include <string.h>
4756055Srwatson
4856055Srwatsonacl_t
4956055Srwatsonacl_get_file(const char *path_p, acl_type_t type)
5056055Srwatson{
5156055Srwatson	struct acl	*aclp;
5256055Srwatson	int	error;
5356055Srwatson
5456274Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
5556055Srwatson	if (!aclp) {
5671142Srwatson		return (NULL);
5756055Srwatson	}
5856055Srwatson
5956274Srwatson	error = __acl_get_file(path_p, type, aclp);
6056055Srwatson	if (error) {
6156055Srwatson		acl_free(aclp);
6271142Srwatson		return (NULL);
6356055Srwatson	}
6456055Srwatson
6556055Srwatson	return (aclp);
6656055Srwatson}
6756055Srwatson
6856625Srwatsonacl_t
6956625Srwatsonacl_get_fd(int fd)
7056625Srwatson{
7156625Srwatson	struct acl	*aclp;
7256625Srwatson	int	error;
7356055Srwatson
7456625Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
7556625Srwatson	if (!aclp) {
7671142Srwatson		return (NULL);
7756625Srwatson	}
7856625Srwatson
7975185Stmm	error = ___acl_get_fd(fd, ACL_TYPE_ACCESS, aclp);
8056625Srwatson	if (error) {
8156625Srwatson		acl_free(aclp);
8271142Srwatson		return (NULL);
8356625Srwatson	}
8456625Srwatson
8556625Srwatson	return (aclp);
8656625Srwatson}
8756625Srwatson
8856055Srwatsonacl_t
8956625Srwatsonacl_get_fd_np(int fd, acl_type_t type)
9056055Srwatson{
9156055Srwatson	struct acl	*aclp;
9256055Srwatson	int	error;
9356055Srwatson
9456274Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
9556055Srwatson	if (!aclp) {
9671142Srwatson		return (NULL);
9756055Srwatson	}
9856055Srwatson
9975185Stmm	error = ___acl_get_fd(fd, type, aclp);
10056055Srwatson	if (error) {
10156055Srwatson		acl_free(aclp);
10271142Srwatson		return (NULL);
10356055Srwatson	}
10456055Srwatson
10556055Srwatson	return (aclp);
10656055Srwatson}
10774667Sjedgar
10874667Sjedgarint
10975492Sjedgaracl_get_perm_np(acl_permset_t permset_d, acl_perm_t perm)
11075492Sjedgar{
11175492Sjedgar
11275492Sjedgar	switch(perm) {
11375492Sjedgar	case ACL_READ:
11475492Sjedgar	case ACL_WRITE:
11575492Sjedgar	case ACL_EXECUTE:
11675492Sjedgar		if (*permset_d & perm)
11775492Sjedgar			return 1;
11875492Sjedgar		break;
11975492Sjedgar	default:
12075492Sjedgar		errno = EINVAL;
12175492Sjedgar		return -1;
12275492Sjedgar	}
12375492Sjedgar
12475492Sjedgar	return 0;
12575492Sjedgar}
12675492Sjedgar
12775492Sjedgarint
12874667Sjedgaracl_get_permset(acl_entry_t entry_d, acl_permset_t *permset_p)
12974667Sjedgar{
13074667Sjedgar
13174667Sjedgar	if (!entry_d || !permset_p) {
13274667Sjedgar		errno = EINVAL;
13374667Sjedgar		return -1;
13474667Sjedgar	}
13574667Sjedgar
13674667Sjedgar	*permset_p = &entry_d->ae_perm;
13774667Sjedgar
13874667Sjedgar	return 0;
13974667Sjedgar}
14074667Sjedgar
14174667Sjedgarvoid *
14274667Sjedgaracl_get_qualifier(acl_entry_t entry_d)
14374667Sjedgar{
14474667Sjedgar	uid_t *retval;
14574667Sjedgar
14674667Sjedgar	if (!entry_d) {
14774667Sjedgar		errno = EINVAL;
14874667Sjedgar		return NULL;
14974667Sjedgar	}
15074667Sjedgar
15174667Sjedgar	switch(entry_d->ae_tag) {
15274667Sjedgar	case ACL_USER:
15374667Sjedgar	case ACL_GROUP:
15474667Sjedgar		retval = malloc(sizeof(uid_t));
15574667Sjedgar		if (retval) {
15674667Sjedgar			*retval = entry_d->ae_id;
15774667Sjedgar			return retval;
15874667Sjedgar		}
15974667Sjedgar	}
16074667Sjedgar
16174667Sjedgar	errno = EINVAL;
16274667Sjedgar	return NULL;
16374667Sjedgar}
16474667Sjedgar
16574667Sjedgarint
16674667Sjedgaracl_get_tag_type(acl_entry_t entry_d, acl_tag_t *tag_type_p)
16774667Sjedgar{
16874667Sjedgar
16974667Sjedgar	if (!entry_d || !tag_type_p) {
17074667Sjedgar		errno = EINVAL;
17174667Sjedgar		return -1;
17274667Sjedgar	}
17374667Sjedgar
17474667Sjedgar	*tag_type_p = entry_d->ae_tag;
17574667Sjedgar
17674667Sjedgar	return 0;
17774667Sjedgar}
178