]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: add create_internal_dirfsp_at()
authorRalph Boehme <slow@samba.org>
Mon, 23 Mar 2020 10:36:42 +0000 (11:36 +0100)
committerJeremy Allison <jra@samba.org>
Tue, 24 Mar 2020 19:48:41 +0000 (19:48 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/files.c
source3/smbd/proto.h

index a9e63192f61cf74baf0505b2f163ce2e81bf7765..310eab374a64d0657de70e4813627e2296d1ce88 100644 (file)
@@ -165,6 +165,55 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
        return NT_STATUS_OK;
 }
 
+/*
+ * Create an internal fsp for an *existing* directory.
+ *
+ * This should only be used by callers in the VFS that need to control the
+ * opening of the directory.
+ */
+NTSTATUS create_internal_dirfsp_at(connection_struct *conn,
+                                  struct files_struct *dirfsp,
+                                  const struct smb_filename *smb_dname,
+                                  struct files_struct **_fsp)
+{
+       struct files_struct *fsp = NULL;
+       NTSTATUS status;
+
+       SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+
+       status = file_new(NULL, conn, &fsp);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       status = fsp_set_smb_fname(fsp, smb_dname);
+       if (!NT_STATUS_IS_OK(status)) {
+               file_free(NULL, fsp);
+               return status;
+       }
+
+       if (!VALID_STAT(fsp->fsp_name->st)) {
+               status = vfs_stat_fsp(fsp);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
+               }
+       }
+
+       if (!S_ISDIR(fsp->fsp_name->st.st_ex_mode)) {
+               DBG_ERR("%s is not a directory!\n",
+                       smb_fname_str_dbg(smb_dname));
+                file_free(NULL, fsp);
+               return NT_STATUS_NOT_A_DIRECTORY;
+       }
+
+       fsp->file_id = vfs_file_id_from_sbuf(conn, &fsp->fsp_name->st);
+       fsp->access_mask = FILE_LIST_DIRECTORY;
+       fsp->is_directory = true;
+
+       *_fsp = fsp;
+       return NT_STATUS_OK;
+}
+
 /****************************************************************************
  Close all open files for a connection.
 ****************************************************************************/
index 9f77c956e13193cf8a3cb28a64d36322a24ac4db..6bfba095210e288db4f32ee89a3d3535b65d780a 100644 (file)
@@ -419,6 +419,15 @@ NTSTATUS fsp_set_smb_fname(struct files_struct *fsp,
                           const struct smb_filename *smb_fname_in);
 size_t fsp_fullbasepath(struct files_struct *fsp, char *buf, size_t buflen);
 
+NTSTATUS create_internal_dirfsp_at(connection_struct *conn,
+                                  struct files_struct *dirfsp,
+                                  const struct smb_filename *smb_dname,
+                                  struct files_struct **_fsp);
+
+NTSTATUS open_internal_dir_fsp(connection_struct *conn,
+                              const struct smb_filename *smb_dname,
+                              struct files_struct **_fsp);
+
 /* The following definitions come from smbd/ipc.c  */
 
 NTSTATUS nt_status_np_pipe(NTSTATUS status);