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