X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source3%2Fmodules%2Fvfs_aixacl2.c;h=fcf964b512f28725c6a01a889982eeb196dbc695;hb=HEAD;hp=a2a04768592c64dd2d6e233fcbc2febc4bc86b87;hpb=02882b44df9653ac1378bc1d7e279f03b370477c;p=samba.git diff --git a/source3/modules/vfs_aixacl2.c b/source3/modules/vfs_aixacl2.c index a2a04768592..923b54fc9c2 100644 --- a/source3/modules/vfs_aixacl2.c +++ b/source3/modules/vfs_aixacl2.c @@ -179,65 +179,12 @@ static NTSTATUS aixjfs2_fget_nt_acl(vfs_handle_struct *handle, return NT_STATUS_ACCESS_DENIED; } - status = smb_fget_nt_acl_nfs4(fsp, NULL, security_info, ppdesc, - mem_ctx, pacl); + status = smb_fget_nt_acl_nfs4( + fsp, NULL, security_info, mem_ctx, ppdesc, pacl); TALLOC_FREE(frame); return status; } -static NTSTATUS aixjfs2_get_nt_acl(vfs_handle_struct *handle, - const struct smb_filename *smb_fname, - uint32_t security_info, - TALLOC_CTX *mem_ctx, - struct security_descriptor **ppdesc) -{ - struct SMB4ACL_T *pacl = NULL; - bool result; - bool retryPosix = False; - - *ppdesc = NULL; - result = aixjfs2_get_nfs4_acl(mem_ctx, - smb_fname->base_name, - &pacl, - &retryPosix); - if (retryPosix) - { - DEBUG(10, ("retrying with posix acl...\n")); - return posix_get_nt_acl(handle->conn, - smb_fname, - security_info, - mem_ctx, - ppdesc); - } - if (result==False) - return NT_STATUS_ACCESS_DENIED; - - return smb_get_nt_acl_nfs4(handle->conn, - smb_fname, - NULL, - security_info, - mem_ctx, - ppdesc, - pacl); -} - -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) -{ - struct SMB4ACL_T *pacl = NULL; - bool result; - bool retryPosix = False; - - result = aixjfs2_get_nfs4_acl(mem_ctx, 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) { struct SMB4ACL_T *pacl = NULL; @@ -290,10 +237,10 @@ static SMB_ACL_T aixjfs2_get_posix_acl(const char *path, acl_type_t type, TALLOC return result; } -SMB_ACL_T aixjfs2_sys_acl_get_file(vfs_handle_struct *handle, - const char *path_p, - SMB_ACL_TYPE_T type, - TALLOC_CTX *mem_ctx) +SMB_ACL_T aixjfs2_sys_acl_get_fd(vfs_handle_struct *handle, + files_struct *fsp, + SMB_ACL_TYPE_T type, + TALLOC_CTX *mem_ctx) { acl_type_t aixjfs2_type; @@ -309,15 +256,6 @@ SMB_ACL_T aixjfs2_sys_acl_get_file(vfs_handle_struct *handle, smb_panic("exiting"); } - return aixjfs2_get_posix_acl(path_p, aixjfs2_type, mem_ctx); -} - -SMB_ACL_T aixjfs2_sys_acl_get_fd(vfs_handle_struct *handle, - files_struct *fsp, TALLOC_CTX *mem_ctx) -{ - acl_type_t aixjfs2_type; - aixjfs2_type.u64 = ACL_AIXC; - return aixjfs2_get_posix_acl(fsp->fsp_name->base_name, aixjfs2_type, mem_ctx); } @@ -396,7 +334,7 @@ static bool aixjfs2_process_smbacl(vfs_handle_struct *handle, memset(jfs2_ace, 0, entryLen); jfs2_ace->entryLen = entryLen; /* won't store textual "who" */ - jfs2_ace->aceType = aceprop->aceType; /* only ACCES|DENY supported by jfs2 */ + jfs2_ace->aceType = aceprop->aceType; /* only ACCESS|DENY supported by jfs2 */ jfs2_ace->aceFlags = aceprop->aceFlags; jfs2_ace->aceMask = aceprop->aceMask; jfs2_ace->flags = (aceprop->flags&SMB_ACE4_ID_SPECIAL) ? ACE4_ID_SPECIAL : 0; @@ -446,7 +384,7 @@ static NTSTATUS aixjfs2_set_nt_acl_common(vfs_handle_struct *handle, files_struc if (rc==0) { result = smb_set_nt_acl_nfs4(handle, - fsp, security_info_sent, psd, + fsp, NULL, security_info_sent, psd, aixjfs2_process_smbacl); } else if (rc==1) { /* assume POSIX ACL - by default... */ result = set_nt_acl(fsp, security_info_sent, psd); @@ -461,53 +399,16 @@ NTSTATUS aixjfs2_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint3 return aixjfs2_set_nt_acl_common(handle, fsp, security_info_sent, psd); } -int aixjfs2_sys_acl_set_file(vfs_handle_struct *handle, - const char *name, - SMB_ACL_TYPE_T type, - SMB_ACL_T theacl) -{ - struct acl *acl_aixc; - acl_type_t acl_type_info; - int rc; - - DEBUG(10, ("aixjfs2_sys_acl_set_file invoked for %s", name)); - - rc = aixjfs2_query_acl_support((char *)name, ACL_AIXC, &acl_type_info); - if (rc) { - DEBUG(8, ("jfs2_set_nt_acl: AIXC support not found\n")); - return -1; - } - - acl_aixc = aixacl_smb_to_aixacl(type, theacl); - if (!acl_aixc) - return -1; - - rc = aclx_put( - (char *)name, - SET_ACL, /* set only the ACL, not mode bits */ - acl_type_info, - acl_aixc, - acl_aixc->acl_len, - 0 - ); - if (rc) { - DEBUG(2, ("aclx_put failed with %s for %s\n", - strerror(errno), name)); - return -1; - } - - return 0; -} - int aixjfs2_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, + SMB_ACL_TYPE_T type, SMB_ACL_T theacl) { struct acl *acl_aixc; acl_type_t acl_type_info; int rc; - DEBUG(10, ("aixjfs2_sys_acl_set_fd invoked for %s", fsp_str_dbg(fsp))); + DEBUG(10, ("aixjfs2_sys_acl_set_fd invoked for %s\n", fsp_str_dbg(fsp))); rc = aixjfs2_query_acl_support(fsp->fsp_name->base_name, ACL_AIXC, &acl_type_info); @@ -516,12 +417,24 @@ int aixjfs2_sys_acl_set_fd(vfs_handle_struct *handle, return -1; } - acl_aixc = aixacl_smb_to_aixacl(SMB_ACL_TYPE_ACCESS, theacl); + acl_aixc = aixacl_smb_to_aixacl(type, theacl); if (!acl_aixc) return -1; + if (fsp->fsp_flags.is_pathref) { + /* + * This is no longer a handle based call. + */ + return aclx_put(fsp->fsp_name->base_name, + SET_ACL, + acl_type_info, + acl_aixc, + acl_aixc->acl_len, + 0); + } + rc = aclx_fput( - fsp->fh->fd, + fsp_get_io_fd(fsp), SET_ACL, /* set only the ACL, not mode bits */ acl_type_info, acl_aixc, @@ -537,8 +450,8 @@ int aixjfs2_sys_acl_set_fd(vfs_handle_struct *handle, return 0; } -int aixjfs2_sys_acl_delete_def_file(vfs_handle_struct *handle, - const char *path) +int aixjfs2_sys_acl_delete_def_fd(vfs_handle_struct *handle, + files_struct *fsp) { /* Not available under AIXC ACL */ /* Don't report here any error otherwise */ @@ -547,20 +460,20 @@ int aixjfs2_sys_acl_delete_def_file(vfs_handle_struct *handle, } static struct vfs_fn_pointers vfs_aixacl2_fns = { + .stat_fn = nfs4_acl_stat, + .fstat_fn = nfs4_acl_fstat, + .lstat_fn = nfs4_acl_lstat, + .fstatat_fn = nfs4_acl_fstatat, .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 + .sys_acl_delete_def_fd_fn = aixjfs2_sys_acl_delete_def_fd }; -NTSTATUS vfs_aixacl2_init(void); -NTSTATUS vfs_aixacl2_init(void) +static_decl_vfs; +NTSTATUS vfs_aixacl2_init(TALLOC_CTX *ctx) { return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, AIXACL2_MODULE_NAME, &vfs_aixacl2_fns);