This commit was manufactured by cvs2svn to create branch 'SAMBA_3_0'.(This used to...
[jra/samba/.git] / source3 / torture / torture.c
index 101f4071cbb5149f33766c69a7d80a69598514ab..3fd0d7aa6678d529fc4ed622a1bc203559775786 100644 (file)
@@ -24,7 +24,7 @@
 
 static fstring host, workgroup, share, password, username, myname;
 static int max_protocol = PROTOCOL_NT1;
-static char *sockops="TCP_NODELAY";
+static const char *sockops="TCP_NODELAY";
 static int nprocs=1;
 int torture_numops=100;
 static int procnum; /* records process count number when forking */
@@ -32,7 +32,7 @@ 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;
@@ -221,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;
@@ -428,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;
@@ -554,7 +554,7 @@ 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[126*1024];
        BOOL correct = True;
@@ -782,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;
@@ -827,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 {
@@ -841,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));
@@ -889,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];
@@ -972,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;
 
@@ -1108,7 +1112,7 @@ 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;
@@ -1233,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];
@@ -1404,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];
@@ -1528,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;
@@ -1572,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;
 
@@ -1627,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;
 
@@ -1676,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;
@@ -1862,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");
@@ -1927,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;
 
@@ -2079,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;
 
@@ -2114,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;
 
@@ -2163,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];
@@ -2305,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;
@@ -2360,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;
@@ -2839,7 +2843,7 @@ static BOOL run_properties(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;
 
@@ -2881,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;
 
@@ -3000,7 +3004,7 @@ static BOOL run_rename(int dummy)
 static BOOL run_pipe_number(int dummy)
 {
        static struct cli_state cli1;
-       char *pipe_name = "\\SPOOLSS";
+       const char *pipe_name = "\\SPOOLSS";
        int fnum;
        int num_pipes = 0;
 
@@ -3033,12 +3037,13 @@ static BOOL run_opentest(int dummy)
 {
        static struct cli_state cli1;
        static struct cli_state cli2;
-       char *fname = "\\readonly.file";
+       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");
        
@@ -3413,6 +3418,99 @@ static BOOL run_opentest(int dummy)
 
        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;
        }
@@ -3483,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;
@@ -3687,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[] = {
@@ -3711,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},
@@ -3737,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;
@@ -3820,6 +4018,7 @@ static void usage(void)
 {
        int opt, i;
        char *p;
+       int gotuser = 0;
        int gotpass = 0;
        extern char *optarg;
        extern int optind;
@@ -3857,12 +4056,13 @@ 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());
 
@@ -3904,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;
@@ -3925,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;
                }
        }