s4:kdc: Implement KDC plugin hardware authentication policy
[samba.git] / source3 / modules / vfs_cap.c
index 181d11c28ac34564678ee38ecd6862da54142dac..3553e118cc2cfcd6fce559e8bbe45ba71ff56885 100644 (file)
@@ -84,10 +84,8 @@ static int cap_get_quota(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_GET_QUOTA(handle, cap_smb_fname, qtype, id, dq);
 }
 
-static struct dirent *cap_readdir(vfs_handle_struct *handle,
-                                 struct files_struct *dirfsp,
-                                 DIR *dirp,
-                                 SMB_STRUCT_STAT *sbuf)
+static struct dirent *
+cap_readdir(vfs_handle_struct *handle, struct files_struct *dirfsp, DIR *dirp)
 {
        struct dirent *result;
        struct dirent *newdirent;
@@ -95,7 +93,7 @@ static struct dirent *cap_readdir(vfs_handle_struct *handle,
        size_t newnamelen;
        DEBUG(3,("cap: cap_readdir\n"));
 
-       result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp, NULL);
+       result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp);
        if (!result) {
                return NULL;
        }
@@ -152,8 +150,7 @@ static int cap_openat(vfs_handle_struct *handle,
                      const struct files_struct *dirfsp,
                      const struct smb_filename *smb_fname_in,
                      files_struct *fsp,
-                     int flags,
-                     mode_t mode)
+                     const struct vfs_open_how *how)
 {
        char *cappath = NULL;
        struct smb_filename *smb_fname = NULL;
@@ -179,9 +176,7 @@ static int cap_openat(vfs_handle_struct *handle,
                                  dirfsp,
                                  smb_fname,
                                  fsp,
-                                 flags,
-                                 mode);
-
+                                 how);
        if (ret == -1) {
                saved_errno = errno;
        }
@@ -203,22 +198,41 @@ static int cap_renameat(vfs_handle_struct *handle,
        char *capnew = NULL;
        struct smb_filename *smb_fname_src_tmp = NULL;
        struct smb_filename *smb_fname_dst_tmp = NULL;
+       struct smb_filename *full_fname_src = NULL;
+       struct smb_filename *full_fname_dst = NULL;
        int ret = -1;
+       int saved_errno = 0;
+
+       full_fname_src = full_path_from_dirfsp_atname(talloc_tos(),
+                                                 srcfsp,
+                                                 smb_fname_src);
+       if (full_fname_src == NULL) {
+               errno = ENOMEM;
+               goto out;
+       }
 
-       capold = capencode(talloc_tos(), smb_fname_src->base_name);
-       capnew = capencode(talloc_tos(), smb_fname_dst->base_name);
+       full_fname_dst = full_path_from_dirfsp_atname(talloc_tos(),
+                                                 dstfsp,
+                                                 smb_fname_dst);
+       if (full_fname_dst == NULL) {
+               errno = ENOMEM;
+               goto out;
+       }
+
+       capold = capencode(talloc_tos(), full_fname_src->base_name);
+       capnew = capencode(talloc_tos(), full_fname_dst->base_name);
        if (!capold || !capnew) {
                errno = ENOMEM;
                goto out;
        }
 
        /* Setup temporary smb_filename structs. */
-       smb_fname_src_tmp = cp_smb_filename(talloc_tos(), smb_fname_src);
+       smb_fname_src_tmp = cp_smb_filename(talloc_tos(), full_fname_src);
        if (smb_fname_src_tmp == NULL) {
                errno = ENOMEM;
                goto out;
        }
-       smb_fname_dst_tmp = cp_smb_filename(talloc_tos(), smb_fname_dst);
+       smb_fname_dst_tmp = cp_smb_filename(talloc_tos(), full_fname_dst);
        if (smb_fname_dst_tmp == NULL) {
                errno = ENOMEM;
                goto out;
@@ -228,17 +242,28 @@ static int cap_renameat(vfs_handle_struct *handle,
        smb_fname_dst_tmp->base_name = capnew;
 
        ret = SMB_VFS_NEXT_RENAMEAT(handle,
-                               srcfsp,
+                               srcfsp->conn->cwd_fsp,
                                smb_fname_src_tmp,
-                               dstfsp,
+                               dstfsp->conn->cwd_fsp,
                                smb_fname_dst_tmp);
 
  out:
+
+       if (ret != 0) {
+               saved_errno = errno;
+       }
+
+       TALLOC_FREE(full_fname_src);
+       TALLOC_FREE(full_fname_dst);
        TALLOC_FREE(capold);
        TALLOC_FREE(capnew);
        TALLOC_FREE(smb_fname_src_tmp);
        TALLOC_FREE(smb_fname_dst_tmp);
 
+       if (ret != 0) {
+               errno = saved_errno;
+       }
+
        return ret;
 }
 
@@ -418,7 +443,7 @@ static int cap_symlinkat(vfs_handle_struct *handle,
        int saved_errno = 0;
        int ret;
 
-       if (!capold || !capnew) {
+       if (capold == NULL) {
                errno = ENOMEM;
                return -1;
        }
@@ -720,86 +745,6 @@ static struct smb_filename *cap_realpath(vfs_handle_struct *handle,
        return return_fname;
 }
 
-static SMB_ACL_T cap_sys_acl_get_file(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
-                               SMB_ACL_TYPE_T type,
-                               TALLOC_CTX *mem_ctx)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       SMB_ACL_T ret;
-       int saved_errno = 0;
-
-       if (!cappath) {
-               errno = ENOMEM;
-               return (SMB_ACL_T)NULL;
-       }
-       cap_smb_fname = synthetic_smb_fname(talloc_tos(),
-                                       cappath,
-                                       NULL,
-                                       NULL,
-                                       smb_fname->twrp,
-                                       smb_fname->flags);
-       if (cap_smb_fname == NULL) {
-               TALLOC_FREE(cappath);
-               errno = ENOMEM;
-               return (SMB_ACL_T)NULL;
-       }
-       ret = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, cap_smb_fname,
-                               type, mem_ctx);
-       if (ret == NULL) {
-               saved_errno = errno;
-       }
-       TALLOC_FREE(cappath);
-       TALLOC_FREE(cap_smb_fname);
-       if (saved_errno != 0) {
-               errno = saved_errno;
-       }
-       return ret;
-}
-
-static ssize_t cap_getxattr(vfs_handle_struct *handle,
-                       const struct smb_filename *smb_fname,
-                       const char *name,
-                       void *value,
-                       size_t size)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       char *capname = capencode(talloc_tos(), name);
-       ssize_t ret;
-       int saved_errno = 0;
-
-       if (!cappath || !capname) {
-               errno = ENOMEM;
-               return -1;
-       }
-       cap_smb_fname = synthetic_smb_fname(talloc_tos(),
-                                       cappath,
-                                       NULL,
-                                       NULL,
-                                       smb_fname->twrp,
-                                       smb_fname->flags);
-       if (cap_smb_fname == NULL) {
-               TALLOC_FREE(cappath);
-               TALLOC_FREE(capname);
-               errno = ENOMEM;
-               return -1;
-       }
-       ret = SMB_VFS_NEXT_GETXATTR(handle, cap_smb_fname,
-                       capname, value, size);
-       if (ret == -1) {
-               saved_errno = errno;
-       }
-       TALLOC_FREE(cappath);
-       TALLOC_FREE(capname);
-       TALLOC_FREE(cap_smb_fname);
-       if (saved_errno) {
-               errno = saved_errno;
-       }
-       return ret;
-}
-
 static ssize_t cap_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp, const char *path, void *value, size_t size)
 {
        char *cappath = capencode(talloc_tos(), path);
@@ -873,11 +818,20 @@ static NTSTATUS cap_read_dfs_pathat(struct vfs_handle_struct *handle,
                        struct referral **ppreflist,
                        size_t *preferral_count)
 {
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
+       struct smb_filename *full_fname = NULL;
        struct smb_filename *cap_smb_fname = NULL;
+       char *cappath = NULL;
        NTSTATUS status;
 
+       full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+                                               dirfsp,
+                                               smb_fname);
+       if (full_fname == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       cappath = capencode(talloc_tos(), full_fname->base_name);
        if (cappath == NULL) {
+               TALLOC_FREE(full_fname);
                return NT_STATUS_NO_MEMORY;
        }
        cap_smb_fname = synthetic_smb_fname(talloc_tos(),
@@ -887,13 +841,14 @@ static NTSTATUS cap_read_dfs_pathat(struct vfs_handle_struct *handle,
                                smb_fname->twrp,
                                smb_fname->flags);
        if (cap_smb_fname == NULL) {
+               TALLOC_FREE(full_fname);
                TALLOC_FREE(cappath);
                return NT_STATUS_NO_MEMORY;
        }
 
        status = SMB_VFS_NEXT_READ_DFS_PATHAT(handle,
                        mem_ctx,
-                       dirfsp,
+                       handle->conn->cwd_fsp,
                        cap_smb_fname,
                        ppreflist,
                        preferral_count);
@@ -903,6 +858,7 @@ static NTSTATUS cap_read_dfs_pathat(struct vfs_handle_struct *handle,
                smb_fname->st = cap_smb_fname->st;
        }
 
+       TALLOC_FREE(full_fname);
        TALLOC_FREE(cappath);
        TALLOC_FREE(cap_smb_fname);
        return status;
@@ -925,8 +881,6 @@ static struct vfs_fn_pointers vfs_cap_fns = {
        .linkat_fn = cap_linkat,
        .mknodat_fn = cap_mknodat,
        .realpath_fn = cap_realpath,
-       .sys_acl_get_file_fn = cap_sys_acl_get_file,
-       .getxattr_fn = cap_getxattr,
        .getxattrat_send_fn = vfs_not_implemented_getxattrat_send,
        .getxattrat_recv_fn = vfs_not_implemented_getxattrat_recv,
        .fgetxattr_fn = cap_fgetxattr,