summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorUri Simchoni <uri@samba.org>2017-03-21 23:02:48 +0200
committerJeremy Allison <jra@samba.org>2017-03-28 17:45:19 +0200
commita67802fad505738a10f3c73392db9e6235f13b62 (patch)
tree223dce704668c3857d7bdb1f9933f3c1ad35ce99 /source3
parentb224b2033df9543e1b580885956a65161bd50db5 (diff)
downloadsamba-a67802fad505738a10f3c73392db9e6235f13b62.tar.gz
s3: libsmb: add replace support to SMB2 rename
SMB2 rename operation supports replacing the destination file if it exists. Signed-off-by: Uri Simchoni <uri@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/libsmb/cli_smb2_fnum.c9
-rw-r--r--source3/libsmb/cli_smb2_fnum.h5
-rw-r--r--source3/libsmb/clifile.c4
3 files changed, 11 insertions, 7 deletions
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 848e077162c..351fccfb645 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -2010,8 +2010,9 @@ NTSTATUS cli_smb2_set_security_descriptor(struct cli_state *cli,
***************************************************************/
NTSTATUS cli_smb2_rename(struct cli_state *cli,
- const char *fname_src,
- const char *fname_dst)
+ const char *fname_src,
+ const char *fname_dst,
+ bool replace)
{
NTSTATUS status;
DATA_BLOB inbuf = data_blob_null;
@@ -2091,6 +2092,10 @@ NTSTATUS cli_smb2_rename(struct cli_state *cli,
goto fail;
}
+ if (replace) {
+ SCVAL(inbuf.data, 0, 1);
+ }
+
SIVAL(inbuf.data, 16, converted_size_bytes);
memcpy(inbuf.data + 20, converted_str, converted_size_bytes);
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index 12c42a270ea..43e04713da1 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -132,8 +132,9 @@ NTSTATUS cli_smb2_set_security_descriptor(struct cli_state *cli,
uint32_t sec_info,
const struct security_descriptor *sd);
NTSTATUS cli_smb2_rename(struct cli_state *cli,
- const char *fname_src,
- const char *fname_dst);
+ const char *fname_src,
+ const char *fname_dst,
+ bool replace);
NTSTATUS cli_smb2_set_ea_fnum(struct cli_state *cli,
uint16_t fnum,
const char *ea_name,
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 6b32bf1ad4b..e6bc40cf5cb 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -1082,9 +1082,7 @@ NTSTATUS cli_rename(struct cli_state *cli, const char *fname_src, const char *fn
NTSTATUS status = NT_STATUS_OK;
if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
- return cli_smb2_rename(cli,
- fname_src,
- fname_dst);
+ return cli_smb2_rename(cli, fname_src, fname_dst, false);
}
frame = talloc_stackframe();