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