From 5a09ba460cb757823e1deb8b2f2ae762765846c0 Mon Sep 17 00:00:00 2001 From: Tim Prouty Date: Tue, 30 Jun 2009 17:04:38 -0700 Subject: s3: Plumb smb_filename through SMB_VFS_RENAME --- source3/modules/vfs_cap.c | 48 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'source3/modules/vfs_cap.c') diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c index 12a88750ee..4d16aa44ae 100644 --- a/source3/modules/vfs_cap.c +++ b/source3/modules/vfs_cap.c @@ -132,16 +132,50 @@ static int cap_open(vfs_handle_struct *handle, struct smb_filename *smb_fname, return ret; } -static int cap_rename(vfs_handle_struct *handle, const char *oldname, const char *newname) -{ - char *capold = capencode(talloc_tos(), oldname); - char *capnew = capencode(talloc_tos(), newname); - +static int cap_rename(vfs_handle_struct *handle, + const struct smb_filename *smb_fname_src, + const struct smb_filename *smb_fname_dst) +{ + char *capold = NULL; + char *capnew = NULL; + struct smb_filename *smb_fname_src_tmp = NULL; + struct smb_filename *smb_fname_dst_tmp = NULL; + NTSTATUS status; + int ret = -1; + + capold = capencode(talloc_tos(), smb_fname_src->base_name); + capnew = capencode(talloc_tos(), smb_fname_dst->base_name); if (!capold || !capnew) { errno = ENOMEM; - return -1; + goto out; + } + + /* Setup temporary smb_filename structs. */ + status = copy_smb_filename(talloc_tos(), smb_fname_src, + &smb_fname_src_tmp); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + goto out; } - return SMB_VFS_NEXT_RENAME(handle, capold, capnew); + status = copy_smb_filename(talloc_tos(), smb_fname_dst, + &smb_fname_dst_tmp); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + goto out; + } + + smb_fname_src_tmp->base_name = capold; + smb_fname_dst_tmp->base_name = capnew; + + ret = SMB_VFS_NEXT_RENAME(handle, smb_fname_src_tmp, + smb_fname_dst_tmp); + out: + TALLOC_FREE(capold); + TALLOC_FREE(capnew); + TALLOC_FREE(smb_fname_src_tmp); + TALLOC_FREE(smb_fname_dst_tmp); + + return ret; } static int cap_stat(vfs_handle_struct *handle, struct smb_filename *smb_fname) -- cgit