root/source3/modules/vfs_aixacl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. aixacl_sys_acl_get_file
  2. aixacl_sys_acl_get_fd
  3. aixacl_sys_acl_set_file
  4. aixacl_sys_acl_set_fd
  5. aixacl_sys_acl_delete_def_file
  6. vfs_aixacl_init

   1 /*
   2    Unix SMB/Netbios implementation.
   3    VFS module to get and set posix acls
   4    Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2006
   5 
   6    This program is free software; you can redistribute it and/or modify
   7    it under the terms of the GNU General Public License as published by
   8    the Free Software Foundation; either version 3 of the License, or
   9    (at your option) any later version.
  10 
  11    This program is distributed in the hope that it will be useful,
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14    GNU General Public License for more details.
  15 
  16    You should have received a copy of the GNU General Public License
  17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18 */
  19 
  20 #include "includes.h"
  21 
  22 extern SMB_ACL_T aixacl_to_smbacl( struct acl *file_acl);
  23 extern struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
  24 
  25 SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
     /* [<][>][^][v][top][bottom][index][help] */
  26                                     const char *path_p,
  27                                     SMB_ACL_TYPE_T type)
  28 {
  29         struct acl *file_acl = (struct acl *)NULL;
  30         struct smb_acl_t *result = (struct smb_acl_t *)NULL;
  31         
  32         int rc = 0;
  33         uid_t user_id;
  34 
  35         /* AIX has no DEFAULT */
  36         if  ( type == SMB_ACL_TYPE_DEFAULT )
  37                 return NULL;
  38 
  39         /* Get the acl using statacl */
  40  
  41         DEBUG(10,("Entering AIX sys_acl_get_file\n"));
  42         DEBUG(10,("path_p is %s\n",path_p));
  43 
  44         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
  45  
  46         if(file_acl == NULL) {
  47                 errno=ENOMEM;
  48                 DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));
  49                 return(NULL);
  50         }
  51 
  52         memset(file_acl,0,BUFSIZ);
  53 
  54         rc = statacl((char *)path_p,0,file_acl,BUFSIZ);
  55         if( (rc == -1) && (errno == ENOSPC)) {
  56                 struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
  57                 if( new_acl == NULL) {
  58                         SAFE_FREE(file_acl);
  59                         errno = ENOMEM;
  60                         return NULL;
  61                 }
  62                 file_acl = new_acl;
  63                 rc = statacl((char *)path_p,0,file_acl,file_acl->acl_len+sizeof(struct acl));
  64                 if( rc == -1) {
  65                         DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));
  66                         SAFE_FREE(file_acl);
  67                         return(NULL);
  68                 }
  69         }
  70 
  71         DEBUG(10,("Got facl and returned it\n"));
  72 
  73         
  74         result = aixacl_to_smbacl(file_acl);
  75         SAFE_FREE(file_acl);
  76         return result;
  77         
  78         /*errno = ENOTSUP;
  79         return NULL;*/
  80 }
  81 
  82 SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
     /* [<][>][^][v][top][bottom][index][help] */
  83                                 files_struct *fsp)
  84 {
  85 
  86         struct acl *file_acl = (struct acl *)NULL;
  87         struct smb_acl_t *result = (struct smb_acl_t *)NULL;
  88         
  89         int rc = 0;
  90         uid_t user_id;
  91 
  92         /* Get the acl using fstatacl */
  93    
  94         DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
  95         DEBUG(10,("fd is %d\n",fsp->fh->fd));
  96         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
  97 
  98         if(file_acl == NULL) {
  99                 errno=ENOMEM;
 100                 DEBUG(0,("Error in AIX sys_acl_get_fd is %d\n",errno));
 101                 return(NULL);
 102         }
 103 
 104         memset(file_acl,0,BUFSIZ);
 105 
 106         rc = fstatacl(fsp->fh->fd,0,file_acl,BUFSIZ);
 107         if( (rc == -1) && (errno == ENOSPC)) {
 108                 struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
 109                 if( new_acl == NULL) {
 110                         SAFE_FREE(file_acl);
 111                         errno = ENOMEM;
 112                         return NULL;
 113                 }
 114                 file_acl = new_acl;
 115                 rc = fstatacl(fsp->fh->fd,0,file_acl,file_acl->acl_len + sizeof(struct acl));
 116                 if( rc == -1) {
 117                         DEBUG(0,("fstatacl returned %d with errno %d\n",rc,errno));
 118                         SAFE_FREE(file_acl);
 119                         return(NULL);
 120                 }
 121         }
 122 
 123         DEBUG(10,("Got facl and returned it\n"));
 124 
 125         result = aixacl_to_smbacl(file_acl);
 126         SAFE_FREE(file_acl);
 127         return result;
 128         
 129         /*errno = ENOTSUP;
 130         return NULL;*/
 131 }
 132 
 133 int aixacl_sys_acl_set_file(vfs_handle_struct *handle,
     /* [<][>][^][v][top][bottom][index][help] */
 134                               const char *name,
 135                               SMB_ACL_TYPE_T type,
 136                               SMB_ACL_T theacl)
 137 {
 138         struct acl *file_acl = NULL;
 139         unsigned int rc;
 140         
 141         file_acl = aixacl_smb_to_aixacl(type, theacl);
 142         if (!file_acl)
 143                 return -1;
 144 
 145         rc = chacl((char *)name,file_acl,file_acl->acl_len);
 146         DEBUG(10,("errno is %d\n",errno));
 147         DEBUG(10,("return code is %d\n",rc));
 148         SAFE_FREE(file_acl);
 149         DEBUG(10,("Exiting the aixacl_sys_acl_set_file\n"));
 150 
 151         return rc;
 152 }
 153 
 154 int aixacl_sys_acl_set_fd(vfs_handle_struct *handle,
     /* [<][>][^][v][top][bottom][index][help] */
 155                             files_struct *fsp,
 156                             SMB_ACL_T theacl)
 157 {
 158         struct acl *file_acl = NULL;
 159         unsigned int rc;
 160 
 161         file_acl = aixacl_smb_to_aixacl(SMB_ACL_TYPE_ACCESS, theacl);
 162         if (!file_acl)
 163                 return -1;
 164 
 165         rc = fchacl(fsp->fh->fd,file_acl,file_acl->acl_len);
 166         DEBUG(10,("errno is %d\n",errno));
 167         DEBUG(10,("return code is %d\n",rc));
 168         SAFE_FREE(file_acl);
 169         DEBUG(10,("Exiting aixacl_sys_acl_set_fd\n"));
 170 
 171         return rc;
 172 }
 173 
 174 int aixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
     /* [<][>][^][v][top][bottom][index][help] */
 175                                      const char *path)
 176 {
 177         return 0; /* otherwise you can't set acl at upper level */
 178 }
 179 
 180 /* VFS operations structure */
 181 
 182 static vfs_op_tuple aixacl_op_tuples[] = {
 183         /* Disk operations */
 184   {SMB_VFS_OP(aixacl_sys_acl_get_file),
 185    SMB_VFS_OP_SYS_ACL_GET_FILE,
 186    SMB_VFS_LAYER_TRANSPARENT},
 187 
 188   {SMB_VFS_OP(aixacl_sys_acl_get_fd),
 189    SMB_VFS_OP_SYS_ACL_GET_FD,
 190    SMB_VFS_LAYER_TRANSPARENT},
 191 
 192   {SMB_VFS_OP(aixacl_sys_acl_set_file),
 193    SMB_VFS_OP_SYS_ACL_SET_FILE,
 194    SMB_VFS_LAYER_TRANSPARENT},
 195 
 196   {SMB_VFS_OP(aixacl_sys_acl_set_fd),
 197    SMB_VFS_OP_SYS_ACL_SET_FD,
 198    SMB_VFS_LAYER_TRANSPARENT},
 199 
 200   {SMB_VFS_OP(aixacl_sys_acl_delete_def_file),
 201    SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
 202    SMB_VFS_LAYER_TRANSPARENT},
 203 
 204   {SMB_VFS_OP(NULL),
 205    SMB_VFS_OP_NOOP,
 206    SMB_VFS_LAYER_NOOP}
 207 };
 208 
 209 NTSTATUS vfs_aixacl_init(void);
 210 NTSTATUS vfs_aixacl_init(void)
     /* [<][>][^][v][top][bottom][index][help] */
 211 {
 212         return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "aixacl",
 213                                 aixacl_op_tuples);
 214 }

/* [<][>][^][v][top][bottom][index][help] */