r23792: convert Samba4 to GPLv3
[jra/samba/.git] / source4 / torture / raw / seek.c
index a0980a7aea8694b7347f3a39cb0a75d706d213f6..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.out.offset, 999);
+       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.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, 1);
+
+       printf("position_information via paths\n");
+
+       sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
+       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.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.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);
        
 
 done:
        smb_raw_exit(cli->session);
-       cli_deltree(cli, BASEDIR);
+       smbcli_deltree(cli->tree, BASEDIR);
        return ret;
 }
 
@@ -157,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;
        }
 
@@ -174,6 +250,6 @@ BOOL torture_raw_seek(int dummy)
        }
 
        torture_close_connection(cli);
-       talloc_destroy(mem_ctx);
+       talloc_free(mem_ctx);
        return ret;
 }