void reply_ntrename(struct smb_request *req)
{
connection_struct *conn = req->conn;
+ struct files_struct *src_dirfsp = NULL;
struct smb_filename *smb_fname_old = NULL;
+ struct files_struct *dst_dirfsp = NULL;
struct smb_filename *smb_fname_new = NULL;
char *oldname = NULL;
char *newname = NULL;
NTSTATUS status;
uint32_t attrs;
uint32_t ucf_flags_src = ucf_flags_from_smb_request(req);
+ NTTIME src_twrp = 0;
uint32_t ucf_flags_dst = ucf_flags_from_smb_request(req);
+ NTTIME dst_twrp = 0;
uint16_t rename_type;
TALLOC_CTX *ctx = talloc_tos();
bool stream_rename = false;
}
}
- /* rename_internals() calls unix_convert(), so don't call it here. */
- status = filename_convert(ctx, conn,
- oldname,
- ucf_flags_src,
- 0,
- &smb_fname_old);
+ if (ucf_flags_src & UCF_GMT_PATHNAME) {
+ extract_snapshot_token(oldname, &src_twrp);
+ }
+ status = filename_convert_dirfsp(ctx,
+ conn,
+ oldname,
+ ucf_flags_src,
+ src_twrp,
+ &src_dirfsp,
+ &smb_fname_old);
if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status,
NT_STATUS_PATH_NOT_COVERED)) {
goto out;
}
} else {
- status = filename_convert(ctx, conn,
- newname,
- ucf_flags_dst,
- 0,
- &smb_fname_new);
+ if (ucf_flags_dst & UCF_GMT_PATHNAME) {
+ extract_snapshot_token(newname, &dst_twrp);
+ }
+ status = filename_convert_dirfsp(ctx,
+ conn,
+ newname,
+ ucf_flags_dst,
+ dst_twrp,
+ &dst_dirfsp,
+ &smb_fname_new);
if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status,
NT_STATUS_PATH_NOT_COVERED)) {
status = rename_internals(ctx,
conn,
req,
- NULL, /* src_dirfsp */
+ src_dirfsp,
smb_fname_old,
- NULL, /* dst_dirfsp */
+ dst_dirfsp,
smb_fname_new,
dst_original_lcomp,
attrs,
conn,
req,
false,
- NULL, /* old_dirfsp */
+ src_dirfsp,
smb_fname_old,
- NULL, /* new_dirfsp */
+ dst_dirfsp,
smb_fname_new);
break;
case RENAME_FLAG_COPY:
status = copy_internals(ctx,
conn,
req,
- NULL, /* src_dirfsp */
+ src_dirfsp,
smb_fname_old,
- NULL, /* dst_dirfsp */
+ dst_dirfsp,
smb_fname_new,
attrs);
break;