r12608: Remove some unused #include lines.
[kamenim/samba.git] / source4 / torture / raw / rename.c
index b536b0fe1a4cc68a802d027d7ce8a3ea026877b2..f599e1a6c78e9cb79c6abc3c5899f7c0263c3804 100644 (file)
 */
 
 #include "includes.h"
+#include "libcli/raw/libcliraw.h"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
-               printf("(%d) Incorrect status %s - should be %s\n", \
-                      __LINE__, nt_errstr(status), nt_errstr(correct)); \
+               printf("(%s) Incorrect status %s - should be %s\n", \
+                      __location__, nt_errstr(status), nt_errstr(correct)); \
                ret = False; \
                goto done; \
        }} while (0)
 
 #define CHECK_VALUE(v, correct) do { \
        if ((v) != (correct)) { \
-               printf("(%d) Incorrect %s %d - should be %d\n", \
-                      __LINE__, #v, (int)v, (int)correct); \
+               printf("(%s) Incorrect %s %d - should be %d\n", \
+                      __location__, #v, (int)v, (int)correct); \
                ret = False; \
        }} while (0)
 
 /*
   test SMBmv ops
 */
-static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+static BOOL test_mv(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
 {
        union smb_rename io;
        NTSTATUS status;
        BOOL ret = True;
-       int fnum;
+       int fnum = -1;
        const char *fname1 = BASEDIR "\\test1.txt";
        const char *fname2 = BASEDIR "\\test2.txt";
+       union smb_open op;
 
        printf("Testing SMBmv\n");
 
-       if (cli_deltree(cli, BASEDIR) == -1 ||
-           !cli_mkdir(cli, BASEDIR)) {
-               printf("Unable to setup %s - %s\n", BASEDIR, cli_errstr(cli));
+       if (!torture_setup_dir(cli, BASEDIR)) {
                return False;
        }
 
        printf("Trying simple rename\n");
 
-       fnum = create_complex_file(cli, mem_ctx, fname1);
-       
+       op.generic.level = RAW_OPEN_NTCREATEX;
+       op.ntcreatex.in.root_fid = 0;
+       op.ntcreatex.in.flags = 0;
+       op.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       op.ntcreatex.in.create_options = 0;
+       op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       op.ntcreatex.in.share_access = 
+               NTCREATEX_SHARE_ACCESS_READ | 
+               NTCREATEX_SHARE_ACCESS_WRITE;
+       op.ntcreatex.in.alloc_size = 0;
+       op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+       op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+       op.ntcreatex.in.security_flags = 0;
+       op.ntcreatex.in.fname = fname1;
+
+       status = smb_raw_open(cli->tree, mem_ctx, &op);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = op.ntcreatex.out.fnum;
+
        io.generic.level = RAW_RENAME_RENAME;
        io.rename.in.pattern1 = fname1;
        io.rename.in.pattern2 = fname2;
        io.rename.in.attrib = 0;
        
+       printf("trying rename while first file open\n");
        status = smb_raw_rename(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
-       
+
+       smbcli_close(cli->tree, fnum);
+
+       op.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
+       op.ntcreatex.in.share_access = 
+               NTCREATEX_SHARE_ACCESS_DELETE | 
+               NTCREATEX_SHARE_ACCESS_READ |
+               NTCREATEX_SHARE_ACCESS_WRITE;
+       status = smb_raw_open(cli->tree, mem_ctx, &op);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       fnum = op.ntcreatex.out.fnum;
+
+       printf("trying rename while first file open with SHARE_ACCESS_DELETE\n");
+       status = smb_raw_rename(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       io.rename.in.pattern1 = fname2;
+       io.rename.in.pattern2 = fname1;
+       status = smb_raw_rename(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       io.rename.in.pattern1 = fname1;
+       io.rename.in.pattern2 = fname2;
+
+       printf("trying rename while not open\n");
        smb_raw_exit(cli->session);
        status = smb_raw_rename(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
@@ -118,9 +160,9 @@ static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_OK);
 
 done:
-       cli_close(cli, fnum);
+       smbcli_close(cli->tree, fnum);
        smb_raw_exit(cli->session);
-       cli_deltree(cli, BASEDIR);
+       smbcli_deltree(cli->tree, BASEDIR);
        return ret;
 }
 
@@ -129,7 +171,7 @@ done:
 /*
   test SMBntrename ops
 */
-static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+static BOOL test_ntrename(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
 {
        union smb_rename io;
        NTSTATUS status;
@@ -141,9 +183,7 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
 
        printf("Testing SMBntrename\n");
 
-       if (cli_deltree(cli, BASEDIR) == -1 ||
-           !cli_mkdir(cli, BASEDIR)) {
-               printf("Unable to setup %s - %s\n", BASEDIR, cli_errstr(cli));
+       if (!torture_setup_dir(cli, BASEDIR)) {
                return False;
        }
 
@@ -155,7 +195,7 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        io.ntrename.in.old_name = fname1;
        io.ntrename.in.new_name = fname2;
        io.ntrename.in.attrib = 0;
-       io.ntrename.in.unknown = 0;
+       io.ntrename.in.cluster_size = 0;
        io.ntrename.in.flags = RENAME_FLAG_RENAME;
        
        status = smb_raw_rename(cli->tree, &io);
@@ -222,12 +262,13 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
 
        torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
 
-       cli_unlink(cli, fname2);
+       smbcli_unlink(cli->tree, fname2);
 
        finfo.generic.in.fname = fname1;
        status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(finfo.all_info.out.nlink, 1);
+       CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
 
        printf("Checking copy\n");
        io.ntrename.in.old_name = fname1;
@@ -237,6 +278,20 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        status = smb_raw_rename(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
 
+       finfo.generic.level = RAW_FILEINFO_ALL_INFO;
+       finfo.generic.in.fname = fname1;
+       status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.all_info.out.nlink, 1);
+       CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
+
+       finfo.generic.level = RAW_FILEINFO_ALL_INFO;
+       finfo.generic.in.fname = fname2;
+       status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.all_info.out.nlink, 1);
+       CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
+
        torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_SYSTEM);
 
        finfo.generic.level = RAW_FILEINFO_ALL_INFO;
@@ -254,7 +309,7 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
 
        torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
 
-       cli_unlink(cli, fname2);
+       smbcli_unlink(cli->tree, fname2);
 
        finfo.generic.in.fname = fname1;
        status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
@@ -282,29 +337,54 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        io.ntrename.in.new_name = fname2;
        io.ntrename.in.attrib = 0;
        io.ntrename.in.flags = RENAME_FLAG_RENAME;
-       io.ntrename.in.unknown = 0xff;
+       io.ntrename.in.cluster_size = 0xff;
        status = smb_raw_rename(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
 
-       fnum = create_directory_handle(cli, BASEDIR "\\testdir");
-       printf("Trying flags 0x102 fnum=%d\n", fnum);
+       printf("Trying RENAME_FLAG_MOVE_CLUSTER_INFORMATION\n");
 
        io.ntrename.in.old_name = fname2;
        io.ntrename.in.new_name = fname1;
        io.ntrename.in.attrib = 0;
-       io.ntrename.in.flags = 0x102;
-       io.ntrename.in.unknown = fnum;
+       io.ntrename.in.flags = RENAME_FLAG_MOVE_CLUSTER_INFORMATION;
+       io.ntrename.in.cluster_size = 1;
+       status = smb_raw_rename(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+
+       io.ntrename.in.flags = RENAME_FLAG_COPY;
+       status = smb_raw_rename(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+#if 0
+       {
+               char buf[16384];
+               fnum = smbcli_open(cli->tree, fname1, O_RDWR, DENY_NONE);
+               memset(buf, 1, sizeof(buf));
+               smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf));
+               smbcli_close(cli->tree, fnum);
+
+               fnum = smbcli_open(cli->tree, fname2, O_RDWR, DENY_NONE);
+               memset(buf, 1, sizeof(buf));
+               smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf)-1);
+               smbcli_close(cli->tree, fnum);
+
+               torture_all_info(cli->tree, fname1);
+               torture_all_info(cli->tree, fname2);
+       }
+       
+
+       io.ntrename.in.flags = RENAME_FLAG_MOVE_CLUSTER_INFORMATION;
        status = smb_raw_rename(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
 
-       for (i=0;i<32;i++) {
-               io.ntrename.in.unknown = (1<<i);
+       for (i=0;i<20000;i++) {
+               io.ntrename.in.cluster_size = i;
                status = smb_raw_rename(cli->tree, &io);
                if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
-                       printf("i=0x%x status=%s\n", i, nt_errstr(status));
+                       printf("i=%d status=%s\n", i, nt_errstr(status));
                }
-               CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
        }
+#endif
 
        printf("Checking other flags\n");
 
@@ -319,7 +399,7 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
                io.ntrename.in.new_name = fname1;
                io.ntrename.in.flags = i;
                io.ntrename.in.attrib = 0;
-               io.ntrename.in.unknown = 0;
+               io.ntrename.in.cluster_size = 0;
                status = smb_raw_rename(cli->tree, &io);
                if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
                        printf("flags=0x%x status=%s\n", i, nt_errstr(status));
@@ -328,7 +408,7 @@ static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        
 done:
        smb_raw_exit(cli->session);
-       cli_deltree(cli, BASEDIR);
+       smbcli_deltree(cli->tree, BASEDIR);
        return ret;
 }
 
@@ -336,9 +416,9 @@ done:
 /* 
    basic testing of rename calls
 */
-BOOL torture_raw_rename(int dummy)
+BOOL torture_raw_rename(void)
 {
-       struct cli_state *cli;
+       struct smbcli_state *cli;
        BOOL ret = True;
        TALLOC_CTX *mem_ctx;
 
@@ -357,6 +437,6 @@ BOOL torture_raw_rename(int dummy)
        }
 
        torture_close_connection(cli);
-       talloc_destroy(mem_ctx);
+       talloc_free(mem_ctx);
        return ret;
 }