static NTSTATUS skel_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
static NTSTATUS skel_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
{
return SMB_VFS_NEXT_CREATE_FILE(handle,
req,
+ dirfsp,
smb_fname,
access_mask,
share_access,
* Version 43 - Move SMB_VFS_GET_NT_ACL() -> SMB_VFS_GET_NT_ACL_AT().
* Version 43 - Remove root_dir_fid from SMB_VFS_CREATE_FILE().
* Version 43 - Add dirfsp to struct files_struct
+ * Version 43 - Add dirfsp args to SMB_VFS_CREATE_FILE()
*/
#define SMB_VFS_INTERFACE_VERSION 43
int flags, mode_t mode);
NTSTATUS (*create_file_fn)(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
int flags, mode_t mode);
NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
files_struct *fsp, int flags, mode_t mode);
NTSTATUS vfs_not_implemented_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
#define SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode) \
smb_vfs_call_open((handle)->next, (fname), (fsp), (flags), (mode))
-#define SMB_VFS_CREATE_FILE(conn, req, smb_fname, access_mask, share_access, create_disposition, \
+#define SMB_VFS_CREATE_FILE(conn, req, dirfsp, smb_fname, access_mask, share_access, create_disposition, \
create_options, file_attributes, oplock_request, lease, allocation_size, private_flags, sd, ea_list, result, pinfo, in_context_blobs, out_context_blobs) \
- smb_vfs_call_create_file((conn)->vfs_handles, (req), (smb_fname), (access_mask), (share_access), (create_disposition), \
+ smb_vfs_call_create_file((conn)->vfs_handles, (req), (dirfsp), (smb_fname), (access_mask), (share_access), (create_disposition), \
(create_options), (file_attributes), (oplock_request), (lease), (allocation_size), (private_flags), (sd), (ea_list), (result), (pinfo), \
(in_context_blobs), (out_context_blobs))
-#define SMB_VFS_NEXT_CREATE_FILE(handle, req, smb_fname, access_mask, share_access, create_disposition, \
+#define SMB_VFS_NEXT_CREATE_FILE(handle, req, dirfsp, smb_fname, access_mask, share_access, create_disposition, \
create_options, file_attributes, oplock_request, lease, allocation_size, private_flags, sd, ea_list, result, pinfo, in_context_blobs, out_context_blobs) \
- smb_vfs_call_create_file((handle)->next, (req), (smb_fname), (access_mask), (share_access), (create_disposition), \
+ smb_vfs_call_create_file((handle)->next, (req), (dirfsp), (smb_fname), (access_mask), (share_access), (create_disposition), \
(create_options), (file_attributes), (oplock_request), (lease), (allocation_size), (private_flags), (sd), (ea_list), (result), (pinfo), \
(in_context_blobs), (out_context_blobs))
status = SMB_VFS_CREATE_FILE(
handle->conn, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
stream_name, /* fname */
FILE_GENERIC_WRITE, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(
handle->conn, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
stream_name, /* fname */
FILE_GENERIC_WRITE, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(
handle->conn,
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
adpath,
FILE_READ_DATA|FILE_WRITE_DATA,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
status = SMB_VFS_CREATE_FILE(
handle->conn, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_READ_ATTRIBUTES, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
handle->conn,
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
sname,
FILE_READ_DATA|DELETE_ACCESS,
FILE_SHARE_READ,
status = SMB_VFS_CREATE_FILE(
handle->conn, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
adp_smb_fname,
access_mask,
share_access,
static NTSTATUS vfswrap_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
const struct smb2_create_blobs *in_context_blobs,
struct smb2_create_blobs *out_context_blobs)
{
- return create_file_default(handle->conn, req, smb_fname,
+ return create_file_default(handle->conn, req, dirfsp, smb_fname,
access_mask, share_access,
create_disposition, create_options,
file_attributes, oplock_request, lease,
status = SMB_VFS_CREATE_FILE(
handle->conn, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
stream_name, /* fname */
FILE_READ_DATA, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
static NTSTATUS fruit_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
}
status = SMB_VFS_NEXT_CREATE_FILE(
- handle, req, smb_fname,
+ handle, req, dirfsp, smb_fname,
access_mask, share_access,
create_disposition, create_options,
file_attributes, oplock_request,
status = SMB_VFS_NEXT_CREATE_FILE(
handle, /* conn */
NULL, /* req */
+ &handle->conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
static NTSTATUS smb_full_audit_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
result = SMB_VFS_NEXT_CREATE_FILE(
handle, /* handle */
req, /* req */
+ dirfsp,
smb_fname, /* fname */
access_mask, /* access_mask */
share_access, /* share_access */
*/
static NTSTATUS mh_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
status = SMB_VFS_NEXT_CREATE_FILE(
handle,
req,
+ dirfsp,
smb_fname,
access_mask,
share_access,
status = SMB_VFS_NEXT_CREATE_FILE(
handle,
req,
+ dirfsp,
clientFname,
access_mask,
share_access,
NTSTATUS vfs_not_implemented_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *fname,
uint32_t access_mask,
uint32_t share_access,
result = SMB_VFS_NEXT_CREATE_FILE(
handle, /* handle */
req, /* req */
+ dirfsp, /* dirfsp */
fname, /* fname */
access_mask, /* access_mask */
share_access, /* share_access */
static NTSTATUS um_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
return SMB_VFS_NEXT_CREATE_FILE(
handle,
req,
+ dirfsp,
smb_fname,
access_mask,
share_access,
status = SMB_VFS_NEXT_CREATE_FILE(
handle,
req,
+ dirfsp,
client_fname,
access_mask,
share_access,
static NTSTATUS vfs_worm_create_file(vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
}
status = SMB_VFS_NEXT_CREATE_FILE(
- handle, req, smb_fname, access_mask,
+ handle, req, dirfsp, smb_fname, access_mask,
share_access, create_disposition, create_options,
file_attributes, oplock_request, lease, allocation_size,
private_flags, sd, ea_list, result, pinfo,
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
nt_status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
nt_status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_READ_ATTRIBUTES, /* access_mask */
FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
nt_status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_WRITE_ATTRIBUTES, /* access_mask */
FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_cp, /* fname */
FILE_WRITE_ATTRIBUTES, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_access, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_access, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_src, /* fname */
FILE_READ_DATA|FILE_READ_ATTRIBUTES|
FILE_READ_EA, /* access_mask */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_dst, /* fname */
FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|
FILE_WRITE_EA, /* access_mask */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_dname, /* fname */
FILE_READ_ATTRIBUTES, /* access_mask */
FILE_SHARE_NONE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_cp, /* fname */
DELETE_ACCESS, /* access_mask */
(FILE_SHARE_READ | /* share_access */
NTSTATUS create_file_default(connection_struct *conn,
struct smb_request *req,
+ struct files_struct **_dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
NTSTATUS status;
bool stream_name = false;
struct smb2_create_blob *posx = NULL;
+ struct files_struct *dirfsp = *_dirfsp;
+
+ SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
DBG_DEBUG("create_file: access_mask = 0x%x "
"file_attributes = 0x%x, share_access = 0x%x, "
"oplock_request = 0x%x "
"private_flags = 0x%x "
"ea_list = %p, sd = %p, "
+ "dirfsp = %s, "
"fname = %s\n",
(unsigned int)access_mask,
(unsigned int)file_attributes,
(unsigned int)create_options,
(unsigned int)oplock_request,
(unsigned int)private_flags,
- ea_list, sd, smb_fname_str_dbg(smb_fname));
+ ea_list,
+ sd,
+ fsp_str_dbg(dirfsp),
+ smb_fname_str_dbg(smb_fname));
if (req != NULL) {
/*
uint16_t lease_epoch);
NTSTATUS create_file_default(connection_struct *conn,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename * smb_fname,
uint32_t access_mask,
uint32_t share_access,
nt_status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_dname, /* dname */
FILE_LIST_DIRECTORY, /* access_mask */
FILE_SHARE_READ|
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_mode, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_mode, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_mode, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ | FILE_GENERIC_WRITE, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE
(conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
DELETE_ACCESS, /* access_mask */
FILE_SHARE_NONE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_dname, /* fname */
DELETE_ACCESS, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_src, /* fname */
access_mask, /* access_mask */
(FILE_SHARE_READ | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_src, /* fname */
access_mask, /* access_mask */
(FILE_SHARE_READ | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_src, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_dst, /* fname */
FILE_GENERIC_WRITE, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
status = SMB_VFS_CREATE_FILE(smb1req->conn,
smb1req,
+ &smb1req->conn->cwd_fsp,
smb_fname,
in_desired_access,
in_share_access,
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_tmp, /* fname */
access_mask, /* access_mask */
share_access, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
share_mode, /* share_access */
ntstatus = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_dname, /* dname */
FILE_LIST_DIRECTORY, /* access_mask */
FILE_SHARE_READ|
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname_tmp, /* fname */
FILE_WRITE_DATA, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_WRITE_DATA, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
FILE_READ_ATTRIBUTES, /* access_mask */
FILE_SHARE_NONE, /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
access_mask, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
req, /* req */
+ &conn->cwd_fsp, /* dirfsp */
smb_fname, /* fname */
DELETE_ACCESS, /* access_mask */
(FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
struct smb_request *req,
+ struct files_struct **dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask,
uint32_t share_access,
{
VFS_FIND(create_file);
return handle->fns->create_file_fn(
- handle, req, smb_fname, access_mask,
- share_access, create_disposition, create_options,
+ handle, req, dirfsp, smb_fname,
+ access_mask, share_access, create_disposition, create_options,
file_attributes, oplock_request, lease, allocation_size,
private_flags, sd, ea_list,
result, pinfo, in_context_blobs, out_context_blobs);
status = SMB_VFS_CREATE_FILE(
state.conn_tos->conn,
NULL, /* req */
+ &state.conn_tos->conn->cwd_fsp,
smb_fname,
FILE_READ_ATTRIBUTES|READ_CONTROL_ACCESS,
FILE_SHARE_READ|FILE_SHARE_WRITE,