vfs: Add vfs_handle_struct argument to smb_set_nt_acl_nfs4 and the callback
[obnox/samba/samba-obnox.git] / source3 / modules / vfs_aixacl2.c
index 01de33ed0bd902a0d525e4e00422e9579357fa5f..aca7a652d6613a64194ab9da5032c801a912056b 100644 (file)
  */
 
 #include "includes.h"
+#include "system/filesys.h"
+#include "smbd/smbd.h"
 #include "nfs4_acls.h"
+#include "vfs_aixacl_util.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_VFS
 
 #define AIXACL2_MODULE_NAME "aixacl2"
 
-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);
-
 typedef union aixjfs2_acl_t {
        nfs4_acl_int_t jfs2_acl[1];
        aixc_acl_t aixc_acl[1];
@@ -155,7 +155,8 @@ static bool aixjfs2_get_nfs4_acl(const char *name,
 
 static NTSTATUS aixjfs2_fget_nt_acl(vfs_handle_struct *handle,
        files_struct *fsp, uint32 security_info,
-       SEC_DESC **ppdesc)
+       TALLOC_CTX *mem_ctx,
+       struct security_descriptor **ppdesc)
 {
        SMB4ACL_T *pacl = NULL;
        bool    result;
@@ -167,17 +168,21 @@ static NTSTATUS aixjfs2_fget_nt_acl(vfs_handle_struct *handle,
        if (retryPosix)
        {
                DEBUG(10, ("retrying with posix acl...\n"));
-               return posix_fget_nt_acl(fsp, security_info, ppdesc);
+               return posix_fget_nt_acl(fsp, security_info,
+                                        mem_ctx, ppdesc);
        }
        if (result==False)
                return NT_STATUS_ACCESS_DENIED;
 
-       return smb_fget_nt_acl_nfs4(fsp, security_info, ppdesc, pacl);
+       return smb_fget_nt_acl_nfs4(fsp, security_info, ppdesc,
+                                   mem_ctx, pacl);
 }
 
 static NTSTATUS aixjfs2_get_nt_acl(vfs_handle_struct *handle,
        const char *name,
-       uint32 security_info, SEC_DESC **ppdesc)
+       uint32 security_info,
+       TALLOC_CTX *mem_ctx,
+       struct security_descriptor **ppdesc)
 {
        SMB4ACL_T *pacl = NULL;
        bool    result;
@@ -189,16 +194,53 @@ static NTSTATUS aixjfs2_get_nt_acl(vfs_handle_struct *handle,
        {
                DEBUG(10, ("retrying with posix acl...\n"));
                return posix_get_nt_acl(handle->conn, name, security_info,
-                                       ppdesc);
+                                       mem_ctx, ppdesc);
        }
        if (result==False)
                return NT_STATUS_ACCESS_DENIED;
 
-       return smb_get_nt_acl_nfs4(handle->conn, name, security_info, ppdesc,
+       return smb_get_nt_acl_nfs4(handle->conn, name, security_info,
+                                  mem_ctx, ppdesc,
                                   pacl);
 }
 
-static SMB_ACL_T aixjfs2_get_posix_acl(const char *path, acl_type_t type)
+static int aixjfs2_sys_acl_blob_get_file(vfs_handle_struct *handle, const char *path_p, TALLOC_CTX *mem_ctx, char **blob_description, DATA_BLOB *blob)
+{
+       SMB4ACL_T *pacl = NULL;
+       bool    result;
+       bool    retryPosix = False;
+
+       *ppdesc = NULL;
+       result = aixjfs2_get_nfs4_acl(path_p, &pacl, &retryPosix);
+       if (retryPosix)
+       {
+               return posix_sys_acl_blob_get_file(handle, path_p, mem_ctx,
+                                                  blob_description, blob);
+       }
+       /* Now way to linarlise NFS4 ACLs at the moment, but the NT ACL is pretty close in this case */
+       errno = ENOSYS;
+       return -1;
+}
+
+static int aixjfs2_sys_acl_blob_get_fd(vfs_handle_struct *handle, files_struct *fsp, TALLOC_CTX *mem_ctx, char **blob_description, DATA_BLOB *blob)
+{
+       SMB4ACL_T *pacl = NULL;
+       bool    result;
+       bool    retryPosix = False;
+
+       result = aixjfs2_get_nfs4_acl(fsp->fsp_name->base_name, &pacl,
+                                     &retryPosix);
+       if (retryPosix)
+       {
+               return posix_sys_acl_blob_get_fd(handle, fsp, mem_ctx, blob_description, blob);
+       }
+
+       /* Now way to linarlise NFS4 ACLs at the moment, but the NT ACL is pretty close in this case */
+       errno = ENOSYS;
+       return -1;
+}
+
+static SMB_ACL_T aixjfs2_get_posix_acl(const char *path, acl_type_t type, TALLOC_CTX *mem_ctx)
 {
         aixc_acl_t *pacl;
        AIXJFS2_ACL_T *acl;
@@ -220,21 +262,22 @@ static SMB_ACL_T aixjfs2_get_posix_acl(const char *path, acl_type_t type)
         DEBUG(10, ("len: %d, mode: %d\n",
                    pacl->acl_len, pacl->acl_mode));
 
-        result = aixacl_to_smbacl(pacl);
+        result = aixacl_to_smbacl(pacl, mem_ctx);
         if (result == NULL) {
                 goto done;
         }
 
  done:
         if (errno != 0) {
-                SAFE_FREE(result);
+                TALLOC_FREE(result);
         }
         return result;
 }
 
 SMB_ACL_T aixjfs2_sys_acl_get_file(vfs_handle_struct *handle,
                                     const char *path_p,
-                                    SMB_ACL_TYPE_T type)
+                                  SMB_ACL_TYPE_T type,
+                                  TALLOC_CTX *mem_ctx)
 {
         acl_type_t aixjfs2_type;
 
@@ -250,7 +293,7 @@ SMB_ACL_T aixjfs2_sys_acl_get_file(vfs_handle_struct *handle,
                 smb_panic("exiting");
         }
 
-        return aixjfs2_get_posix_acl(path_p, aixjfs2_type);
+        return aixjfs2_get_posix_acl(path_p, aixjfs2_type, mem_ctx);
 }
 
 SMB_ACL_T aixjfs2_sys_acl_get_fd(vfs_handle_struct *handle,
@@ -295,7 +338,7 @@ static int aixjfs2_query_acl_support(
        return 1; /* haven't found that ACL type. */
 }
 
-static bool aixjfs2_process_smbacl(files_struct *fsp, SMB4ACL_T *smbacl)
+static bool aixjfs2_process_smbacl(vfs_handle_struct *handle, files_struct *fsp, SMB4ACL_T *smbacl)
 {
        SMB4ACE_T       *smbace;
        TALLOC_CTX      *mem_ctx;
@@ -370,20 +413,21 @@ static bool aixjfs2_process_smbacl(files_struct *fsp, SMB4ACL_T *smbacl)
        return True;
 }
 
-static NTSTATUS aixjfs2_set_nt_acl_common(files_struct *fsp, uint32 security_info_sent, const SEC_DESC *psd)
+static NTSTATUS aixjfs2_set_nt_acl_common(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info_sent, const struct security_descriptor *psd)
 {
        acl_type_t      acl_type_info;
        NTSTATUS        result = NT_STATUS_ACCESS_DENIED;
        int     rc;
 
        rc = aixjfs2_query_acl_support(
+               handle,
                fsp->fsp_name,
                ACL_NFS4,
                &acl_type_info);
 
        if (rc==0)
        {
-               result = smb_set_nt_acl_nfs4(
+               result = smb_set_nt_acl_nfs4(handle,
                        fsp, security_info_sent, psd,
                        aixjfs2_process_smbacl);
        } else if (rc==1) { /* assume POSIX ACL - by default... */
@@ -394,9 +438,9 @@ static NTSTATUS aixjfs2_set_nt_acl_common(files_struct *fsp, uint32 security_inf
        return result;
 }
 
-NTSTATUS aixjfs2_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info_sent, const SEC_DESC *psd)
+NTSTATUS aixjfs2_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info_sent, const struct security_descriptor *psd)
 {
-       return aixjfs2_set_nt_acl_common(fsp, security_info_sent, psd);
+       return aixjfs2_set_nt_acl_common(handle, fsp, security_info_sent, psd);
 }
 
 int aixjfs2_sys_acl_set_file(vfs_handle_struct *handle,
@@ -484,51 +528,22 @@ int aixjfs2_sys_acl_delete_def_file(vfs_handle_struct *handle,
        return 0;
 }
 
-
-/* VFS operations structure */
-
-static vfs_op_tuple aixjfs2_ops[] =
-{
-       {SMB_VFS_OP(aixjfs2_fget_nt_acl),
-       SMB_VFS_OP_FGET_NT_ACL,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_get_nt_acl),
-       SMB_VFS_OP_GET_NT_ACL,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_fset_nt_acl),
-       SMB_VFS_OP_FSET_NT_ACL,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_sys_acl_get_file),
-       SMB_VFS_OP_SYS_ACL_GET_FILE,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_sys_acl_get_fd),
-       SMB_VFS_OP_SYS_ACL_GET_FD,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_sys_acl_set_file),
-       SMB_VFS_OP_SYS_ACL_SET_FILE,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_sys_acl_set_fd),
-       SMB_VFS_OP_SYS_ACL_SET_FD,
-       SMB_VFS_LAYER_TRANSPARENT},
-
-       {SMB_VFS_OP(aixjfs2_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_aixacl2_fns = {
+       .fget_nt_acl_fn = aixjfs2_fget_nt_acl,
+       .get_nt_acl_fn = aixjfs2_get_nt_acl,
+       .fset_nt_acl_fn = aixjfs2_fset_nt_acl,
+       .sys_acl_get_file_fn = aixjfs2_sys_acl_get_file,
+       .sys_acl_get_fd_fn = aixjfs2_sys_acl_get_fd,
+       .sys_acl_blob_get_file_fn = aixjfs2_sys_acl_blob_get_file,
+       .sys_acl_blob_get_fd_fn = aixjfs2_sys_acl_blob_get_fd,
+       .sys_acl_set_file_fn = aixjfs2_sys_acl_set_file,
+       .sys_acl_set_fd_fn = aixjfs2_sys_acl_set_fd,
+       .sys_acl_delete_def_file_fn = aixjfs2_sys_acl_delete_def_file
 };
 
 NTSTATUS vfs_aixacl2_init(void);
 NTSTATUS vfs_aixacl2_init(void)
 {
         return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, AIXACL2_MODULE_NAME,
-                                aixjfs2_ops);
+                               &vfs_aixacl2_fns);
 }