smbd: Fix a typo in a few places
[samba.git] / source3 / modules / vfs_posixacl.c
index ed8f1bae8f0305f3ec57d85c8241703ad27bebbc..feb819de98259dc176651e86cde45a5089e67c27 100644 (file)
@@ -33,14 +33,14 @@ static acl_t smb_acl_to_posix(const struct smb_acl_t *acl);
 
 /* 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:
@@ -53,24 +53,20 @@ SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
                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;
        }
@@ -80,16 +76,19 @@ SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
        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:
@@ -99,42 +98,46 @@ int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
                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,
@@ -272,7 +275,8 @@ static int smb_acl_set_mode(acl_entry_t entry, SMB_ACL_PERM_T perm)
            ((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)
@@ -371,16 +375,13 @@ 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",