s4:kdc: Implement KDC plugin hardware authentication policy
[samba.git] / source3 / modules / vfs_aixacl.c
index 4a1fcc59a3de19352baaa15ceb7f9f992b69d71a..0628fae761b4c7b6b7c50ad41212e5f96edc939a 100644 (file)
@@ -5,7 +5,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "system/filesys.h"
+#include "smbd/smbd.h"
+#include "vfs_aixacl_util.h"
 
-extern SMB_ACL_T aixacl_to_smbacl( struct acl *file_acl);
-extern struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
-
-SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
-                                   const char *path_p,
-                                   SMB_ACL_TYPE_T type)
+SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
+                               files_struct *fsp,
+                               SMB_ACL_TYPE_T type,
+                               TALLOC_CTX *mem_ctx)
 {
+
        struct acl *file_acl = (struct acl *)NULL;
        struct smb_acl_t *result = (struct smb_acl_t *)NULL;
        
@@ -34,67 +35,14 @@ SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
        uid_t user_id;
 
        /* AIX has no DEFAULT */
-       if  ( type == SMB_ACL_TYPE_DEFAULT )
+       if  ( type == SMB_ACL_TYPE_DEFAULT ) {
                return NULL;
-
-       /* Get the acl using statacl */
-       DEBUG(10,("Entering AIX sys_acl_get_file\n"));
-       DEBUG(10,("path_p is %s\n",path_p));
-
-       file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
-       if(file_acl == NULL) {
-               errno=ENOMEM;
-               DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));
-               return(NULL);
-       }
-
-       memset(file_acl,0,BUFSIZ);
-
-       rc = statacl((char *)path_p,0,file_acl,BUFSIZ);
-       if( (rc == -1) && (errno == ENOSPC)) {
-               struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
-               if( new_acl == NULL) {
-                       SAFE_FREE(file_acl);
-                       errno = ENOMEM;
-                       return NULL;
-               }
-               file_acl = new_acl;
-               rc = statacl((char *)path_p,0,file_acl,file_acl->acl_len+sizeof(struct acl));
-               if( rc == -1) {
-                       DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));
-                       SAFE_FREE(file_acl);
-                       return(NULL);
-               }
        }
 
-       DEBUG(10,("Got facl and returned it\n"));
-
-       
-       result = aixacl_to_smbacl(file_acl);
-       SAFE_FREE(file_acl);
-       return result;
-       
-       /*errno = ENOTSUP;
-       return NULL;*/
-}
-
-SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
-                                 files_struct *fsp,
-                                 int fd)
-{
-
-       struct acl *file_acl = (struct acl *)NULL;
-       struct smb_acl_t *result = (struct smb_acl_t *)NULL;
-       
-       int rc = 0;
-       uid_t user_id;
-
        /* Get the acl using fstatacl */
    
        DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
-       DEBUG(10,("fd is %d\n",fd));
+       DEBUG(10,("fd is %d\n",fsp_get_io_fd(fsp)));
        file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
 
        if(file_acl == NULL) {
@@ -105,7 +53,7 @@ SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
 
        memset(file_acl,0,BUFSIZ);
 
-       rc = fstatacl(fd,0,file_acl,BUFSIZ);
+       rc = fstatacl(fsp_get_io_fd(fsp),0,file_acl,BUFSIZ);
        if( (rc == -1) && (errno == ENOSPC)) {
                struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
                if( new_acl == NULL) {
@@ -114,7 +62,7 @@ SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
                        return NULL;
                }
                file_acl = new_acl;
-               rc = fstatacl(fd,0,file_acl,file_acl->acl_len + sizeof(struct acl));
+               rc = fstatacl(fsp_get_io_fd(fsp),0,file_acl,file_acl->acl_len + sizeof(struct acl));
                if( rc == -1) {
                        DEBUG(0,("fstatacl returned %d with errno %d\n",rc,errno));
                        SAFE_FREE(file_acl);
@@ -124,7 +72,7 @@ SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
 
        DEBUG(10,("Got facl and returned it\n"));
 
-       result = aixacl_to_smbacl(file_acl);
+       result = aixacl_to_smbacl(file_acl, mem_ctx);
        SAFE_FREE(file_acl);
        return result;
        
@@ -132,39 +80,28 @@ SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
        return NULL;*/
 }
 
-int aixacl_sys_acl_set_file(vfs_handle_struct *handle,
-                             const char *name,
-                             SMB_ACL_TYPE_T type,
-                             SMB_ACL_T theacl)
-{
-       struct acl *file_acl = NULL;
-       uint rc;
-       
-       file_acl = aixacl_smb_to_aixacl(type, theacl);
-       if (!file_acl)
-               return -1;
-
-       rc = chacl((char *)name,file_acl,file_acl->acl_len);
-       DEBUG(10,("errno is %d\n",errno));
-       DEBUG(10,("return code is %d\n",rc));
-       SAFE_FREE(file_acl);
-       DEBUG(10,("Exiting the aixacl_sys_acl_set_file\n"));
-
-       return rc;
-}
-
 int aixacl_sys_acl_set_fd(vfs_handle_struct *handle,
                            files_struct *fsp,
-                           int fd, SMB_ACL_T theacl)
+                           SMB_ACL_TYPE_T type,
+                           SMB_ACL_T theacl)
 {
        struct acl *file_acl = NULL;
-       uint rc;
+       unsigned int rc;
 
-       file_acl = aixacl_smb_to_aixacl(SMB_ACL_TYPE_ACCESS, theacl);
+       file_acl = aixacl_smb_to_aixacl(type, theacl);
        if (!file_acl)
                return -1;
 
-       rc = fchacl(fd,file_acl,file_acl->acl_len);
+       if (fsp->fsp_flags.is_pathref) {
+               /*
+                * This is no longer a handle based call.
+                */
+               return chacl(fsp->fsp_name->base_name,
+                            file_acl,
+                            file_acl->acl_len);
+       }
+
+       rc = fchacl(fsp_get_io_fd(fsp),file_acl,file_acl->acl_len);
        DEBUG(10,("errno is %d\n",errno));
        DEBUG(10,("return code is %d\n",rc));
        SAFE_FREE(file_acl);
@@ -173,43 +110,22 @@ int aixacl_sys_acl_set_fd(vfs_handle_struct *handle,
        return rc;
 }
 
-int aixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
-                                    const char *path)
+int aixacl_sys_acl_delete_def_fd(vfs_handle_struct *handle,
+                                files_struct *fsp)
 {
        return 0; /* otherwise you can't set acl at upper level */
 }
 
-/* VFS operations structure */
-
-static vfs_op_tuple aixacl_op_tuples[] = {
-       /* Disk operations */
-  {SMB_VFS_OP(aixacl_sys_acl_get_file),
-   SMB_VFS_OP_SYS_ACL_GET_FILE,
-   SMB_VFS_LAYER_TRANSPARENT},
-
-  {SMB_VFS_OP(aixacl_sys_acl_get_fd),
-   SMB_VFS_OP_SYS_ACL_GET_FD,
-   SMB_VFS_LAYER_TRANSPARENT},
-
-  {SMB_VFS_OP(aixacl_sys_acl_set_file),
-   SMB_VFS_OP_SYS_ACL_SET_FILE,
-   SMB_VFS_LAYER_TRANSPARENT},
-
-  {SMB_VFS_OP(aixacl_sys_acl_set_fd),
-   SMB_VFS_OP_SYS_ACL_SET_FD,
-   SMB_VFS_LAYER_TRANSPARENT},
-
-  {SMB_VFS_OP(aixacl_sys_acl_delete_def_file),
-   SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
-   SMB_VFS_LAYER_TRANSPARENT},
-
-  {SMB_VFS_OP(NULL),
-   SMB_VFS_OP_NOOP,
-   SMB_VFS_LAYER_NOOP}
+static struct vfs_fn_pointers vfs_aixacl_fns = {
+       .sys_acl_get_fd_fn = aixacl_sys_acl_get_fd,
+       .sys_acl_blob_get_fd_fn = posix_sys_acl_blob_get_fd,
+       .sys_acl_set_fd_fn = aixacl_sys_acl_set_fd,
+       .sys_acl_delete_def_fd_fn = aixacl_sys_acl_delete_def_fd,
 };
 
-NTSTATUS vfs_aixacl_init(void)
+static_decl_vfs;
+NTSTATUS vfs_aixacl_init(TALLOC_CTX *ctx)
 {
        return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "aixacl",
-                               aixacl_op_tuples);
+                               &vfs_aixacl_fns);
 }