1/* 2 File: acl_get_file.c 3 4 Copyright (C) 1999, 2000 5 Andreas Gruenbacher, <a.gruenbacher@computer.org> 6 7 This program is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Library General Public 9 License as published by the Free Software Foundation; either 10 version 2 of the License, or (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Library General Public License for more details. 16 17 You should have received a copy of the GNU Library General Public 18 License along with this library; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20*/ 21 22#include <sys/types.h> 23#include <sys/stat.h> 24#include <unistd.h> 25#include <stdio.h> 26#include "../../attr/include/xattr.h" 27#include <acl/libacl.h> 28#include "libacl.h" 29#include "__acl_from_xattr.h" 30 31#include "byteorder.h" 32#include "acl_ea.h" 33 34 35/* 23.4.16 */ 36acl_t 37acl_get_file(const char *path_p, acl_type_t type) 38{ 39 const size_t size_guess = acl_ea_size(16); 40 char *ext_acl_p = alloca(size_guess); 41 const char *name; 42 int retval; 43 44 switch(type) { 45 case ACL_TYPE_ACCESS: 46 name = ACL_EA_ACCESS; 47 break; 48 case ACL_TYPE_DEFAULT: 49 name = ACL_EA_DEFAULT; 50 break; 51 default: 52 errno = EINVAL; 53 return NULL; 54 } 55 56 if (!ext_acl_p) 57 return NULL; 58 retval = getxattr(path_p, name, ext_acl_p, size_guess); 59 if (retval == -1 && errno == ERANGE) { 60 retval = getxattr(path_p, name, NULL, 0); 61 if (retval > 0) { 62 ext_acl_p = alloca(retval); 63 if (!ext_acl_p) 64 return NULL; 65 retval = getxattr(path_p, name, ext_acl_p, retval); 66 } 67 } 68 if (retval > 0) { 69 acl_t acl = __acl_from_xattr(ext_acl_p, retval); 70 return acl; 71 } else if (retval == 0 || errno == ENOATTR || errno == ENODATA) { 72 struct stat st; 73 74 if (stat(path_p, &st) != 0) 75 return NULL; 76 77 if (type == ACL_TYPE_DEFAULT) { 78 if (S_ISDIR(st.st_mode)) 79 return acl_init(0); 80 else { 81 errno = EACCES; 82 return NULL; 83 } 84 } else 85 return acl_from_mode(st.st_mode); 86 } else 87 return NULL; 88} 89 90