1/* 2 File: acl_get_fd.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.15 */ 36acl_t 37acl_get_fd(int fd) 38{ 39 const size_t size_guess = acl_ea_size(16); 40 char *ext_acl_p = alloca(size_guess); 41 int retval; 42 43 if (!ext_acl_p) 44 return NULL; 45 retval = fgetxattr(fd, ACL_EA_ACCESS, ext_acl_p, size_guess); 46 if (retval == -1 && errno == ERANGE) { 47 retval = fgetxattr(fd, ACL_EA_ACCESS, NULL, 0); 48 if (retval > 0) { 49 ext_acl_p = alloca(retval); 50 if (!ext_acl_p) 51 return NULL; 52 retval = fgetxattr(fd, ACL_EA_ACCESS, ext_acl_p,retval); 53 } 54 } 55 if (retval > 0) { 56 acl_t acl = __acl_from_xattr(ext_acl_p, retval); 57 return acl; 58 } else if (retval == 0 || errno == ENOATTR || errno == ENODATA) { 59 struct stat st; 60 61 if (fstat(fd, &st) == 0) 62 return acl_from_mode(st.st_mode); 63 else 64 return NULL; 65 } else 66 return NULL; 67} 68 69