r10656: BIG merge from trunk. Features not copied over
[amitay/samba.git] / source3 / torture / torture.c
index 5ff7c3bb2d87a4d91c4f6442d7c4d853fad30536..8ad567f17781c79682298d1317346afe43c2b3a7 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#define NO_SYSLOG
-
 #include "includes.h"
 
+extern char *optarg;
+extern int optind;
+
 static fstring host, workgroup, share, password, username, myname;
 static int max_protocol = PROTOCOL_NT1;
 static const char *sockops="TCP_NODELAY";
@@ -45,12 +46,12 @@ static struct timeval tp1,tp2;
 
 void start_timer(void)
 {
-       gettimeofday(&tp1,NULL);
+       GetTimeOfDay(&tp1);
 }
 
 double end_timer(void)
 {
-       gettimeofday(&tp2,NULL);
+       GetTimeOfDay(&tp2);
        return((tp2.tv_sec - tp1.tv_sec) + 
               (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
 }
@@ -70,7 +71,7 @@ void *shm_setup(int size)
        int shmid;
        void *ret;
 
-       shmid = shmget(IPC_PRIVATE, size, SHM_R | SHM_W);
+       shmid = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
        if (shmid == -1) {
                printf("can't get shared memory\n");
                exit(1);
@@ -159,7 +160,7 @@ BOOL torture_open_connection(struct cli_state **c)
                                     host, NULL, port_to_use, 
                                     share, "?????", 
                                     username, workgroup, 
-                                    password, flags, &retry);
+                                    password, flags, Undefined, &retry);
        if (!NT_STATUS_IS_OK(status)) {
                return False;
        }
@@ -207,16 +208,16 @@ static BOOL check_error(int line, struct cli_state *c,
                        uint8 eclass, uint32 ecode, NTSTATUS nterr)
 {
         if (cli_is_dos_error(c)) {
-                uint8 class;
+                uint8 cclass;
                 uint32 num;
 
                 /* Check DOS error */
 
-                cli_dos_error(c, &class, &num);
+                cli_dos_error(c, &cclass, &num);
 
-                if (eclass != class || ecode != num) {
+                if (eclass != cclass || ecode != num) {
                         printf("unexpected error code class=%d code=%d\n", 
-                               (int)class, (int)num);
+                               (int)cclass, (int)num);
                         printf(" expected %d/%d %s (line=%d)\n", 
                                (int)eclass, (int)ecode, nt_errstr(nterr), line);
                         return False;
@@ -389,7 +390,7 @@ static BOOL rw_torture3(struct cli_state *c, char *lockfname)
                {
                        fnum = cli_open(c, lockfname, O_RDONLY, 
                                         DENY_NONE);
-                       msleep(10);
+                       smb_msleep(10);
                }
                if (fnum == -1) {
                        printf("second open read-only of %s failed (%s)\n",
@@ -427,9 +428,9 @@ static BOOL rw_torture3(struct cli_state *c, char *lockfname)
                                                  sizeof(buf)-count);
                        if (sent < 0)
                        {
-                               printf("read failed offset:%d size:%d (%s)\n",
-                                               count, sizeof(buf)-count,
-                                               cli_errstr(c));
+                               printf("read failed offset:%d size:%ld (%s)\n",
+                                      count, (unsigned long)sizeof(buf)-count,
+                                      cli_errstr(c));
                                correct = False;
                                sent = 0;
                        }
@@ -438,8 +439,7 @@ static BOOL rw_torture3(struct cli_state *c, char *lockfname)
                                if (memcmp(buf_rd+count, buf+count, sent) != 0)
                                {
                                        printf("read/write compare failed\n");
-                                       printf("offset: %d req %d recvd %d\n",
-                                               count, sizeof(buf)-count, sent);
+                                       printf("offset: %d req %ld recvd %ld\n", count, (unsigned long)sizeof(buf)-count, (unsigned long)sent);
                                        correct = False;
                                        break;
                                }
@@ -494,23 +494,27 @@ static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
                        printf("%d\r", i); fflush(stdout);
                }
 
-               generate_random_buffer(buf, buf_size, False);
+               generate_random_buffer(buf, buf_size);
 
                if (cli_write(c1, fnum1, 0, buf, 0, buf_size) != buf_size) {
                        printf("write failed (%s)\n", cli_errstr(c1));
                        correct = False;
+                       break;
                }
 
                if ((bytes_read = cli_read(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
                        printf("read failed (%s)\n", cli_errstr(c2));
-                       printf("read %d, expected %d\n", bytes_read, buf_size); 
+                       printf("read %d, expected %ld\n", bytes_read, 
+                              (unsigned long)buf_size); 
                        correct = False;
+                       break;
                }
 
                if (memcmp(buf_rd, buf, buf_size) != 0)
                {
                        printf("read/write compare failed\n");
                        correct = False;
+                       break;
                }
        }
 
@@ -534,7 +538,7 @@ static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
 static BOOL run_readwritetest(int dummy)
 {
        static struct cli_state *cli1, *cli2;
-       BOOL test1, test2;
+       BOOL test1, test2 = False;
 
        if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
                return False;
@@ -547,8 +551,10 @@ static BOOL run_readwritetest(int dummy)
        test1 = rw_torture2(cli1, cli2);
        printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));
 
-       test2 = rw_torture2(cli1, cli1);
-       printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
+       if (test1) {
+               test2 = rw_torture2(cli1, cli1);
+               printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
+       }
 
        if (!torture_close_connection(cli1)) {
                test1 = False;
@@ -568,12 +574,12 @@ static BOOL run_readwritemulti(int dummy)
 
        cli = current_cli;
 
-       cli_sockopt(&cli, sockops);
+       cli_sockopt(cli, sockops);
 
        printf("run_readwritemulti: fname %s\n", randomfname);
-       test = rw_torture3(&cli, randomfname);
+       test = rw_torture3(cli, randomfname);
 
-       if (!torture_close_connection(&cli)) {
+       if (!torture_close_connection(cli)) {
                test = False;
        }
        
@@ -585,7 +591,7 @@ static BOOL run_readwritelarge(int dummy)
        static struct cli_state *cli1;
        int fnum1;
        const char *lockfname = "\\large.dat";
-       size_t fsize;
+       SMB_OFF_T fsize;
        char buf[126*1024];
        BOOL correct = True;
  
@@ -615,9 +621,11 @@ static BOOL run_readwritelarge(int dummy)
        }
 
        if (fsize == sizeof(buf))
-               printf("readwritelarge test 1 succeeded (size = %x)\n", fsize);
+               printf("readwritelarge test 1 succeeded (size = %lx)\n", 
+                      (unsigned long)fsize);
        else {
-               printf("readwritelarge test 1 failed (size = %x)\n", fsize);
+               printf("readwritelarge test 1 failed (size = %lx)\n", 
+                      (unsigned long)fsize);
                correct = False;
        }
 
@@ -647,9 +655,11 @@ static BOOL run_readwritelarge(int dummy)
        }
 
        if (fsize == sizeof(buf))
-               printf("readwritelarge test 2 succeeded (size = %x)\n", fsize);
+               printf("readwritelarge test 2 succeeded (size = %lx)\n", 
+                      (unsigned long)fsize);
        else {
-               printf("readwritelarge test 2 failed (size = %x)\n", fsize);
+               printf("readwritelarge test 2 failed (size = %lx)\n", 
+                      (unsigned long)fsize);
                correct = False;
        }
 
@@ -688,11 +698,10 @@ static BOOL run_netbench(int client)
 {
        struct cli_state *cli;
        int i;
-       fstring fname;
        pstring line;
        char cname[20];
        FILE *f;
-       char *params[20];
+       const char *params[20];
        BOOL correct = True;
 
        cli = current_cli;
@@ -703,7 +712,7 @@ static BOOL run_netbench(int client)
 
        nb_setup(cli);
 
-       slprintf(cname,sizeof(fname), "client%d", client);
+       slprintf(cname,sizeof(cname)-1, "client%d", client);
 
        f = fopen(client_txt, "r");
 
@@ -870,9 +879,10 @@ static BOOL run_locktest1(int dummy)
        }
        t2 = time(NULL);
 
-       if (t2 - t1 < 5) {
+       if (ABS(t2 - t1) < lock_timeout-1) {
                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);
 
@@ -1061,6 +1071,7 @@ static BOOL run_tcon2_test(int dummy)
 
 static BOOL tcon_devtest(struct cli_state *cli,
                         const char *myshare, const char *devtype,
+                        const char *return_devtype,
                         NTSTATUS expected_error)
 {
        BOOL status;
@@ -1071,7 +1082,15 @@ static BOOL tcon_devtest(struct cli_state *cli,
 
        if (NT_STATUS_IS_OK(expected_error)) {
                if (status) {
-                       ret = True;
+                       if (strcmp(cli->dev, return_devtype) == 0) {
+                               ret = True;
+                       } else { 
+                               printf("tconX to share %s with type %s "
+                                      "succeeded but returned the wrong "
+                                      "device type (got [%s] but should have got [%s])\n",
+                                      myshare, devtype, cli->dev, return_devtype);
+                               ret = False;
+                       }
                } else {
                        printf("tconX to share %s with type %s "
                               "should have succeeded but failed\n",
@@ -1107,47 +1126,47 @@ static BOOL run_tcon_devtype_test(int dummy)
        BOOL retry;
        int flags = 0;
        NTSTATUS status;
-       BOOL ret;
+       BOOL ret = True;
 
        status = cli_full_connection(&cli1, myname,
                                     host, NULL, port_to_use,
                                     NULL, NULL,
                                     username, workgroup,
-                                    password, flags, &retry);
+                                    password, flags, Undefined, &retry);
 
        if (!NT_STATUS_IS_OK(status)) {
                printf("could not open connection\n");
                return False;
        }
 
-       if (!tcon_devtest(cli1, "IPC$", "A:", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, "IPC$", "A:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
 
-       if (!tcon_devtest(cli1, "IPC$", "?????", NT_STATUS_OK))
+       if (!tcon_devtest(cli1, "IPC$", "?????", "IPC", NT_STATUS_OK))
                ret = False;
 
-       if (!tcon_devtest(cli1, "IPC$", "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, "IPC$", "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
 
-       if (!tcon_devtest(cli1, "IPC$", "IPC", NT_STATUS_OK))
+       if (!tcon_devtest(cli1, "IPC$", "IPC", "IPC", NT_STATUS_OK))
                ret = False;
                        
-       if (!tcon_devtest(cli1, "IPC$", "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, "IPC$", "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
 
-       if (!tcon_devtest(cli1, share, "A:", NT_STATUS_OK))
+       if (!tcon_devtest(cli1, share, "A:", "A:", NT_STATUS_OK))
                ret = False;
 
-       if (!tcon_devtest(cli1, share, "?????", NT_STATUS_OK))
+       if (!tcon_devtest(cli1, share, "?????", "A:", NT_STATUS_OK))
                ret = False;
 
-       if (!tcon_devtest(cli1, share, "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, share, "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
 
-       if (!tcon_devtest(cli1, share, "IPC", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, share, "IPC", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
                        
-       if (!tcon_devtest(cli1, share, "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
+       if (!tcon_devtest(cli1, share, "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
                ret = False;
 
        cli_shutdown(cli1);
@@ -1959,7 +1978,9 @@ static BOOL run_fdsesstest(int dummy)
        uint16 new_cnum;
        uint16 saved_cnum;
        const char *fname = "\\fdsess.tst";
+       const char *fname1 = "\\fdsess1.tst";
        int fnum1;
+       int fnum2;
        pstring buf;
        BOOL ret = True;
 
@@ -1979,6 +2000,7 @@ static BOOL run_fdsesstest(int dummy)
        printf("starting fdsesstest\n");
 
        cli_unlink(cli, fname);
+       cli_unlink(cli, fname1);
 
        fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
        if (fnum1 == -1) {
@@ -1999,6 +2021,18 @@ static BOOL run_fdsesstest(int dummy)
                       buf);
                ret = False;
        }
+       /* Try to open a file with different vuid, samba cnum. */
+       fnum2 = cli_open(cli, fname1, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
+       if (fnum2 != -1) {
+               printf("create with different vuid, same cnum succeeded.\n");
+               cli_close(cli, fnum2);
+               cli_unlink(cli, fname1);
+       } else {
+               printf("create with different vuid, same cnum failed.\n");
+               printf("This will cause problems with service clients.\n");
+               ret = False;
+       }
+
        cli->vuid = saved_vuid;
 
        /* Try with same vuid, different cnum. */
@@ -2077,7 +2111,7 @@ test how many open files this server supports on the one socket
 static BOOL run_maxfidtest(int dummy)
 {
        struct cli_state *cli;
-       const char *template = "\\maxfid.%d.%d";
+       const char *ftemplate = "\\maxfid.%d.%d";
        fstring fname;
        int fnums[0x11000], i;
        int retries=4;
@@ -2093,7 +2127,7 @@ static BOOL run_maxfidtest(int dummy)
        cli_sockopt(cli, sockops);
 
        for (i=0; i<0x11000; i++) {
-               slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
+               slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
                if ((fnums[i] = cli_open(cli, fname, 
                                        O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) ==
                    -1) {
@@ -2109,7 +2143,7 @@ static BOOL run_maxfidtest(int dummy)
 
        printf("cleaning up\n");
        for (;i>=0;i--) {
-               slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
+               slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
                cli_close(cli, fnums[i]);
                if (!cli_unlink(cli, fname)) {
                        printf("unlink of %s failed (%s)\n", 
@@ -2326,7 +2360,7 @@ static BOOL run_trans2test(int dummy)
 {
        struct cli_state *cli;
        int fnum;
-       size_t size;
+       SMB_OFF_T size;
        time_t c_time, a_time, m_time, w_time, m_time2;
        const char *fname = "\\trans2.tst";
        const char *dname = "\\trans2";
@@ -2459,19 +2493,19 @@ static BOOL run_trans2test(int dummy)
 
 static BOOL new_trans(struct cli_state *pcli, int fnum, int level)
 {
-       char buf[4096];
+       char *buf = NULL;
+       uint32 len;
        BOOL correct = True;
 
-       memset(buf, 0xff, sizeof(buf));
-
-       if (!cli_qfileinfo_test(pcli, fnum, level, buf)) {
+       if (!cli_qfileinfo_test(pcli, fnum, level, &buf, &len)) {
                printf("ERROR: qfileinfo (%d) failed (%s)\n", level, cli_errstr(pcli));
                correct = False;
        } else {
-               printf("qfileinfo: level %d\n", level);
-               dump_data(0, buf, 256);
+               printf("qfileinfo: level %d, len = %u\n", level, len);
+               dump_data(0, buf, len);
                printf("\n");
        }
+       SAFE_FREE(buf);
        return correct;
 }
 
@@ -2632,9 +2666,10 @@ static BOOL run_oplock2(int dummy)
 
        sleep(2);
 
-       /* Ensure cli1 processes the break. */
+       /* Ensure cli1 processes the break. Empty file should always return 0
+        * bytes.  */
 
-       if (cli_read(cli1, fnum1, buf, 0, 4) != 4) {
+       if (cli_read(cli1, fnum1, buf, 0, 4) != 0) {
                printf("read on fnum1 failed (%s)\n", cli_errstr(cli1));
                correct = False;
        }
@@ -2758,8 +2793,8 @@ static BOOL run_oplock3(int dummy)
  */
 static BOOL run_deletetest(int dummy)
 {
-       struct cli_state *cli1;
-       struct cli_state *cli2;
+       struct cli_state *cli1 = NULL;
+       struct cli_state *cli2 = NULL;
        const char *fname = "\\delete.file";
        int fnum1 = -1;
        int fnum2 = -1;
@@ -2778,16 +2813,27 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
        
-       fnum1 = cli_nt_create_full(cli1, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
-                                  FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 
-                                  FILE_DELETE_ON_CLOSE);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  0, FILE_OVERWRITE_IF, 
+                                  FILE_DELETE_ON_CLOSE, 0);
        
        if (fnum1 == -1) {
                printf("[1] open of %s failed (%s)\n", fname, cli_errstr(cli1));
                correct = False;
                goto fail;
        }
-       
+
+#if 0 /* JRATEST */
+        {
+                uint32 *accinfo = NULL;
+                uint32 len;
+                cli_qfileinfo_test(cli1, fnum1, SMB_FILE_ACCESS_INFORMATION, (char **)&accinfo, &len);
+               if (accinfo)
+                       printf("access mode = 0x%lx\n", *accinfo);
+                SAFE_FREE(accinfo);
+        }
+#endif
+
        if (!cli_close(cli1, fnum1)) {
                printf("[1] close failed (%s)\n", cli_errstr(cli1));
                correct = False;
@@ -2808,9 +2854,9 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
        
-       fnum1 = cli_nt_create_full(cli1, fname, GENERIC_ALL_ACCESS,
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS,
                                   FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, 
-                                  FILE_OVERWRITE_IF, 0);
+                                  FILE_OVERWRITE_IF, 0, 0);
        
        if (fnum1 == -1) {
                printf("[2] open of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -2846,8 +2892,8 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
 
-       fnum1 = cli_nt_create_full(cli1, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
-                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
 
        if (fnum1 == -1) {
                printf("[3] open - 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -2858,8 +2904,8 @@ static BOOL run_deletetest(int dummy)
        /* This should fail with a sharing violation - open for delete is only compatible
           with SHARE_DELETE. */
 
-       fnum2 = cli_nt_create_full(cli1, fname, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
-                       FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0);
+       fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                       FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, 0);
 
        if (fnum2 != -1) {
                printf("[3] open  - 2 of %s succeeded - should have failed.\n", fname);
@@ -2869,8 +2915,8 @@ static BOOL run_deletetest(int dummy)
 
        /* This should succeed. */
 
-       fnum2 = cli_nt_create_full(cli1, fname, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
-                       FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
+       fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                       FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
 
        if (fnum2 == -1) {
                printf("[3] open  - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -2914,8 +2960,8 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
 
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
-                       FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+                       FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
                                                                
        if (fnum1 == -1) {
                printf("[4] open of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -2924,8 +2970,8 @@ static BOOL run_deletetest(int dummy)
        }
 
        /* This should succeed. */
-       fnum2 = cli_nt_create_full(cli1, fname, GENERIC_READ_ACCESS,
-                       FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
+       fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
+                       FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
        if (fnum2 == -1) {
                printf("[4] open  - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
                correct = False;
@@ -2945,8 +2991,9 @@ static BOOL run_deletetest(int dummy)
        }
        
        /* This should fail - no more opens once delete on close set. */
-       fnum2 = cli_nt_create_full(cli1, fname, GENERIC_READ_ACCESS,
-                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
+       fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
+                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+                                  FILE_OPEN, 0, 0);
        if (fnum2 != -1) {
                printf("[4] open  - 3 of %s succeeded ! Should have failed.\n", fname );
                correct = False;
@@ -2991,9 +3038,9 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
        
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA,
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
                                   FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
-                                  FILE_OVERWRITE_IF, 0);
+                                  FILE_OVERWRITE_IF, 0, 0);
        
        if (fnum1 == -1) {
                printf("[6] open of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -3021,8 +3068,8 @@ static BOOL run_deletetest(int dummy)
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
        
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
-                                  FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+                                  FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0);
                                                                
        if (fnum1 == -1) {
                printf("[7] open of %s failed (%s)\n", fname, cli_errstr(cli1));
@@ -3077,20 +3124,22 @@ static BOOL run_deletetest(int dummy)
 
        cli_sockopt(cli1, sockops);
        
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
-                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+                                  FILE_OVERWRITE_IF, 0, 0);
        
        if (fnum1 == -1) {
-               printf("[8] open of %s failed (%s)\n", fname, cli_errstr(cli1));
+               printf("[8] open of %s failed (%s)\n", fname, cli_errstr(cli1));
                correct = False;
                goto fail;
        }
 
-       fnum2 = cli_nt_create_full(cli2, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
-                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+                                  FILE_OPEN, 0, 0);
        
        if (fnum2 == -1) {
-               printf("[8] open of %s failed (%s)\n", fname, cli_errstr(cli1));
+               printf("[8] open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
                correct = False;
                goto fail;
        }
@@ -3123,8 +3172,8 @@ static BOOL run_deletetest(int dummy)
                printf("eighth delete on close test succeeded.\n");
 
        /* This should fail - we need to set DELETE_ACCESS. */
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA,
-                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE);
+       fnum1 = cli_nt_create_full(cli1, fname, 0,FILE_READ_DATA|FILE_WRITE_DATA,
+                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
        
        if (fnum1 != -1) {
                printf("[9] open of %s succeeded should have failed!\n", fname);
@@ -3134,8 +3183,8 @@ static BOOL run_deletetest(int dummy)
 
        printf("ninth delete on close test succeeded.\n");
 
-       fnum1 = cli_nt_create_full(cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
-                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
+                                  FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
        if (fnum1 == -1) {
                printf("[10] open of %s failed (%s)\n", fname, cli_errstr(cli1));
                correct = False;
@@ -3157,6 +3206,49 @@ static BOOL run_deletetest(int dummy)
                correct = False;
        } else
                printf("tenth delete on close test succeeded.\n");
+
+       cli_setatr(cli1, fname, 0, 0);
+       cli_unlink(cli1, fname);
+
+       /* What error do we get when attempting to open a read-only file with
+          delete access ? */
+
+       /* Create a readonly file. */
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
+                                  FILE_ATTRIBUTE_READONLY, FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
+       if (fnum1 == -1) {
+               printf("[11] open of %s failed (%s)\n", fname, cli_errstr(cli1));
+               correct = False;
+               goto fail;
+       }
+
+       if (!cli_close(cli1, fnum1)) {
+               printf("[11] close failed (%s)\n", cli_errstr(cli1));
+               correct = False;
+               goto fail;
+       }
+
+       /* Now try open for delete access. */
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES|DELETE_ACCESS,
+                                  0, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+                                  FILE_OVERWRITE_IF, 0, 0);
+       
+       if (fnum1 != -1) {
+               printf("[11] open of %s succeeded should have been denied with ACCESS_DENIED!\n", fname);
+               cli_close(cli1, fnum1);
+               goto fail;
+               correct = False;
+       } else {
+               NTSTATUS nterr = cli_nt_error(cli1);
+               if (!NT_STATUS_EQUAL(nterr,NT_STATUS_ACCESS_DENIED)) {
+                       printf("[11] open of %s should have been denied with ACCESS_DENIED! Got error %s\n", fname, nt_errstr(nterr));
+                       goto fail;
+                       correct = False;
+               } else {
+                       printf("eleventh delete on close test succeeded.\n");
+               }
+       }
+       
        printf("finished delete test\n");
 
   fail:
@@ -3164,15 +3256,15 @@ static BOOL run_deletetest(int dummy)
         * intialized, because these functions don't handle
         * uninitialized connections. */
                
-       cli_close(cli1, fnum1);
-       cli_close(cli1, fnum2);
+       if (fnum1 != -1) cli_close(cli1, fnum1);
+       if (fnum2 != -1) cli_close(cli1, fnum2);
        cli_setatr(cli1, fname, 0, 0);
        cli_unlink(cli1, fname);
 
-       if (!torture_close_connection(cli1)) {
+       if (cli1 && !torture_close_connection(cli1)) {
                correct = False;
        }
-       if (!torture_close_connection(cli2)) {
+       if (cli2 && !torture_close_connection(cli2)) {
                correct = False;
        }
        return correct;
@@ -3243,20 +3335,20 @@ static BOOL run_xcopy(int dummy)
                return False;
        }
        
-       fnum1 = cli_nt_create_full(cli1, fname, 
+       fnum1 = cli_nt_create_full(cli1, fname, 0,
                                   FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
                                   FILE_SHARE_NONE, FILE_OVERWRITE_IF, 
-                                  0x4044);
+                                  0x4044, 0);
 
        if (fnum1 == -1) {
                printf("First open failed - %s\n", cli_errstr(cli1));
                return False;
        }
 
-       fnum2 = cli_nt_create_full(cli1, fname, 
+       fnum2 = cli_nt_create_full(cli1, fname, 0,
                                   SECOND_DESIRED_ACCESS, 0,
                                   FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 
-                                  0x200000);
+                                  0x200000, 0);
        if (fnum2 == -1) {
                printf("second open failed - %s\n", cli_errstr(cli1));
                return False;
@@ -3288,8 +3380,8 @@ 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,
-                                  FILE_SHARE_READ, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
 
        if (fnum1 == -1) {
                printf("First open failed - %s\n", cli_errstr(cli1));
@@ -3297,9 +3389,9 @@ static BOOL run_rename(int dummy)
        }
 
        if (!cli_rename(cli1, fname, fname1)) {
-               printf("First rename failed (this is correct) - %s\n", cli_errstr(cli1));
+               printf("First rename failed (SHARE_READ) (this is correct) - %s\n", cli_errstr(cli1));
        } else {
-               printf("First rename succeeded - this should have failed !\n");
+               printf("First rename succeeded (SHARE_READ) - this should have failed !\n");
                correct = False;
        }
 
@@ -3310,11 +3402,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,
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
 #if 0
-                                  FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+                                  FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
 #else
-                                  FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0);
+                                  FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
 #endif
 
        if (fnum1 == -1) {
@@ -3323,10 +3415,10 @@ static BOOL run_rename(int dummy)
        }
 
        if (!cli_rename(cli1, fname, fname1)) {
-               printf("Second rename failed - this should have succeeded - %s\n", cli_errstr(cli1));
+               printf("Second rename failed (SHARE_DELETE | SHARE_READ) - this should have succeeded - %s\n", cli_errstr(cli1));
                correct = False;
        } else {
-               printf("Second rename succeeded\n");
+               printf("Second rename succeeded (SHARE_DELETE | SHARE_READ)\n");
        }
 
        if (!cli_close(cli1, fnum1)) {
@@ -3337,8 +3429,8 @@ 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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
 
        if (fnum1 == -1) {
                printf("Third open failed - %s\n", cli_errstr(cli1));
@@ -3350,8 +3442,8 @@ static BOOL run_rename(int dummy)
   {
   int fnum2;
 
-       fnum2 = cli_nt_create_full(cli1, fname,DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
-                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+       fnum2 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("Fourth open failed - %s\n", cli_errstr(cli1));
@@ -3370,10 +3462,10 @@ static BOOL run_rename(int dummy)
 #endif
 
        if (!cli_rename(cli1, fname, fname1)) {
-               printf("Third rename failed - this should have succeeded - %s\n", cli_errstr(cli1));
+               printf("Third rename failed (SHARE_NONE) - this should have succeeded - %s\n", cli_errstr(cli1));
                correct = False;
        } else {
-               printf("Third rename succeeded\n");
+               printf("Third rename succeeded (SHARE_NONE)\n");
        }
 
        if (!cli_close(cli1, fnum1)) {
@@ -3384,6 +3476,75 @@ static BOOL run_rename(int dummy)
        cli_unlink(cli1, fname);
        cli_unlink(cli1, fname1);
 
+        /*----*/
+
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
+
+       if (fnum1 == -1) {
+               printf("Fourth open failed - %s\n", cli_errstr(cli1));
+               return False;
+       }
+
+       if (!cli_rename(cli1, fname, fname1)) {
+               printf("Fourth rename failed (SHARE_READ | SHARE_WRITE) (this is correct) - %s\n", cli_errstr(cli1));
+       } else {
+               printf("Fourth rename succeeded (SHARE_READ | SHARE_WRITE) - this should have failed !\n");
+               correct = False;
+       }
+
+       if (!cli_close(cli1, fnum1)) {
+               printf("close - 4 failed (%s)\n", cli_errstr(cli1));
+               return False;
+       }
+
+       cli_unlink(cli1, fname);
+       cli_unlink(cli1, fname1);
+
+        /*--*/
+
+       fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
+
+       if (fnum1 == -1) {
+               printf("Fifth open failed - %s\n", cli_errstr(cli1));
+               return False;
+       }
+
+       if (!cli_rename(cli1, fname, fname1)) {
+               printf("Fifth rename failed (SHARE_READ | SHARE_WRITE | SHARE_DELETE) - this should have failed ! \n");
+               correct = False;
+       } else {
+               printf("Fifth rename succeeded (SHARE_READ | SHARE_WRITE | SHARE_DELETE) (this is correct) - %s\n", cli_errstr(cli1));
+       }
+
+        /*
+         * Now check if the first name still exists ...
+         */
+
+        /*fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
+
+        if (fnum2 == -1) {
+          printf("Opening original file after rename of open file fails: %s\n",
+              cli_errstr(cli1));
+        }
+        else {
+          printf("Opening original file after rename of open file works ...\n");
+          (void)cli_close(cli1, fnum2);
+          } */
+
+        /*--*/
+
+
+       if (!cli_close(cli1, fnum1)) {
+               printf("close - 5 failed (%s)\n", cli_errstr(cli1));
+               return False;
+       }
+
+       cli_unlink(cli1, fname);
+       cli_unlink(cli1, fname1);
+        
        if (!torture_close_connection(cli1)) {
                correct = False;
        }
@@ -3405,8 +3566,8 @@ static BOOL run_pipe_number(int dummy)
 
        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);
+               fnum = cli_nt_create_full(cli1, pipe_name, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0, 0);
 
                if (fnum == -1) {
                        printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(cli1));
@@ -3430,7 +3591,7 @@ static BOOL run_opentest(int dummy)
        const char *fname = "\\readonly.file";
        int fnum1, fnum2;
        char buf[20];
-       size_t fsize;
+       SMB_OFF_T fsize;
        BOOL correct = True;
        char *tmp_path;
 
@@ -3594,16 +3755,16 @@ static BOOL run_opentest(int dummy)
 
        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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
@@ -3625,16 +3786,16 @@ static BOOL run_opentest(int dummy)
 
        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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
@@ -3656,16 +3817,16 @@ static BOOL run_opentest(int dummy)
 
        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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
@@ -3687,16 +3848,16 @@ static BOOL run_opentest(int dummy)
 
        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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 != -1) {
                printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
@@ -3716,16 +3877,16 @@ static BOOL run_opentest(int dummy)
 
        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);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
@@ -3748,16 +3909,16 @@ static BOOL run_opentest(int dummy)
        
        cli_unlink(cli1, fname);
 
-       fnum1 = cli_nt_create_full(cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
-                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 == -1) {
                printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
@@ -3780,16 +3941,16 @@ static BOOL run_opentest(int dummy)
 
        cli_unlink(cli1, fname);
 
-       fnum1 = cli_nt_create_full(cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
-                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 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);
+       fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
+                                  FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
 
        if (fnum2 != -1) {
                printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
@@ -3893,8 +4054,8 @@ static BOOL run_openattrtest(int dummy)
        for (k = 0, i = 0; i < sizeof(open_attrs_table)/sizeof(uint32); i++) {
                cli_setatr(cli1, fname, 0, 0);
                cli_unlink(cli1, fname);
-               fnum1 = cli_nt_create_full(cli1, fname,FILE_WRITE_DATA, open_attrs_table[i],
-                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
+               fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_WRITE_DATA, open_attrs_table[i],
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
 
                if (fnum1 == -1) {
                        printf("open %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
@@ -3907,8 +4068,8 @@ static BOOL run_openattrtest(int dummy)
                }
 
                for (j = 0; j < sizeof(open_attrs_table)/sizeof(uint32); j++) {
-                       fnum1 = cli_nt_create_full(cli1, fname,FILE_READ_DATA|FILE_WRITE_DATA, open_attrs_table[j],
-                                          FILE_SHARE_NONE, FILE_OVERWRITE, 0);
+                       fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA, open_attrs_table[j],
+                                          FILE_SHARE_NONE, FILE_OVERWRITE, 0, 0);
 
                        if (fnum1 == -1) {
                                for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
@@ -3978,7 +4139,7 @@ static BOOL run_openattrtest(int dummy)
        return correct;
 }
 
-static void list_fn(file_info *finfo, const char *name, void *state)
+static void list_fn(const char *mnt, file_info *finfo, const char *name, void *state)
 {
        
 }
@@ -4038,7 +4199,7 @@ static BOOL run_dirtest(int dummy)
        return correct;
 }
 
-static void del_fn(file_info *finfo, const char *mask, void *state)
+static void del_fn(const char *mnt, file_info *finfo, const char *mask, void *state)
 {
        struct cli_state *pcli = (struct cli_state *)state;
        fstring fname;
@@ -4193,8 +4354,114 @@ BOOL torture_chkpath_test(int dummy)
        return ret;
 }
 
+static BOOL run_eatest(int dummy)
+{
+       static struct cli_state *cli;
+       const char *fname = "\\eatest.txt";
+       BOOL correct = True;
+       int fnum, i;
+       size_t num_eas;
+       struct ea_struct *ea_list = NULL;
+       TALLOC_CTX *mem_ctx = talloc_init("eatest");
 
+       printf("starting eatest\n");
+       
+       if (!torture_open_connection(&cli)) {
+               return False;
+       }
+       
+       cli_unlink(cli, fname);
+       fnum = cli_nt_create_full(cli, fname, 0,
+                                  FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
+                                  FILE_SHARE_NONE, FILE_OVERWRITE_IF, 
+                                  0x4044, 0);
 
+       if (fnum == -1) {
+               printf("open failed - %s\n", cli_errstr(cli));
+               return False;
+       }
+
+       for (i = 0; i < 10; i++) {
+               fstring ea_name, ea_val;
+
+               slprintf(ea_name, sizeof(ea_name), "EA_%d", i);
+               memset(ea_val, (char)i+1, i+1);
+               if (!cli_set_ea_fnum(cli, fnum, ea_name, ea_val, i+1)) {
+                       printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+                       return False;
+               }
+       }
+       
+       cli_close(cli, fnum);
+       for (i = 0; i < 10; i++) {
+               fstring ea_name, ea_val;
+
+               slprintf(ea_name, sizeof(ea_name), "EA_%d", i+10);
+               memset(ea_val, (char)i+1, i+1);
+               if (!cli_set_ea_path(cli, fname, ea_name, ea_val, i+1)) {
+                       printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+                       return False;
+               }
+       }
+       
+       if (!cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list)) {
+               printf("ea_get list failed - %s\n", cli_errstr(cli));
+               correct = False;
+       }
+
+       printf("num_eas = %d\n", num_eas);
+
+       if (num_eas != 20) {
+               printf("Should be 20 EA's stored... failing.\n");
+               correct = False;
+       }
+
+       for (i = 0; i < num_eas; i++) {
+               printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
+               dump_data(0, ea_list[i].value.data, ea_list[i].value.length);
+       }
+
+       /* Setting EA's to zero length deletes them. Test this */
+       printf("Now deleting all EA's - case indepenent....\n");
+
+       for (i = 0; i < 20; i++) {
+               fstring ea_name;
+               slprintf(ea_name, sizeof(ea_name), "ea_%d", i);
+               if (!cli_set_ea_path(cli, fname, ea_name, "", 0)) {
+                       printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+                       return False;
+               }
+       }
+       
+       if (!cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list)) {
+               printf("ea_get list failed - %s\n", cli_errstr(cli));
+               correct = False;
+       }
+
+       printf("num_eas = %d\n", num_eas);
+       for (i = 0; i < num_eas; i++) {
+               printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
+               dump_data(0, ea_list[i].value.data, ea_list[i].value.length);
+       }
+
+       if (num_eas != 0) {
+               printf("deleting EA's failed.\n");
+               correct = False;
+       }
+
+       /* Try and delete a non existant EA. */
+       if (!cli_set_ea_path(cli, fname, "foo", "", 0)) {
+               printf("deleting non-existant EA 'foo' should succeed. %s\n", cli_errstr(cli));
+               correct = False;
+       }
+
+       talloc_destroy(mem_ctx);
+       if (!torture_close_connection(cli)) {
+               correct = False;
+       }
+       
+       return correct;
+}
 
 static BOOL run_dirtest1(int dummy)
 {
@@ -4220,8 +4487,8 @@ static BOOL run_dirtest1(int dummy)
        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);
+               fnum = cli_nt_create_full(cli, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
+                                  FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
                if (fnum == -1) {
                        fprintf(stderr,"Failed to open %s\n", fname);
                        return False;
@@ -4333,7 +4600,7 @@ static BOOL run_error_map_extract(int dummy) {
        }
 
        for (error=(0xc0000000 | 0x1); error < (0xc0000000| 0xFFF); error++) {
-               snprintf(user, sizeof(user), "%X", error);
+               fstr_sprintf(user, "%X", error);
 
                if (cli_session_setup(&c_nt, user, 
                                       password, strlen(password),
@@ -4427,12 +4694,12 @@ static double create_procs(BOOL (*fn)(int), BOOL *result)
                                        printf("pid %d failed to start\n", (int)getpid());
                                        _exit(1);
                                }
-                               msleep(10);     
+                               smb_msleep(10); 
                        }
 
                        child_status[i] = getpid();
 
-                       while (child_status[i] && end_timer() < 5) msleep(2);
+                       while (child_status[i] && end_timer() < 5) smb_msleep(2);
 
                        child_status_out[i] = fn(i);
                        _exit(0);
@@ -4445,7 +4712,7 @@ static double create_procs(BOOL (*fn)(int), BOOL *result)
                        if (child_status[i]) synccount++;
                }
                if (synccount == nprocs) break;
-               msleep(10);
+               smb_msleep(10);
        } while (end_timer() < 30);
 
        if (synccount != nprocs) {
@@ -4533,6 +4800,7 @@ static struct {
        {"IOCTL",  torture_ioctl_test, 0},
        {"CHKPATH",  torture_chkpath_test, 0},
        {"FDSESS", run_fdsesstest, 0},
+       { "EATEST", run_eatest, 0},
        {NULL, NULL, 0}};
 
 
@@ -4544,19 +4812,22 @@ static BOOL run_test(const char *name)
 {
        BOOL ret = True;
        BOOL result = True;
+       BOOL found = False;
        int i;
        double t;
        if (strequal(name,"ALL")) {
                for (i=0;torture_ops[i].name;i++) {
                        run_test(torture_ops[i].name);
                }
+               found = True;
        }
        
        for (i=0;torture_ops[i].name;i++) {
-               snprintf(randomfname, sizeof(randomfname), "\\XX%x", 
+               fstr_sprintf(randomfname, "\\XX%x", 
                         (unsigned)random());
 
                if (strequal(name, torture_ops[i].name)) {
+                       found = True;
                        printf("Running %s\n", name);
                        if (torture_ops[i].flags & FLAG_MULTIPROC) {
                                t = create_procs(torture_ops[i].fn, &result);
@@ -4576,6 +4847,12 @@ static BOOL run_test(const char *name)
                        printf("%s took %g secs\n\n", name, t);
                }
        }
+
+       if (!found) {
+               printf("Did not find a test named %s\n", name);
+               ret = False;
+       }
+
        return ret;
 }
 
@@ -4584,6 +4861,9 @@ static void usage(void)
 {
        int i;
 
+       printf("WARNING samba4 test suite is much more complete nowadays.\n");
+       printf("Please use samba4 torture.\n\n");
+
        printf("Usage: smbtorture //server/share <options> TEST1 TEST2 ...\n");
 
        printf("\t-d debuglevel\n");
@@ -4622,8 +4902,6 @@ static void usage(void)
        char *p;
        int gotuser = 0;
        int gotpass = 0;
-       extern char *optarg;
-       extern int optind;
        BOOL correct = True;
 
        dbf = x_stdout;
@@ -4743,10 +5021,10 @@ static void usage(void)
        printf("host=%s share=%s user=%s myname=%s\n", 
               host, share, username, myname);
 
-       if (argc == 1) {
+       if (argc == optind) {
                correct = run_test("ALL");
        } else {
-               for (i=1;i<argc;i++) {
+               for (i=optind;i<argc;i++) {
                        if (!run_test(argv[i])) {
                                correct = False;
                        }