smbd: Fix a typo in a few places
[samba.git] / source3 / modules / vfs_cap.c
index 5c2474e66e79b1757010da4d125f27c398668115..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;
+       }
+
+       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(), smb_fname_src->base_name);
-       capnew = capencode(talloc_tos(), smb_fname_dst->base_name);
+       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;
 }
 
@@ -333,40 +358,6 @@ static int cap_unlinkat(vfs_handle_struct *handle,
        return ret;
 }
 
-static int cap_chmod(vfs_handle_struct *handle,
-                       const struct smb_filename *smb_fname,
-                       mode_t mode)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       int ret;
-       int saved_errno;
-
-       if (!cappath) {
-               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);
-               errno = ENOMEM;
-               return -1;
-       }
-
-       ret = SMB_VFS_NEXT_CHMOD(handle, cap_smb_fname, mode);
-       saved_errno = errno;
-       TALLOC_FREE(cappath);
-       TALLOC_FREE(cap_smb_fname);
-       errno = saved_errno;
-       return ret;
-}
-
 static int cap_lchown(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        uid_t uid,
@@ -439,36 +430,6 @@ static int cap_chdir(vfs_handle_struct *handle,
        return ret;
 }
 
-static int cap_ntimes(vfs_handle_struct *handle,
-                     const struct smb_filename *smb_fname,
-                     struct smb_file_time *ft)
-{
-       struct smb_filename *smb_fname_tmp = NULL;
-       char *cappath = NULL;
-       int ret;
-
-       cappath = capencode(talloc_tos(), smb_fname->base_name);
-
-       if (!cappath) {
-               errno = ENOMEM;
-               return -1;
-       }
-
-       /* Setup temporary smb_filename structs. */
-       smb_fname_tmp = cp_smb_filename(talloc_tos(), smb_fname);
-       if (smb_fname_tmp == NULL) {
-               errno = ENOMEM;
-               return -1;
-       }
-
-       smb_fname_tmp->base_name = cappath;
-
-       ret = SMB_VFS_NEXT_NTIMES(handle, smb_fname_tmp, ft);
-
-       TALLOC_FREE(smb_fname_tmp);
-       return ret;
-}
-
 static int cap_symlinkat(vfs_handle_struct *handle,
                        const struct smb_filename *link_contents,
                        struct files_struct *dirfsp,
@@ -482,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;
        }
@@ -784,121 +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 int cap_sys_acl_delete_def_file(vfs_handle_struct *handle,
-                       const struct smb_filename *smb_fname)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       int ret;
-       int saved_errno = 0;
-
-       if (!cappath) {
-               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);
-               errno = ENOMEM;
-               return -1;
-       }
-       ret = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, cap_smb_fname);
-       if (ret == -1) {
-               saved_errno = errno;
-       }
-       TALLOC_FREE(cappath);
-       TALLOC_FREE(cap_smb_fname);
-       if (saved_errno) {
-               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);
@@ -910,45 +756,6 @@ static ssize_t cap_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp
         return SMB_VFS_NEXT_FGETXATTR(handle, fsp, cappath, value, size);
 }
 
-static int cap_removexattr(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
-                               const char *name)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       char *capname = capencode(talloc_tos(), name);
-       int 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_REMOVEXATTR(handle, cap_smb_fname, capname);
-       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 int cap_fremovexattr(vfs_handle_struct *handle, struct files_struct *fsp, const char *path)
 {
        char *cappath = capencode(talloc_tos(), path);
@@ -960,49 +767,6 @@ static int cap_fremovexattr(vfs_handle_struct *handle, struct files_struct *fsp,
         return SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, cappath);
 }
 
-static int cap_setxattr(vfs_handle_struct *handle,
-                       const struct smb_filename *smb_fname,
-                       const char *name,
-                       const void *value,
-                       size_t size,
-                       int flags)
-{
-       struct smb_filename *cap_smb_fname = NULL;
-       char *cappath = capencode(talloc_tos(), smb_fname->base_name);
-       char *capname = capencode(talloc_tos(), name);
-       int 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_SETXATTR(handle, cap_smb_fname,
-                               capname, value, size, flags);
-       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 int cap_fsetxattr(vfs_handle_struct *handle, struct files_struct *fsp, const char *path, const void *value, size_t size, int flags)
 {
        char *cappath = capencode(talloc_tos(), path);
@@ -1054,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(),
@@ -1068,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);
@@ -1084,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;
@@ -1099,24 +874,17 @@ static struct vfs_fn_pointers vfs_cap_fns = {
        .stat_fn = cap_stat,
        .lstat_fn = cap_lstat,
        .unlinkat_fn = cap_unlinkat,
-       .chmod_fn = cap_chmod,
        .lchown_fn = cap_lchown,
        .chdir_fn = cap_chdir,
-       .ntimes_fn = cap_ntimes,
        .symlinkat_fn = cap_symlinkat,
        .readlinkat_fn = cap_readlinkat,
        .linkat_fn = cap_linkat,
        .mknodat_fn = cap_mknodat,
        .realpath_fn = cap_realpath,
-       .sys_acl_get_file_fn = cap_sys_acl_get_file,
-       .sys_acl_delete_def_file_fn = cap_sys_acl_delete_def_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,
-       .removexattr_fn = cap_removexattr,
        .fremovexattr_fn = cap_fremovexattr,
-       .setxattr_fn = cap_setxattr,
        .fsetxattr_fn = cap_fsetxattr,
        .create_dfs_pathat_fn = cap_create_dfs_pathat,
        .read_dfs_pathat_fn = cap_read_dfs_pathat