s3: libsmb: add replace support to SMB2 rename
authorUri Simchoni <uri@samba.org>
Tue, 21 Mar 2017 21:02:48 +0000 (23:02 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 28 Mar 2017 15:45:19 +0000 (17:45 +0200)
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>
source3/libsmb/cli_smb2_fnum.c
source3/libsmb/cli_smb2_fnum.h
source3/libsmb/clifile.c

index 848e077162ca1ad5843e5796a4590d739d588372..351fccfb6453d07ddd5420ee5c04628232d848a6 100644 (file)
@@ -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);
 
index 12c42a270eac69857f1eecdfaacc568d1d40b148..43e04713da13b4c1ab21d3be4779da2bd4288e6c 100644 (file)
@@ -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,
index 6b32bf1ad4becaf3da45e7a07acbd348ed90cfec..e6bc40cf5cb6c77d3cdc10fc3e3a12fe229ed8a7 100644 (file)
@@ -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();