acl_get.c revision 74667
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 74667 2001-03-22 22:31:01Z 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)
3274667Sjedgar * acl_get_permset() returns the permission set in the ACL entry
3374667Sjedgar * acl_get_qualifier() retrieves the qualifier of the tag from the ACL entry
3474667Sjedgar * acl_get_tag_type() returns the tag type for the ACL entry entry_d
3556055Srwatson */
3656055Srwatson
3756055Srwatson#include <sys/types.h>
3856055Srwatson#include <sys/acl.h>
3974667Sjedgar
4074667Sjedgar#include <errno.h>
4156055Srwatson#include <stdlib.h>
4274667Sjedgar#include <string.h>
4356055Srwatson
4456055Srwatsonacl_t
4556055Srwatsonacl_get_file(const char *path_p, acl_type_t type)
4656055Srwatson{
4756055Srwatson	struct acl	*aclp;
4856055Srwatson	int	error;
4956055Srwatson
5056274Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
5156055Srwatson	if (!aclp) {
5271142Srwatson		return (NULL);
5356055Srwatson	}
5456055Srwatson
5556274Srwatson	error = __acl_get_file(path_p, type, aclp);
5656055Srwatson	if (error) {
5756055Srwatson		acl_free(aclp);
5871142Srwatson		return (NULL);
5956055Srwatson	}
6056055Srwatson
6156055Srwatson	return (aclp);
6256055Srwatson}
6356055Srwatson
6456625Srwatsonacl_t
6556625Srwatsonacl_get_fd(int fd)
6656625Srwatson{
6756625Srwatson	struct acl	*aclp;
6856625Srwatson	int	error;
6956055Srwatson
7056625Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
7156625Srwatson	if (!aclp) {
7271142Srwatson		return (NULL);
7356625Srwatson	}
7456625Srwatson
7556625Srwatson	error = __acl_get_fd(fd, ACL_TYPE_ACCESS, aclp);
7656625Srwatson	if (error) {
7756625Srwatson		acl_free(aclp);
7871142Srwatson		return (NULL);
7956625Srwatson	}
8056625Srwatson
8156625Srwatson	return (aclp);
8256625Srwatson}
8356625Srwatson
8456055Srwatsonacl_t
8556625Srwatsonacl_get_fd_np(int fd, acl_type_t type)
8656055Srwatson{
8756055Srwatson	struct acl	*aclp;
8856055Srwatson	int	error;
8956055Srwatson
9056274Srwatson	aclp = acl_init(ACL_MAX_ENTRIES);
9156055Srwatson	if (!aclp) {
9271142Srwatson		return (NULL);
9356055Srwatson	}
9456055Srwatson
9556274Srwatson	error = __acl_get_fd(fd, type, aclp);
9656055Srwatson	if (error) {
9756055Srwatson		acl_free(aclp);
9871142Srwatson		return (NULL);
9956055Srwatson	}
10056055Srwatson
10156055Srwatson	return (aclp);
10256055Srwatson}
10374667Sjedgar
10474667Sjedgarint
10574667Sjedgaracl_get_permset(acl_entry_t entry_d, acl_permset_t *permset_p)
10674667Sjedgar{
10774667Sjedgar
10874667Sjedgar	if (!entry_d || !permset_p) {
10974667Sjedgar		errno = EINVAL;
11074667Sjedgar		return -1;
11174667Sjedgar	}
11274667Sjedgar
11374667Sjedgar	*permset_p = &entry_d->ae_perm;
11474667Sjedgar
11574667Sjedgar	return 0;
11674667Sjedgar}
11774667Sjedgar
11874667Sjedgarvoid *
11974667Sjedgaracl_get_qualifier(acl_entry_t entry_d)
12074667Sjedgar{
12174667Sjedgar	uid_t *retval;
12274667Sjedgar
12374667Sjedgar	if (!entry_d) {
12474667Sjedgar		errno = EINVAL;
12574667Sjedgar		return NULL;
12674667Sjedgar	}
12774667Sjedgar
12874667Sjedgar	switch(entry_d->ae_tag) {
12974667Sjedgar	case ACL_USER:
13074667Sjedgar	case ACL_GROUP:
13174667Sjedgar		retval = malloc(sizeof(uid_t));
13274667Sjedgar		if (retval) {
13374667Sjedgar			*retval = entry_d->ae_id;
13474667Sjedgar			return retval;
13574667Sjedgar		}
13674667Sjedgar	}
13774667Sjedgar
13874667Sjedgar	errno = EINVAL;
13974667Sjedgar	return NULL;
14074667Sjedgar}
14174667Sjedgar
14274667Sjedgarint
14374667Sjedgaracl_get_tag_type(acl_entry_t entry_d, acl_tag_t *tag_type_p)
14474667Sjedgar{
14574667Sjedgar
14674667Sjedgar	if (!entry_d || !tag_type_p) {
14774667Sjedgar		errno = EINVAL;
14874667Sjedgar		return -1;
14974667Sjedgar	}
15074667Sjedgar
15174667Sjedgar	*tag_type_p = entry_d->ae_tag;
15274667Sjedgar
15374667Sjedgar	return 0;
15474667Sjedgar}
155