]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: add open_internal_dirfsp_at()
authorRalph Boehme <slow@samba.org>
Mon, 16 Mar 2020 17:53:15 +0000 (18:53 +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 310eab374a64d0657de70e4813627e2296d1ce88..433c9b00866608df30e90a8b995ceea99429120f 100644 (file)
@@ -169,7 +169,7 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
  * 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.
+ * opening of the directory. Otherwise use open_internal_dirfsp_at().
  */
 NTSTATUS create_internal_dirfsp_at(connection_struct *conn,
                                   struct files_struct *dirfsp,
@@ -214,6 +214,42 @@ NTSTATUS create_internal_dirfsp_at(connection_struct *conn,
        return NT_STATUS_OK;
 }
 
+/*
+ * Open an internal fsp for an *existing* directory.
+ */
+NTSTATUS open_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;
+       int open_flags = O_RDONLY;
+       NTSTATUS status;
+
+       SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+
+       status = create_internal_dirfsp_at(conn, dirfsp, smb_dname, &fsp);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+#ifdef O_DIRECTORY
+       open_flags |= O_DIRECTORY;
+#endif
+       status = fd_open(conn, fsp, open_flags, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_INFO("Could not open fd for %s (%s)\n",
+                        smb_fname_str_dbg(smb_dname),
+                        nt_errstr(status));
+               file_free(NULL, fsp);
+               return status;
+       }
+
+
+       *_fsp = fsp;
+       return NT_STATUS_OK;
+}
+
 /****************************************************************************
  Close all open files for a connection.
 ****************************************************************************/
index 6bfba095210e288db4f32ee89a3d3535b65d780a..c79e82fb69d6780688806415de5e90d234da1d7e 100644 (file)
@@ -424,9 +424,10 @@ NTSTATUS create_internal_dirfsp_at(connection_struct *conn,
                                   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);
+NTSTATUS open_internal_dirfsp_at(connection_struct *conn,
+                                struct files_struct *dirfsp,
+                                const struct smb_filename *smb_dname,
+                                struct files_struct **_fsp);
 
 /* The following definitions come from smbd/ipc.c  */