/* public functions - the api */
-SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
- const char *path_p,
- SMB_ACL_TYPE_T type,
- TALLOC_CTX *mem_ctx)
+SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
struct smb_acl_t *result;
+ acl_t acl = NULL;
acl_type_t acl_type;
- acl_t acl;
switch(type) {
case SMB_ACL_TYPE_ACCESS:
errno = EINVAL;
return NULL;
}
-
- acl = acl_get_file(path_p, acl_type);
-
- if (acl == NULL) {
- return NULL;
+ if (!fsp->fsp_flags.is_pathref && (acl_type == ACL_TYPE_ACCESS)) {
+ /* POSIX API only allows ACL_TYPE_ACCESS fetched on fd. */
+ acl = acl_get_fd(fsp_get_io_fd(fsp));
+ } else if (fsp->fsp_flags.have_proc_fds) {
+ int fd = fsp_get_pathref_fd(fsp);
+ struct sys_proc_fd_path_buf buf;
+
+ acl = acl_get_file(sys_proc_fd_path(fd, &buf), acl_type);
+ } else {
+ /*
+ * This is no longer a handle based call.
+ */
+ acl = acl_get_file(fsp->fsp_name->base_name, acl_type);
}
-
- result = smb_acl_to_internal(acl, mem_ctx);
- acl_free(acl);
- return result;
-}
-
-SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
-{
- struct smb_acl_t *result;
- acl_t acl = acl_get_fd(fsp->fh->fd);
-
if (acl == NULL) {
return NULL;
}
return result;
}
-int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
- const char *name,
- SMB_ACL_TYPE_T type,
- SMB_ACL_T theacl)
+int posixacl_sys_acl_set_fd(vfs_handle_struct *handle,
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ SMB_ACL_T theacl)
{
int res;
+ acl_t acl = smb_acl_to_posix(theacl);
acl_type_t acl_type;
- acl_t acl;
+ int fd = fsp_get_pathref_fd(fsp);
- DEBUG(10, ("Calling acl_set_file: %s, %d\n", name, type));
+ if (acl == NULL) {
+ return -1;
+ }
switch(type) {
case SMB_ACL_TYPE_ACCESS:
acl_type = ACL_TYPE_DEFAULT;
break;
default:
+ acl_free(acl);
errno = EINVAL;
return -1;
}
- if ((acl = smb_acl_to_posix(theacl)) == NULL) {
- return -1;
- }
- res = acl_set_file(name, acl_type, acl);
- if (res != 0) {
- DEBUG(10, ("acl_set_file failed: %s\n", strerror(errno)));
+ if (!fsp->fsp_flags.is_pathref && type == SMB_ACL_TYPE_ACCESS) {
+ res = acl_set_fd(fd, acl);
+ } else if (fsp->fsp_flags.have_proc_fds) {
+ struct sys_proc_fd_path_buf buf;
+
+ res = acl_set_file(sys_proc_fd_path(fd, &buf), acl_type, acl);
+ } else {
+ /*
+ * This is no longer a handle based call.
+ */
+ res = acl_set_file(fsp->fsp_name->base_name,
+ acl_type,
+ acl);
}
+
acl_free(acl);
return res;
}
-int posixacl_sys_acl_set_fd(vfs_handle_struct *handle,
- files_struct *fsp,
- SMB_ACL_T theacl)
+int posixacl_sys_acl_delete_def_fd(vfs_handle_struct *handle,
+ files_struct *fsp)
{
- int res;
- acl_t acl = smb_acl_to_posix(theacl);
- if (acl == NULL) {
- return -1;
+ if (fsp->fsp_flags.have_proc_fds) {
+ int fd = fsp_get_pathref_fd(fsp);
+ struct sys_proc_fd_path_buf buf;
+
+ return acl_delete_def_file(sys_proc_fd_path(fd, &buf));
}
- res = acl_set_fd(fsp->fh->fd, acl);
- acl_free(acl);
- return res;
-}
-int posixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
-{
- return acl_delete_def_file(smb_fname->base_name);
+ /*
+ * This is no longer a handle based call.
+ */
+ return acl_delete_def_file(fsp->fsp_name->base_name);
}
-
/* private functions */
static bool smb_ace_to_internal(acl_entry_t posix_ace,
((ret = acl_add_perm(permset, ACL_EXECUTE)) != 0)) {
return ret;
}
- return acl_set_permset(entry, permset);
+
+ return 0;
}
static acl_t smb_acl_to_posix(const struct smb_acl_t *acl)
/* VFS operations structure */
static struct vfs_fn_pointers posixacl_fns = {
- .sys_acl_get_file_fn = posixacl_sys_acl_get_file,
.sys_acl_get_fd_fn = posixacl_sys_acl_get_fd,
- .sys_acl_blob_get_file_fn = posix_sys_acl_blob_get_file,
.sys_acl_blob_get_fd_fn = posix_sys_acl_blob_get_fd,
- .sys_acl_set_file_fn = posixacl_sys_acl_set_file,
.sys_acl_set_fd_fn = posixacl_sys_acl_set_fd,
- .sys_acl_delete_def_file_fn = posixacl_sys_acl_delete_def_file,
+ .sys_acl_delete_def_fd_fn = posixacl_sys_acl_delete_def_fd,
};
-NTSTATUS vfs_posixacl_init(TALLOC_CTX *);
+static_decl_vfs;
NTSTATUS vfs_posixacl_init(TALLOC_CTX *ctx)
{
return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "posixacl",