size_t headersize,
size_t smb_maxcnt);
NTSTATUS rename_internals_fsp(connection_struct *conn,
+ struct files_struct *src_dirfsp,
files_struct *fsp,
+ struct smb_filename *smb_fname_src_rel,
struct share_mode_lock **lck,
struct smb_filename *smb_fname_dst_in,
const char *dst_original_lcomp,
uint32_t attrs,
+ const char *newname,
bool replace_if_exists);
NTSTATUS rename_internals(TALLOC_CTX *ctx,
connection_struct *conn,
struct smb_request *req,
struct files_struct *src_dirfsp,
struct smb_filename *smb_fname_src,
+ struct smb_filename *smb_fname_src_rel,
struct smb_filename *smb_fname_dst,
const char *dst_original_lcomp,
uint32_t attrs,
+ const char *newname,
bool replace_if_exists,
uint32_t access_mask);
NTSTATUS copy_file(TALLOC_CTX *ctx,
req,
src_dirfsp,
smb_fname_old,
+ smb_fname_old_rel,
smb_fname_new,
dst_original_lcomp,
attrs,
+ newname,
false,
DELETE_ACCESS);
TALLOC_CTX *ctx = talloc_tos();
struct files_struct *src_dirfsp = NULL;
struct smb_filename *smb_fname_src = NULL;
+ struct smb_filename *smb_fname_src_rel = NULL;
struct files_struct *dst_dirfsp = NULL;
struct smb_filename *smb_fname_dst = NULL;
const char *dst_original_lcomp = NULL;
reply_nterror(req, status);
goto out;
}
- status = filename_convert_dirfsp(ctx,
- conn,
- name,
- src_ucf_flags,
- src_twrp,
- &src_dirfsp,
- &smb_fname_src);
+ status = filename_convert_dirfsp_rel(ctx,
+ conn,
+ conn->cwd_fsp,
+ name,
+ src_ucf_flags,
+ src_twrp,
+ &src_dirfsp,
+ &smb_fname_src,
+ &smb_fname_src_rel);
if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
req,
src_dirfsp, /* src_dirfsp */
smb_fname_src,
+ smb_fname_src_rel,
smb_fname_dst,
dst_original_lcomp,
attrs,
+ newname,
false,
DELETE_ACCESS);
if (!NT_STATUS_IS_OK(status)) {
****************************************************************************/
NTSTATUS rename_internals_fsp(connection_struct *conn,
+ struct files_struct *src_dirfsp,
files_struct *fsp,
+ struct smb_filename *smb_fname_src_rel,
struct share_mode_lock **_lck,
struct smb_filename *smb_fname_dst_in,
const char *dst_original_lcomp,
uint32_t attrs,
+ const char *newname,
bool replace_if_exists)
{
TALLOC_CTX *ctx = talloc_tos();
struct smb_request *req,
struct files_struct *src_dirfsp,
struct smb_filename *smb_fname_src,
+ struct smb_filename *smb_fname_src_rel,
struct smb_filename *smb_fname_dst,
const char *dst_original_lcomp,
uint32_t attrs,
+ const char *newname,
bool replace_if_exists,
uint32_t access_mask)
{
}
status = rename_internals_fsp(conn,
+ src_dirfsp,
fsp,
+ smb_fname_src_rel,
NULL,
smb_fname_dst,
dst_original_lcomp,
attrs,
+ newname,
replace_if_exists);
close_file_free(req, &fsp, NORMAL_CLOSE);
{
char *newname = NULL;
bool overwrite;
+ struct smb_filename *smb_fname_src_parent = NULL;
+ struct smb_filename *smb_fname_src_rel = NULL;
struct files_struct *dst_dirfsp = NULL;
struct smb_filename *smb_fname_dst = NULL;
char *dst_original_lcomp = NULL;
fsp_str_dbg(fsp),
smb_fname_str_dbg(smb_fname_dst));
+ status = parent_pathref(talloc_tos(),
+ conn->cwd_fsp,
+ fsp->fsp_name,
+ &smb_fname_src_parent,
+ &smb_fname_src_rel);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
status = rename_internals_fsp(conn,
+ smb_fname_src_parent->fsp,
fsp,
+ smb_fname_src_rel,
lck,
smb_fname_dst,
dst_original_lcomp,
(FILE_ATTRIBUTE_HIDDEN |
FILE_ATTRIBUTE_SYSTEM),
+ newname,
overwrite);
+ TALLOC_FREE(smb_fname_src_rel);
+ TALLOC_FREE(smb_fname_src_parent);
TALLOC_FREE(smb_fname_dst);
return status;
}
uint32_t root_fid;
uint32_t len;
char *newname = NULL;
+ struct smb_filename *smb_fname_src_parent = NULL;
+ struct smb_filename *smb_fname_src_rel = NULL;
struct files_struct *dst_dirfsp = NULL;
struct smb_filename *smb_fname_dst = NULL;
const char *dst_original_lcomp = NULL;
}
}
+ status = parent_pathref(ctx,
+ conn->cwd_fsp,
+ fsp->fsp_name,
+ &smb_fname_src_parent,
+ &smb_fname_src_rel);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto out;
+ }
+
+ if (!fsp_is_alternate_stream(fsp)) {
+ /*
+ * The smb1-level rename information is always
+ * relative to the directory of the src name.
+ */
+ newname = full_path_from_dirfsp_at_basename(
+ ctx, smb_fname_src_parent->fsp, newname);
+ if (newname == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
+ }
+ }
+
if (fsp->fsp_flags.is_fsa) {
DBG_DEBUG("SMB_FILE_RENAME_INFORMATION (%s) %s -> %s\n",
fsp_fnum_dbg(fsp),
}
status = rename_internals_fsp(conn,
+ smb_fname_src_parent->fsp,
fsp,
+ smb_fname_src_rel,
NULL,
smb_fname_dst,
dst_original_lcomp,
0,
+ newname,
overwrite);
} else {
DBG_DEBUG("SMB_FILE_RENAME_INFORMATION %s -> %s\n",
status = rename_internals(ctx,
conn,
req,
- NULL, /* src_dirfsp */
+ smb_fname_src_parent->fsp,
smb_fname_src,
+ smb_fname_src_rel,
smb_fname_dst,
dst_original_lcomp,
0,
+ newname,
overwrite,
FILE_WRITE_ATTRIBUTES);
}