r23792: convert Samba4 to GPLv3
[jra/samba/.git] / source4 / torture / raw / seek.c
index 7a69283347a99f6023a205e59eec2d01fe152c8f..f9b072b3de131c6f8c36d76bbec260dd0308966c 100644 (file)
@@ -5,7 +5,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 "system/filesys.h"
+#include "libcli/raw/libcliraw.h"
+#include "libcli/libcli.h"
+#include "torture/util.h"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
 /*
   test seek ops
 */
-static BOOL test_seek(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+static BOOL test_seek(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
 {
-       struct smb_seek io;
+       union smb_seek io;
        union smb_fileinfo finfo;
        union smb_setfileinfo sfinfo;
        NTSTATUS status;
        BOOL ret = True;
        int fnum, fnum2;
        const char *fname = BASEDIR "\\test.txt";
+       uint8_t c[2];
 
-       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;
        }
 
-       fnum = cli_open(cli, fname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE);
+       fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE);
        if (fnum == -1) {
-               printf("Failed to open test.txt - %s\n", cli_errstr(cli));
+               printf("Failed to open test.txt - %s\n", smbcli_errstr(cli->tree));
                ret = False;
                goto done;
        }
 
        finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
-       finfo.position_information.in.fnum = fnum;
+       finfo.position_information.in.file.fnum = fnum;
        
        printf("Trying bad handle\n");
-       io.in.fnum = fnum+1;
-       io.in.mode = SEEK_MODE_START;
-       io.in.offset = 0;
+       io.lseek.in.file.fnum = fnum+1;
+       io.lseek.in.mode = SEEK_MODE_START;
+       io.lseek.in.offset = 0;
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
 
        printf("Trying simple seek\n");
-       io.in.fnum = fnum;
-       io.in.mode = SEEK_MODE_START;
-       io.in.offset = 17;
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_START;
+       io.lseek.in.offset = 17;
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.out.offset, 17);
+       CHECK_VALUE(io.lseek.out.offset, 17);
        status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(finfo.position_information.out.position, 0);
        
        printf("Trying relative seek\n");
-       io.in.fnum = fnum;
-       io.in.mode = SEEK_MODE_CURRENT;
-       io.in.offset = -3;
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_CURRENT;
+       io.lseek.in.offset = -3;
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.out.offset, 14);
+       CHECK_VALUE(io.lseek.out.offset, 14);
 
        printf("Trying end seek\n");
-       io.in.fnum = fnum;
-       io.in.mode = SEEK_MODE_END;
-       io.in.offset = 0;
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_END;
+       io.lseek.in.offset = 0;
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
        finfo.generic.level = RAW_FILEINFO_ALL_INFO;
-       finfo.all_info.in.fnum = fnum;
+       finfo.all_info.in.file.fnum = fnum;
        status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.out.offset, finfo.all_info.out.size);
+       CHECK_VALUE(io.lseek.out.offset, finfo.all_info.out.size);
 
        printf("Trying max seek\n");
-       io.in.fnum = fnum;
-       io.in.mode = SEEK_MODE_START;
-       io.in.offset = -1;
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_START;
+       io.lseek.in.offset = -1;
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.out.offset, 0xffffffff);
+       CHECK_VALUE(io.lseek.out.offset, 0xffffffff);
+
+       printf("Testing position information change\n");
+       finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
+       finfo.position_information.in.file.fnum = fnum;
+       status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.position_information.out.position, 0);
 
        printf("Trying max overflow\n");
-       io.in.fnum = fnum;
-       io.in.mode = SEEK_MODE_CURRENT;
-       io.in.offset = 1000;
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_CURRENT;
+       io.lseek.in.offset = 1000;
+       status = smb_raw_seek(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(io.lseek.out.offset, 999);
+
+       printf("Testing position information change\n");
+       finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
+       finfo.position_information.in.file.fnum = fnum;
+       status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.position_information.out.position, 0);
+
+       printf("trying write to update offset\n");
+       ZERO_STRUCT(c);
+       if (smbcli_write(cli->tree, fnum, 0, c, 0, 2) != 2) {
+               printf("Write failed - %s\n", smbcli_errstr(cli->tree));
+               ret = False;
+               goto done;              
+       }
+
+       printf("Testing position information change\n");
+       finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
+       finfo.position_information.in.file.fnum = fnum;
+       status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.position_information.out.position, 0);
+
+       io.lseek.in.file.fnum = fnum;
+       io.lseek.in.mode = SEEK_MODE_CURRENT;
+       io.lseek.in.offset = 0;
+       status = smb_raw_seek(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(io.lseek.out.offset, 2);
+       
+       if (smbcli_read(cli->tree, fnum, c, 0, 1) != 1) {
+               printf("Read failed - %s\n", smbcli_errstr(cli->tree));
+               ret = False;
+               goto done;              
+       }
+
+       printf("Testing position information change\n");
+       finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
+       finfo.position_information.in.file.fnum = fnum;
+       status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_VALUE(finfo.position_information.out.position, 1);
+
        status = smb_raw_seek(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.out.offset, 999);
+       CHECK_VALUE(io.lseek.out.offset, 1);
 
        printf("Testing position information\n");
-       fnum2 = cli_open(cli, fname, O_RDWR, DENY_NONE);
+       fnum2 = smbcli_open(cli->tree, fname, O_RDWR, DENY_NONE);
        if (fnum2 == -1) {
-               printf("2nd open failed - %s\n", cli_errstr(cli));
+               printf("2nd open failed - %s\n", smbcli_errstr(cli->tree));
                ret = False;
                goto done;
        }
        sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
-       sfinfo.position_information.file.fnum = fnum2;
+       sfinfo.position_information.in.file.fnum = fnum2;
        sfinfo.position_information.in.position = 25;
        status = smb_raw_setfileinfo(cli->tree, &sfinfo);
        CHECK_STATUS(status, NT_STATUS_OK);
 
        finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
-       finfo.position_information.in.fnum = fnum2;
+       finfo.position_information.in.file.fnum = fnum2;
        status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(finfo.position_information.out.position, 25);
 
        finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
-       finfo.position_information.in.fnum = fnum;
+       finfo.position_information.in.file.fnum = fnum;
        status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(finfo.position_information.out.position, 0);
+       CHECK_VALUE(finfo.position_information.out.position, 1);
 
        printf("position_information via paths\n");
 
        sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
-       sfinfo.position_information.file.fname = fname;
+       sfinfo.position_information.in.file.path = fname;
        sfinfo.position_information.in.position = 32;
        status = smb_raw_setpathinfo(cli->tree, &sfinfo);
        CHECK_STATUS(status, NT_STATUS_OK);
 
        finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
-       finfo.position_information.in.fnum = fnum2;
+       finfo.position_information.in.file.fnum = fnum2;
        status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(finfo.position_information.out.position, 25);
 
        finfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
-       finfo.position_information.in.fname = fname;
+       finfo.position_information.in.file.path = fname;
        status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(finfo.position_information.out.position, 0);
@@ -169,7 +225,7 @@ static BOOL test_seek(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;
 }
 
@@ -177,13 +233,13 @@ done:
 /* 
    basic testing of seek calls
 */
-BOOL torture_raw_seek(int dummy)
+BOOL torture_raw_seek(struct torture_context *torture)
 {
-       struct cli_state *cli;
+       struct smbcli_state *cli;
        BOOL ret = True;
        TALLOC_CTX *mem_ctx;
 
-       if (!torture_open_connection(&cli)) {
+       if (!torture_open_connection(&cli, 0)) {
                return False;
        }
 
@@ -194,6 +250,6 @@ BOOL torture_raw_seek(int dummy)
        }
 
        torture_close_connection(cli);
-       talloc_destroy(mem_ctx);
+       talloc_free(mem_ctx);
        return ret;
 }