r23792: convert Samba4 to GPLv3
[jra/samba/.git] / source4 / torture / raw / write.c
index dead0e4971749623c716aac75697243efb929e61..9b043bfe2ca4084fd9996f4927f55d11339f08e4 100644 (file)
@@ -6,7 +6,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "torture/torture.h"
 #include "libcli/raw/libcliraw.h"
 #include "system/time.h"
 #include "system/filesys.h"
+#include "libcli/libcli.h"
+#include "torture/util.h"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
@@ -48,7 +50,7 @@
 
 #define CHECK_ALL_INFO(v, field) do { \
        finfo.all_info.level = RAW_FILEINFO_ALL_INFO; \
-       finfo.all_info.in.fname = fname; \
+       finfo.all_info.in.file.path = fname; \
        status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo); \
        CHECK_STATUS(status, NT_STATUS_OK); \
        if ((v) != finfo.all_info.out.field) { \
@@ -122,7 +124,7 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        }
 
        printf("Trying zero write\n");
-       io.write.in.fnum = fnum;
+       io.write.in.file.fnum = fnum;
        io.write.in.count = 0;
        io.write.in.offset = 0;
        io.write.in.remaining = 0;
@@ -169,7 +171,7 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
        printf("Trying bad fnum\n");
-       io.write.in.fnum = fnum+1;
+       io.write.in.file.fnum = fnum+1;
        io.write.in.count = 4000;
        io.write.in.offset = 0;
        io.write.in.data = buf;
@@ -179,10 +181,20 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        printf("Setting file as sparse\n");
        status = torture_set_sparse(cli->tree, fnum);
        CHECK_STATUS(status, NT_STATUS_OK);
+
+       if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+               printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+               goto done;
+       }
        
+       if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+               printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+               goto done;
+       }
+
        printf("Trying 2^32 offset\n");
        setup_buffer(buf, seed, maxsize);
-       io.write.in.fnum = fnum;
+       io.write.in.file.fnum = fnum;
        io.write.in.count = 4000;
        io.write.in.offset = 0xFFFFFFFF - 2000;
        io.write.in.data = buf;
@@ -190,7 +202,7 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(io.write.out.nwritten, 4000);
        CHECK_ALL_INFO(io.write.in.count + (uint64_t)io.write.in.offset, size);
-
+       
        memset(buf, 0, maxsize);
        if (smbcli_read(cli->tree, fnum, buf, io.write.in.offset, 4000) != 4000) {
                printf("read failed at %s\n", __location__);
@@ -221,6 +233,12 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        const char *fname = BASEDIR "\\test.txt";
        uint_t seed = time(NULL);
        union smb_fileinfo finfo;
+       int max_bits=63;
+
+       if (!lp_parm_bool(-1, "torture", "dangerous", False)) {
+               max_bits=33;
+               printf("dangerous not set - limiting range of test to 2^%d\n", max_bits);
+       }
 
        buf = talloc_zero_size(mem_ctx, maxsize);
 
@@ -239,7 +257,7 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        }
 
        printf("Trying zero write\n");
-       io.writex.in.fnum = fnum;
+       io.writex.in.file.fnum = fnum;
        io.writex.in.offset = 0;
        io.writex.in.wmode = 0;
        io.writex.in.remaining = 0;
@@ -287,7 +305,7 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
        printf("Trying bad fnum\n");
-       io.writex.in.fnum = fnum+1;
+       io.writex.in.file.fnum = fnum+1;
        io.writex.in.count = 4000;
        io.writex.in.offset = 0;
        io.writex.in.data = buf;
@@ -295,7 +313,7 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
 
        printf("Testing wmode\n");
-       io.writex.in.fnum = fnum;
+       io.writex.in.file.fnum = fnum;
        io.writex.in.count = 1;
        io.writex.in.offset = 0;
        io.writex.in.wmode = 1;
@@ -328,9 +346,14 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        status = torture_set_sparse(cli->tree, fnum);
        CHECK_STATUS(status, NT_STATUS_OK);
        
+       if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+               printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+               goto done;
+       }
+
        printf("Trying 2^32 offset\n");
        setup_buffer(buf, seed, maxsize);
-       io.writex.in.fnum = fnum;
+       io.writex.in.file.fnum = fnum;
        io.writex.in.count = 4000;
        io.writex.in.offset = 0xFFFFFFFF - 2000;
        io.writex.in.data = buf;
@@ -347,15 +370,15 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        }
        CHECK_BUFFER(buf, seed, 4000);
 
-       for (i=33;i<64;i++) {
+       for (i=33;i<max_bits;i++) {
                printf("Trying 2^%d offset\n", i);
                setup_buffer(buf, seed+1, maxsize);
-               io.writex.in.fnum = fnum;
+               io.writex.in.file.fnum = fnum;
                io.writex.in.count = 4000;
                io.writex.in.offset = ((uint64_t)1) << i;
                io.writex.in.data = buf;
                status = smb_raw_write(cli->tree, &io);
-               if (i>40 &&
+               if (i>33 &&
                    NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
                        break;
                }
@@ -415,7 +438,7 @@ static BOOL test_writeunlock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        }
 
        printf("Trying zero write\n");
-       io.writeunlock.in.fnum = fnum;
+       io.writeunlock.in.file.fnum = fnum;
        io.writeunlock.in.count = 0;
        io.writeunlock.in.offset = 0;
        io.writeunlock.in.remaining = 0;
@@ -480,7 +503,7 @@ static BOOL test_writeunlock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
        printf("Trying bad fnum\n");
-       io.writeunlock.in.fnum = fnum+1;
+       io.writeunlock.in.file.fnum = fnum+1;
        io.writeunlock.in.count = 4000;
        io.writeunlock.in.offset = 0;
        io.writeunlock.in.data = buf;
@@ -491,9 +514,14 @@ static BOOL test_writeunlock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        status = torture_set_sparse(cli->tree, fnum);
        CHECK_STATUS(status, NT_STATUS_OK);
        
+       if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+               printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+               goto done;
+       }
+
        printf("Trying 2^32 offset\n");
        setup_buffer(buf, seed, maxsize);
-       io.writeunlock.in.fnum = fnum;
+       io.writeunlock.in.file.fnum = fnum;
        io.writeunlock.in.count = 4000;
        io.writeunlock.in.offset = 0xFFFFFFFF - 2000;
        io.writeunlock.in.data = buf;
@@ -552,7 +580,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        }
 
        printf("Trying zero write\n");
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
        io.writeclose.in.count = 0;
        io.writeclose.in.offset = 0;
        io.writeclose.in.mtime = 0;
@@ -578,7 +606,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
 
        fnum = smbcli_open(cli->tree, fname, O_RDWR, DENY_NONE);
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
 
        if (smbcli_read(cli->tree, fnum, buf, 0, 13) != 13) {
                printf("read failed at %s\n", __location__);
@@ -594,7 +622,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_VALUE(io.writeclose.out.nwritten, io.writeclose.in.count);
 
        fnum = smbcli_open(cli->tree, fname, O_RDWR, DENY_NONE);
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
 
        memset(buf, 0, maxsize);
        if (smbcli_read(cli->tree, fnum, buf, 0, 13) != 13) {
@@ -619,7 +647,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
 
        fnum = smbcli_open(cli->tree, fname, O_RDWR, DENY_NONE);
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
 
        memset(buf, 0, maxsize);
        if (smbcli_read(cli->tree, fnum, buf, 0, 4000) != 4000) {
@@ -630,7 +658,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
        printf("Trying bad fnum\n");
-       io.writeclose.in.fnum = fnum+1;
+       io.writeclose.in.file.fnum = fnum+1;
        io.writeclose.in.count = 4000;
        io.writeclose.in.offset = 0;
        io.writeclose.in.data = buf;
@@ -641,9 +669,14 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        status = torture_set_sparse(cli->tree, fnum);
        CHECK_STATUS(status, NT_STATUS_OK);
        
+       if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+               printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+               goto done;
+       }
+
        printf("Trying 2^32 offset\n");
        setup_buffer(buf, seed, maxsize);
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
        io.writeclose.in.count = 4000;
        io.writeclose.in.offset = 0xFFFFFFFF - 2000;
        io.writeclose.in.data = buf;
@@ -653,7 +686,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_ALL_INFO(io.writeclose.in.count + (uint64_t)io.writeclose.in.offset, size);
 
        fnum = smbcli_open(cli->tree, fname, O_RDWR, DENY_NONE);
-       io.writeclose.in.fnum = fnum;
+       io.writeclose.in.file.fnum = fnum;
 
        memset(buf, 0, maxsize);
        if (smbcli_read(cli->tree, fnum, buf, io.writeclose.in.offset, 4000) != 4000) {
@@ -673,13 +706,13 @@ done:
 /* 
    basic testing of write calls
 */
-BOOL torture_raw_write(void)
+BOOL torture_raw_write(struct torture_context *torture)
 {
        struct smbcli_state *cli;
        BOOL ret = True;
        TALLOC_CTX *mem_ctx;
 
-       if (!torture_open_connection(&cli)) {
+       if (!torture_open_connection(&cli, 0)) {
                return False;
        }