This commit was manufactured by cvs2svn to create branch 'SAMBA_3_0'.(This used to...
[jra/samba/.git] / source3 / torture / torture.c
index cb064575735d3610b4c30682de8f4dbd3fe63db0..3fd0d7aa6678d529fc4ed622a1bc203559775786 100644 (file)
 
 static fstring host, workgroup, share, password, username, myname;
 static int max_protocol = PROTOCOL_NT1;
-static char *sockops="TCP_NODELAY";
-static int nprocs=1, numops=100;
+static const char *sockops="TCP_NODELAY";
+static int nprocs=1;
+int torture_numops=100;
 static int procnum; /* records process count number when forking */
 static struct cli_state current_cli;
 static fstring randomfname;
 static BOOL use_oplocks;
 static BOOL use_level_II_oplocks;
-static char *client_txt = "client_oplocks.txt";
+static const char *client_txt = "client_oplocks.txt";
 static BOOL use_kerberos;
 
 BOOL torture_showall = False;
@@ -220,7 +221,7 @@ static BOOL wait_lock(struct cli_state *c, int fnum, uint32 offset, uint32 len)
 
 static BOOL rw_torture(struct cli_state *c)
 {
-       char *lockfname = "\\torture.lck";
+       const char *lockfname = "\\torture.lck";
        fstring fname;
        int fnum;
        int fnum2;
@@ -239,7 +240,7 @@ static BOOL rw_torture(struct cli_state *c)
        }
 
 
-       for (i=0;i<numops;i++) {
+       for (i=0;i<torture_numops;i++) {
                unsigned n = (unsigned)sys_random()%10;
                if (i % 10 == 0) {
                        printf("%d\r", i); fflush(stdout);
@@ -427,7 +428,7 @@ static BOOL rw_torture3(struct cli_state *c, char *lockfname)
 
 static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
 {
-       char *lockfname = "\\torture2.lck";
+       const char *lockfname = "\\torture2.lck";
        int fnum1;
        int fnum2;
        int i;
@@ -456,7 +457,7 @@ static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
                return False;
        }
 
-       for (i=0;i<numops;i++)
+       for (i=0;i<torture_numops;i++)
        {
                size_t buf_size = ((unsigned)sys_random()%(sizeof(buf)-1))+ 1;
                if (i % 10 == 0) {
@@ -553,9 +554,9 @@ static BOOL run_readwritelarge(int dummy)
 {
        static struct cli_state cli1;
        int fnum1;
-       char *lockfname = "\\large.dat";
+       const char *lockfname = "\\large.dat";
        size_t fsize;
-       char buf[0x10000];
+       char buf[126*1024];
        BOOL correct = True;
  
        if (!torture_open_connection(&cli1)) {
@@ -564,7 +565,7 @@ static BOOL run_readwritelarge(int dummy)
        cli_sockopt(&cli1, sockops);
        memset(buf,'\0',sizeof(buf));
        
-       cli1.max_xmit = 0x11000;
+       cli1.max_xmit = 128*1024;
        
        printf("starting readwritelarge\n");
  
@@ -578,13 +579,8 @@ static BOOL run_readwritelarge(int dummy)
    
        cli_write(&cli1, fnum1, 0, buf, 0, sizeof(buf));
 
-       if (!cli_close(&cli1, fnum1)) {
-               printf("close failed (%s)\n", cli_errstr(&cli1));
-               correct = False;
-       }
-
-       if (!cli_qpathinfo(&cli1, lockfname, NULL, NULL, NULL, &fsize, NULL)) {
-               printf("qpathinfo failed (%s)\n", cli_errstr(&cli1));
+       if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+               printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
                correct = False;
        }
 
@@ -595,6 +591,11 @@ static BOOL run_readwritelarge(int dummy)
                correct = False;
        }
 
+       if (!cli_close(&cli1, fnum1)) {
+               printf("close failed (%s)\n", cli_errstr(&cli1));
+               correct = False;
+       }
+
        if (!cli_unlink(&cli1, lockfname)) {
                printf("unlink failed (%s)\n", cli_errstr(&cli1));
                correct = False;
@@ -606,8 +607,36 @@ static BOOL run_readwritelarge(int dummy)
                return False;
        }
        
+       cli1.max_xmit = 4*1024;
+       
        cli_smbwrite(&cli1, fnum1, buf, 0, sizeof(buf));
        
+       if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+               printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
+               correct = False;
+       }
+
+       if (fsize == sizeof(buf))
+               printf("readwritelarge test 2 succeeded (size = %x)\n", fsize);
+       else {
+               printf("readwritelarge test 2 failed (size = %x)\n", fsize);
+               correct = False;
+       }
+
+#if 0
+       /* ToDo - set allocation. JRA */
+       if(!cli_set_allocation_size(&cli1, fnum1, 0)) {
+               printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
+               return False;
+       }
+       if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+               printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
+               correct = False;
+       }
+       if (fsize != 0)
+               printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);
+#endif
+
        if (!cli_close(&cli1, fnum1)) {
                printf("close failed (%s)\n", cli_errstr(&cli1));
                correct = False;
@@ -753,9 +782,10 @@ static BOOL run_nbench(int dummy)
 static BOOL run_locktest1(int dummy)
 {
        static struct cli_state cli1, cli2;
-       char *fname = "\\lockt1.lck";
+       const char *fname = "\\lockt1.lck";
        int fnum1, fnum2, fnum3;
        time_t t1, t2;
+       unsigned lock_timeout;
 
        if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
                return False;
@@ -798,9 +828,10 @@ static BOOL run_locktest1(int dummy)
        }
 
 
-       printf("Testing lock timeouts\n");
+       lock_timeout = (1 + (random() % 20));
+       printf("Testing lock timeout with timeout=%u\n", lock_timeout);
        t1 = time(NULL);
-       if (cli_lock(&cli2, fnum3, 0, 4, 10*1000, WRITE_LOCK)) {
+       if (cli_lock(&cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {
                printf("lock3 succeeded! This is a locking bug\n");
                return False;
        } else {
@@ -812,6 +843,8 @@ static BOOL run_locktest1(int dummy)
        if (t2 - t1 < 5) {
                printf("error: This server appears not to support timed lock requests\n");
        }
+       printf("server slept for %u seconds for a %u second timeout\n",
+              (unsigned int)(t2-t1), lock_timeout);
 
        if (!cli_close(&cli1, fnum2)) {
                printf("close1 failed (%s)\n", cli_errstr(&cli1));
@@ -860,7 +893,7 @@ static BOOL run_locktest1(int dummy)
 static BOOL run_tcon_test(int dummy)
 {
        static struct cli_state cli1;
-       char *fname = "\\tcontest.tmp";
+       const char *fname = "\\tcontest.tmp";
        int fnum1;
        uint16 cnum;
        char buf[4];
@@ -943,7 +976,7 @@ static BOOL run_tcon_test(int dummy)
 static BOOL run_locktest2(int dummy)
 {
        static struct cli_state cli;
-       char *fname = "\\lockt2.lck";
+       const char *fname = "\\lockt2.lck";
        int fnum1, fnum2, fnum3;
        BOOL correct = True;
 
@@ -1079,12 +1112,12 @@ static BOOL run_locktest2(int dummy)
 static BOOL run_locktest3(int dummy)
 {
        static struct cli_state cli1, cli2;
-       char *fname = "\\lockt3.lck";
+       const char *fname = "\\lockt3.lck";
        int fnum1, fnum2, i;
        uint32 offset;
        BOOL correct = True;
 
-#define NEXT_OFFSET offset += (~(uint32)0) / numops
+#define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
 
        if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
                return False;
@@ -1107,7 +1140,7 @@ static BOOL run_locktest3(int dummy)
                return False;
        }
 
-       for (offset=i=0;i<numops;i++) {
+       for (offset=i=0;i<torture_numops;i++) {
                NEXT_OFFSET;
                if (!cli_lock(&cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
                        printf("lock1 %d failed (%s)\n", 
@@ -1124,7 +1157,7 @@ static BOOL run_locktest3(int dummy)
                }
        }
 
-       for (offset=i=0;i<numops;i++) {
+       for (offset=i=0;i<torture_numops;i++) {
                NEXT_OFFSET;
 
                if (cli_lock(&cli1, fnum1, offset-2, 1, 0, WRITE_LOCK)) {
@@ -1148,7 +1181,7 @@ static BOOL run_locktest3(int dummy)
                }
        }
 
-       for (offset=i=0;i<numops;i++) {
+       for (offset=i=0;i<torture_numops;i++) {
                NEXT_OFFSET;
 
                if (!cli_unlock(&cli1, fnum1, offset-1, 1)) {
@@ -1204,7 +1237,7 @@ static BOOL run_locktest3(int dummy)
 static BOOL run_locktest4(int dummy)
 {
        static struct cli_state cli1, cli2;
-       char *fname = "\\lockt4.lck";
+       const char *fname = "\\lockt4.lck";
        int fnum1, fnum2, f;
        BOOL ret;
        char buf[1000];
@@ -1375,7 +1408,7 @@ static BOOL run_locktest4(int dummy)
 static BOOL run_locktest5(int dummy)
 {
        static struct cli_state cli1, cli2;
-       char *fname = "\\lockt5.lck";
+       const char *fname = "\\lockt5.lck";
        int fnum1, fnum2, fnum3;
        BOOL ret;
        char buf[1000];
@@ -1499,7 +1532,7 @@ static BOOL run_locktest5(int dummy)
 static BOOL run_locktest6(int dummy)
 {
        static struct cli_state cli;
-       char *fname[1] = { "\\lock6.txt" };
+       const char *fname[1] = { "\\lock6.txt" };
        int i;
        int fnum;
        NTSTATUS status;
@@ -1543,7 +1576,7 @@ security hole)
 static BOOL run_fdpasstest(int dummy)
 {
        static struct cli_state cli1, cli2, cli3;
-       char *fname = "\\fdpass.tst";
+       const char *fname = "\\fdpass.tst";
        int fnum1;
        pstring buf;
 
@@ -1598,7 +1631,7 @@ static BOOL run_fdpasstest(int dummy)
 static BOOL run_unlinktest(int dummy)
 {
        static struct cli_state cli;
-       char *fname = "\\unlink.tst";
+       const char *fname = "\\unlink.tst";
        int fnum;
        BOOL correct = True;
 
@@ -1647,7 +1680,7 @@ test how many open files this server supports on the one socket
 static BOOL run_maxfidtest(int dummy)
 {
        static struct cli_state cli;
-       char *template = "\\maxfid.%d.%d";
+       const char *template = "\\maxfid.%d.%d";
        fstring fname;
        int fnums[0x11000], i;
        int retries=4;
@@ -1833,7 +1866,7 @@ static BOOL run_attrtest(int dummy)
        static struct cli_state cli;
        int fnum;
        time_t t, t2;
-       char *fname = "\\attrib.tst";
+       const char *fname = "\\attrib.tst";
        BOOL correct = True;
 
        printf("starting attrib test\n");
@@ -1898,9 +1931,9 @@ static BOOL run_trans2test(int dummy)
        int fnum;
        size_t size;
        time_t c_time, a_time, m_time, w_time, m_time2;
-       char *fname = "\\trans2.tst";
-       char *dname = "\\trans2";
-       char *fname2 = "\\trans2\\trans2.tst";
+       const char *fname = "\\trans2.tst";
+       const char *dname = "\\trans2";
+       const char *fname2 = "\\trans2\\trans2.tst";
        pstring pname;
        BOOL correct = True;
 
@@ -2050,7 +2083,7 @@ static BOOL run_w2ktest(int dummy)
 {
        static struct cli_state cli;
        int fnum;
-       char *fname = "\\w2ktest\\w2k.tst";
+       const char *fname = "\\w2ktest\\w2k.tst";
        int level;
        BOOL correct = True;
 
@@ -2085,7 +2118,7 @@ static BOOL run_w2ktest(int dummy)
 static BOOL run_oplock1(int dummy)
 {
        static struct cli_state cli1;
-       char *fname = "\\lockt1.lck";
+       const char *fname = "\\lockt1.lck";
        int fnum1;
        BOOL correct = True;
 
@@ -2134,7 +2167,7 @@ static BOOL run_oplock1(int dummy)
 static BOOL run_oplock2(int dummy)
 {
        static struct cli_state cli1, cli2;
-       char *fname = "\\lockt2.lck";
+       const char *fname = "\\lockt2.lck";
        int fnum1, fnum2;
        int saved_use_oplocks = use_oplocks;
        char buf[4];
@@ -2276,7 +2309,7 @@ static BOOL oplock3_handler(struct cli_state *cli, int fnum, unsigned char level
 static BOOL run_oplock3(int dummy)
 {
        static struct cli_state cli;
-       char *fname = "\\oplockt3.dat";
+       const char *fname = "\\oplockt3.dat";
        int fnum;
        char buf[4] = "abcd";
        BOOL correct = True;
@@ -2331,7 +2364,7 @@ static BOOL run_deletetest(int dummy)
 {
        static struct cli_state cli1;
        static struct cli_state cli2;
-       char *fname = "\\delete.file";
+       const char *fname = "\\delete.file";
        int fnum1 = -1;
        int fnum2 = -1;
        BOOL correct = True;
@@ -2755,6 +2788,36 @@ static BOOL run_deletetest(int dummy)
        return correct;
 }
 
+
+/*
+  print out server properties
+ */
+static BOOL run_properties(int dummy)
+{
+       static struct cli_state cli;
+       BOOL correct = True;
+       
+       printf("starting properties test\n");
+       
+       ZERO_STRUCT(cli);
+
+       if (!torture_open_connection(&cli)) {
+               return False;
+       }
+       
+       cli_sockopt(&cli, sockops);
+
+       d_printf("Capabilities 0x%08x\n", cli.capabilities);
+
+       if (!torture_close_connection(&cli)) {
+               correct = False;
+       }
+
+       return correct;
+}
+
+
+
 /* FIRST_DESIRED_ACCESS   0xf019f */
 #define FIRST_DESIRED_ACCESS   FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|\
                                FILE_READ_EA|                           /* 0xf */ \
@@ -2780,7 +2843,7 @@ static BOOL run_deletetest(int dummy)
 static BOOL run_xcopy(int dummy)
 {
        static struct cli_state cli1;
-       char *fname = "\\test.txt";
+       const char *fname = "\\test.txt";
        BOOL correct = True;
        int fnum1, fnum2;
 
@@ -2822,8 +2885,8 @@ static BOOL run_xcopy(int dummy)
 static BOOL run_rename(int dummy)
 {
        static struct cli_state cli1;
-       char *fname = "\\test.txt";
-       char *fname1 = "\\test1.txt";
+       const char *fname = "\\test.txt";
+       const char *fname1 = "\\test1.txt";
        BOOL correct = True;
        int fnum1;
 
@@ -2858,7 +2921,11 @@ static BOOL run_rename(int dummy)
        cli_unlink(&cli1, fname);
        cli_unlink(&cli1, fname1);
        fnum1 = cli_nt_create_full(&cli1, fname,GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+#if 0
+                                  FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+#else
                                   FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0);
+#endif
 
        if (fnum1 == -1) {
                printf("Second open failed - %s\n", cli_errstr(&cli1));
@@ -2880,6 +2947,53 @@ static BOOL run_rename(int dummy)
        cli_unlink(&cli1, fname);
        cli_unlink(&cli1, fname1);
 
+       fnum1 = cli_nt_create_full(&cli1, fname,READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("Third open failed - %s\n", cli_errstr(&cli1));
+               return False;
+       }
+
+
+#if 0
+  {
+  int fnum2;
+
+       fnum2 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("Fourth open failed - %s\n", cli_errstr(&cli1));
+               return False;
+       }
+       if (!cli_nt_delete_on_close(&cli1, fnum2, True)) {
+               printf("[8] setting delete_on_close on file failed !\n");
+               return False;
+       }
+       
+       if (!cli_close(&cli1, fnum2)) {
+               printf("close - 4 failed (%s)\n", cli_errstr(&cli1));
+               return False;
+       }
+  }
+#endif
+
+       if (!cli_rename(&cli1, fname, fname1)) {
+               printf("Third rename failed - this should have succeeded - %s\n", cli_errstr(&cli1));
+               correct = False;
+       } else {
+               printf("Third rename succeeded\n");
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("close - 3 failed (%s)\n", cli_errstr(&cli1));
+               return False;
+       }
+
+       cli_unlink(&cli1, fname);
+       cli_unlink(&cli1, fname1);
+
        if (!torture_close_connection(&cli1)) {
                correct = False;
        }
@@ -2887,6 +3001,34 @@ static BOOL run_rename(int dummy)
        return correct;
 }
 
+static BOOL run_pipe_number(int dummy)
+{
+       static struct cli_state cli1;
+       const char *pipe_name = "\\SPOOLSS";
+       int fnum;
+       int num_pipes = 0;
+
+       printf("starting pipenumber test\n");
+       if (!torture_open_connection(&cli1)) {
+               return False;
+       }
+
+       cli_sockopt(&cli1, sockops);
+       while(1) {
+               fnum = cli_nt_create_full(&cli1, pipe_name,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0);
+
+               if (fnum == -1) {
+                       printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(&cli1));
+                       break;
+               }
+               num_pipes++;
+       }
+
+       printf("pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
+       torture_close_connection(&cli1);
+       return True;
+}
 
 /*
   Test open mode returns on read-only files.
@@ -2894,12 +3036,14 @@ static BOOL run_rename(int dummy)
 static BOOL run_opentest(int dummy)
 {
        static struct cli_state cli1;
-       char *fname = "\\readonly.file";
+       static struct cli_state cli2;
+       const char *fname = "\\readonly.file";
        int fnum1, fnum2;
        char buf[20];
        size_t fsize;
        BOOL correct = True;
        char *tmp_path;
+       uint16 attr;
 
        printf("starting open test\n");
        
@@ -3048,9 +3192,331 @@ static BOOL run_opentest(int dummy)
                printf("unlink of temp failed (%s)\n", cli_errstr(&cli1));
        }
        
+       /* Test the non-io opens... */
+
+       if (!torture_open_connection(&cli2)) {
+               return False;
+       }
+       
+       cli_setatr(&cli2, fname, 0, 0);
+       cli_unlink(&cli2, fname);
+       
+       cli_sockopt(&cli2, sockops);
+
+       printf("TEST #1 testing 2 non-io opens (no delete)\n");
+       
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 1 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+       if (!cli_close(&cli2, fnum2)) {
+               printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("non-io open test #1 passed.\n");
+
+       cli_unlink(&cli1, fname);
+
+       printf("TEST #2 testing 2 non-io opens (first with delete)\n");
+       
+       fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 2 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+       if (!cli_close(&cli2, fnum2)) {
+               printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       printf("non-io open test #2 passed.\n");
+
+       cli_unlink(&cli1, fname);
+
+       printf("TEST #3 testing 2 non-io opens (second with delete)\n");
+       
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 3 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 3 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+       if (!cli_close(&cli2, fnum2)) {
+               printf("test 3 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("non-io open test #3 passed.\n");
+
+       cli_unlink(&cli1, fname);
+
+       printf("TEST #4 testing 2 non-io opens (both with delete)\n");
+       
+       fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 4 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0);
+
+       if (fnum2 != -1) {
+               printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("test 3 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(&cli2), "sharing violation");
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 4 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       printf("non-io open test #4 passed.\n");
+
+       cli_unlink(&cli1, fname);
+
+       printf("TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n");
+       
+       fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 5 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_DELETE, FILE_OPEN_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 5 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli2, fnum2)) {
+               printf("test 5 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("non-io open test #5 passed.\n");
+
+       printf("TEST #6 testing 1 non-io open, one io open\n");
+       
+       cli_unlink(&cli1, fname);
+
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 6 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ, FILE_OPEN_IF, 0);
+
+       if (fnum2 == -1) {
+               printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 6 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli2, fnum2)) {
+               printf("test 6 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("non-io open test #6 passed.\n");
+
+       printf("TEST #7 testing 1 non-io open, one io open with delete\n");
+
+       cli_unlink(&cli1, fname);
+
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 7 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0);
+
+       if (fnum2 != -1) {
+               printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(&cli2));
+               return False;
+       }
+
+       printf("test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(&cli2), "sharing violation");
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 7 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       printf("non-io open test #7 passed.\n");
+
+       cli_unlink(&cli1, fname);
+
+       /* Test 8 - attributes test #1... */
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_WRITE_DATA, FILE_ATTRIBUTE_HIDDEN,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 8 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 8 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       /* FILE_SUPERSEDE && FILE_OVERWRITE_IF have the same effect here. */
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 8 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 8 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       /* This open should fail with ACCESS_DENIED for FILE_SUPERSEDE, FILE_OVERWRITE and FILE_OVERWRITE_IF. */
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE, 0);
+
+       if (fnum1 != -1) {
+               printf("test 8 open 3 of %s succeeded - should have failed with (NT_STATUS_ACCESS_DENIED)\n", fname);
+               correct = False;
+               cli_close(&cli1, fnum1);
+       } else {
+               if (check_error(__LINE__, &cli1, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED)) {
+                       printf("correct error code NT_STATUS_ACCESS_DENIED/ERRDOS:ERRnoaccess returned\n");
+               }
+       }
+
+       printf("Attribute open test #8 %s.\n", correct ? "passed" : "failed");
+
+       cli_unlink(&cli1, fname);
+
+       /*
+        * Test #9. Open with NORMAL, close, then re-open with attribute
+        * HIDDEN and request to truncate.
+        */
+
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_WRITE_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+
+       if (fnum1 == -1) {
+               printf("test 9 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 9 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA|FILE_WRITE_DATA, FILE_ATTRIBUTE_HIDDEN,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE, 0);
+
+       if (fnum1 == -1) {
+               printf("test 9 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!cli_close(&cli1, fnum1)) {
+               printf("test 9 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+               return False;
+       }
+
+       /* Ensure we have attr hidden. */
+       if (!cli_getatr(&cli1, fname, &attr, NULL, NULL)) {
+               printf("test 9 getatr(2) failed (%s)\n", cli_errstr(&cli1));
+               return False;
+       }
+
+       if (!(attr & FILE_ATTRIBUTE_HIDDEN)) {
+               printf("test 9 getatr didn't have HIDDEN attribute\n");
+               cli_unlink(&cli1, fname);
+               return False;
+       }
+
+       printf("Attribute open test #9 %s.\n", correct ? "passed" : "failed");
+
+       cli_unlink(&cli1, fname);
+
        if (!torture_close_connection(&cli1)) {
                correct = False;
        }
+       if (!torture_close_connection(&cli2)) {
+               correct = False;
+       }
        
        return correct;
 }
@@ -3080,7 +3546,7 @@ static BOOL run_dirtest(int dummy)
        cli_sockopt(&cli, sockops);
 
        srandom(0);
-       for (i=0;i<numops;i++) {
+       for (i=0;i<torture_numops;i++) {
                fstring fname;
                slprintf(fname, sizeof(fname), "\\%x", (int)random());
                fnum = cli_open(&cli, fname, O_RDWR|O_CREAT, DENY_NONE);
@@ -3100,7 +3566,7 @@ static BOOL run_dirtest(int dummy)
        printf("dirtest core %g seconds\n", end_timer() - t1);
 
        srandom(0);
-       for (i=0;i<numops;i++) {
+       for (i=0;i<torture_numops;i++) {
                fstring fname;
                slprintf(fname, sizeof(fname), "\\%x", (int)random());
                cli_unlink(&cli, fname);
@@ -3115,6 +3581,105 @@ static BOOL run_dirtest(int dummy)
        return correct;
 }
 
+static void del_fn(file_info *finfo, const char *mask, void *state)
+{
+       struct cli_state *pcli = (struct cli_state *)state;
+       fstring fname;
+       slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
+
+       if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
+               return;
+
+       if (finfo->mode & aDIR) {
+               if (!cli_rmdir(pcli, fname))
+                       printf("del_fn: failed to rmdir %s\n,", fname );
+       } else {
+               if (!cli_unlink(pcli, fname))
+                       printf("del_fn: failed to unlink %s\n,", fname );
+       }
+}
+
+static BOOL run_dirtest1(int dummy)
+{
+       int i;
+       static struct cli_state cli;
+       int fnum, num_seen;
+       BOOL correct = True;
+
+       printf("starting directory test\n");
+
+       if (!torture_open_connection(&cli)) {
+               return False;
+       }
+
+       cli_sockopt(&cli, sockops);
+
+       cli_list(&cli, "\\LISTDIR\\*", 0, del_fn, &cli);
+       cli_list(&cli, "\\LISTDIR\\*", aDIR, del_fn, &cli);
+       cli_rmdir(&cli, "\\LISTDIR");
+       cli_mkdir(&cli, "\\LISTDIR");
+
+       /* Create 1000 files and 1000 directories. */
+       for (i=0;i<1000;i++) {
+               fstring fname;
+               slprintf(fname, sizeof(fname), "\\LISTDIR\\f%d", i);
+               fnum = cli_nt_create_full(&cli, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
+                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
+               if (fnum == -1) {
+                       fprintf(stderr,"Failed to open %s\n", fname);
+                       return False;
+               }
+               cli_close(&cli, fnum);
+       }
+       for (i=0;i<1000;i++) {
+               fstring fname;
+               slprintf(fname, sizeof(fname), "\\LISTDIR\\d%d", i);
+               if (!cli_mkdir(&cli, fname)) {
+                       fprintf(stderr,"Failed to open %s\n", fname);
+                       return False;
+               }
+       }
+
+       /* Now ensure that doing an old list sees both files and directories. */
+       num_seen = cli_list_old(&cli, "\\LISTDIR\\*", aDIR, list_fn, NULL);
+       printf("num_seen = %d\n", num_seen );
+       /* We should see 100 files + 1000 directories + . and .. */
+       if (num_seen != 2002)
+               correct = False;
+
+       /* Ensure if we have the "must have" bits we only see the
+        * relevent entries.
+        */
+       num_seen = cli_list_old(&cli, "\\LISTDIR\\*", (aDIR<<8)|aDIR, list_fn, NULL);
+       printf("num_seen = %d\n", num_seen );
+       if (num_seen != 1002)
+               correct = False;
+
+       num_seen = cli_list_old(&cli, "\\LISTDIR\\*", (aARCH<<8)|aDIR, list_fn, NULL);
+       printf("num_seen = %d\n", num_seen );
+       if (num_seen != 1000)
+               correct = False;
+
+       /* Delete everything. */
+       cli_list(&cli, "\\LISTDIR\\*", 0, del_fn, &cli);
+       cli_list(&cli, "\\LISTDIR\\*", aDIR, del_fn, &cli);
+       cli_rmdir(&cli, "\\LISTDIR");
+
+#if 0
+       printf("Matched %d\n", cli_list(&cli, "a*.*", 0, list_fn, NULL));
+       printf("Matched %d\n", cli_list(&cli, "b*.*", 0, list_fn, NULL));
+       printf("Matched %d\n", cli_list(&cli, "xyzabc", 0, list_fn, NULL));
+#endif
+
+       if (!torture_close_connection(&cli)) {
+               correct = False;
+       }
+
+       printf("finished dirtest1\n");
+
+       return correct;
+}
+
 static BOOL run_error_map_extract(int dummy) {
        
        static struct cli_state c_dos;
@@ -3271,7 +3836,7 @@ static double create_procs(BOOL (*fn)(int), BOOL *result)
 
                        child_status[i] = getpid();
 
-                       while (child_status[i]) msleep(2);
+                       while (child_status[i] && end_timer() < 5) msleep(2);
 
                        child_status_out[i] = fn(i);
                        _exit(0);
@@ -3319,7 +3884,7 @@ static double create_procs(BOOL (*fn)(int), BOOL *result)
 #define FLAG_MULTIPROC 1
 
 static struct {
-       char *name;
+       const char *name;
        BOOL (*fn)(int);
        unsigned flags;
 } torture_ops[] = {
@@ -3343,6 +3908,7 @@ static struct {
        {"OPLOCK2",  run_oplock2, 0},
        {"OPLOCK3",  run_oplock3, 0},
        {"DIR",  run_dirtest, 0},
+       {"DIR1",  run_dirtest1, 0},
        {"DENY1",  torture_denytest1, 0},
        {"DENY2",  torture_denytest2, 0},
        {"TCON",  run_tcon_test, 0},
@@ -3353,12 +3919,15 @@ static struct {
        {"XCOPY", run_xcopy, 0},
        {"RENAME", run_rename, 0},
        {"DELETE", run_deletetest, 0},
+       {"PROPERTIES", run_properties, 0},
+       {"MANGLE", torture_mangle, 0},
        {"W2K", run_w2ktest, 0},
        {"TRANS2SCAN", torture_trans2_scan, 0},
        {"NTTRANSSCAN", torture_nttrans_scan, 0},
        {"UTABLE", torture_utable, 0},
        {"CASETABLE", torture_casetable, 0},
        {"ERRMAPEXTRACT", run_error_map_extract, 0},
+       {"PIPE_NUMBER", run_pipe_number, 0},
        {NULL, NULL, 0}};
 
 
@@ -3366,7 +3935,7 @@ static struct {
 /****************************************************************************
 run a specified test or "ALL"
 ****************************************************************************/
-static BOOL run_test(char *name)
+static BOOL run_test(const char *name)
 {
        BOOL ret = True;
        BOOL result = True;
@@ -3424,6 +3993,7 @@ static void usage(void)
        printf("\t-L use oplocks\n");
        printf("\t-c CLIENT.TXT   specify client load file for NBENCH\n");
        printf("\t-A showall\n");
+       printf("\t-s seed\n");
        printf("\n\n");
 
        printf("tests are:");
@@ -3448,6 +4018,7 @@ static void usage(void)
 {
        int opt, i;
        char *p;
+       int gotuser = 0;
        int gotpass = 0;
        extern char *optarg;
        extern int optind;
@@ -3485,17 +4056,21 @@ static void usage(void)
        get_myname(myname);
 
        if (*username == 0 && getenv("LOGNAME")) {
-         pstrcpy(username,getenv("LOGNAME"));
+         fstrcpy(username,getenv("LOGNAME"));
        }
 
        argc--;
        argv++;
 
+       srandom(time(NULL));
 
        fstrcpy(workgroup, lp_workgroup());
 
-       while ((opt = getopt(argc, argv, "hW:U:n:N:O:o:m:Ld:Ac:k")) != EOF) {
+       while ((opt = getopt(argc, argv, "hW:U:n:N:O:o:m:Ld:Ac:ks:")) != EOF) {
                switch (opt) {
+               case 's':
+                       srandom(atoi(optarg));
+                       break;
                case 'W':
                        fstrcpy(workgroup,optarg);
                        break;
@@ -3506,7 +4081,7 @@ static void usage(void)
                        nprocs = atoi(optarg);
                        break;
                case 'o':
-                       numops = atoi(optarg);
+                       torture_numops = atoi(optarg);
                        break;
                case 'd':
                        DEBUGLEVEL = atoi(optarg);
@@ -3529,18 +4104,18 @@ static void usage(void)
                case 'k':
 #ifdef HAVE_KRB5
                        use_kerberos = True;
-                       gotpass = True;
 #else
                        d_printf("No kerberos support compiled in\n");
                        exit(1);
 #endif
                        break;
                case 'U':
-                       pstrcpy(username,optarg);
+                       gotuser = 1;
+                       fstrcpy(username,optarg);
                        p = strchr_m(username,'%');
                        if (p) {
                                *p = 0;
-                               pstrcpy(password, p+1);
+                               fstrcpy(password, p+1);
                                gotpass = 1;
                        }
                        break;
@@ -3550,11 +4125,12 @@ static void usage(void)
                }
        }
 
+       if(use_kerberos && !gotuser) gotpass = True;
 
        while (!gotpass) {
                p = getpass("Password:");
                if (p) {
-                       pstrcpy(password, p);
+                       fstrcpy(password, p);
                        gotpass = 1;
                }
        }