return size;
}
-SMB_ACL_T posixacl_xattr_acl_get_file(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname,
- SMB_ACL_TYPE_T type,
- TALLOC_CTX *mem_ctx)
-{
- int ret;
- int size;
- char *buf;
- const char *name;
-
- if (type == SMB_ACL_TYPE_ACCESS) {
- name = ACL_EA_ACCESS;
- } else if (type == SMB_ACL_TYPE_DEFAULT) {
- name = ACL_EA_DEFAULT;
- } else {
- errno = EINVAL;
- return NULL;
- }
-
- size = ACL_EA_SIZE(20);
- buf = alloca(size);
- if (!buf) {
- return NULL;
- }
-
- ret = SMB_VFS_GETXATTR(handle->conn, smb_fname,
- name, buf, size);
- if (ret < 0 && errno == ERANGE) {
- size = SMB_VFS_GETXATTR(handle->conn, smb_fname,
- name, NULL, 0);
- if (size > 0) {
- buf = alloca(size);
- if (!buf) {
- return NULL;
- }
- ret = SMB_VFS_GETXATTR(handle->conn,
- smb_fname, name,
- buf, size);
- }
- }
-
- if (ret > 0) {
- return posixacl_xattr_to_smb_acl(buf, ret, mem_ctx);
- }
- if (ret == 0 || errno == ENOATTR) {
- mode_t mode = 0;
- TALLOC_CTX *frame = talloc_stackframe();
- struct smb_filename *smb_fname_tmp =
- cp_smb_filename_nostream(frame, smb_fname);
- if (smb_fname_tmp == NULL) {
- errno = ENOMEM;
- ret = -1;
- } else {
- ret = SMB_VFS_STAT(handle->conn, smb_fname_tmp);
- if (ret == 0) {
- mode = smb_fname_tmp->st.st_ex_mode;
- }
- }
- TALLOC_FREE(frame);
- if (ret == 0) {
- if (type == SMB_ACL_TYPE_ACCESS) {
- return mode_to_smb_acl(mode, mem_ctx);
- }
- if (S_ISDIR(mode)) {
- return sys_acl_init(mem_ctx);
- }
- errno = EACCES;
- }
- }
- return NULL;
-}
-
SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
SMB_ACL_TYPE_T type,
#ifndef __POSIXACL_XATTR_H__
#define __POSIXACL_XATTR_H__
-SMB_ACL_T posixacl_xattr_acl_get_file(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname,
- SMB_ACL_TYPE_T type,
- TALLOC_CTX *mem_ctx);
-
SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
SMB_ACL_TYPE_T type,