2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1997-1998
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 static fstring host, workgroup, share, password, username, myname;
26 static int max_protocol = PROTOCOL_NT1;
27 static const char *sockops="TCP_NODELAY";
29 static int port_to_use=0;
30 int torture_numops=100;
31 static int procnum; /* records process count number when forking */
32 static struct cli_state *current_cli;
33 static fstring randomfname;
34 static BOOL use_oplocks;
35 static BOOL use_level_II_oplocks;
36 static const char *client_txt = "client_oplocks.txt";
37 static BOOL use_kerberos;
39 BOOL torture_showall = False;
41 static double create_procs(BOOL (*fn)(int), BOOL *result);
44 static struct timeval tp1,tp2;
46 void start_timer(void)
48 gettimeofday(&tp1,NULL);
51 double end_timer(void)
53 gettimeofday(&tp2,NULL);
54 return((tp2.tv_sec - tp1.tv_sec) +
55 (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
59 /* return a pointer to a anonymous shared memory segment of size "size"
60 which will persist across fork() but will disappear when all processes
63 The memory is not zeroed
65 This function uses system5 shared memory. It takes advantage of a property
66 that the memory is not destroyed if it is attached when the id is removed
68 void *shm_setup(int size)
73 shmid = shmget(IPC_PRIVATE, size, SHM_R | SHM_W);
75 printf("can't get shared memory\n");
78 ret = (void *)shmat(shmid, 0, 0);
79 if (!ret || ret == (void *)-1) {
80 printf("can't attach to shared memory\n");
83 /* the following releases the ipc, but note that this process
84 and all its children will still have access to the memory, its
85 just that the shmid is no longer valid for other shm calls. This
86 means we don't leave behind lots of shm segments after we exit
88 See Stevens "advanced programming in unix env" for details
90 shmctl(shmid, IPC_RMID, 0);
96 static BOOL open_nbt_connection(struct cli_state *c)
98 struct nmb_name called, calling;
103 make_nmb_name(&calling, myname, 0x0);
104 make_nmb_name(&called , host, 0x20);
108 if (!cli_initialise(c)) {
109 printf("Failed initialize cli_struct to connect with %s\n", host);
113 c->port = port_to_use;
115 if (!cli_connect(c, host, &ip)) {
116 printf("Failed to connect with %s\n", host);
120 c->use_kerberos = use_kerberos;
122 c->timeout = 120000; /* set a really long timeout (2 minutes) */
123 if (use_oplocks) c->use_oplocks = True;
124 if (use_level_II_oplocks) c->use_level_II_oplocks = True;
126 if (!cli_session_request(c, &calling, &called)) {
128 * Well, that failed, try *SMBSERVER ...
129 * However, we must reconnect as well ...
131 if (!cli_connect(c, host, &ip)) {
132 printf("Failed to connect with %s\n", host);
136 make_nmb_name(&called, "*SMBSERVER", 0x20);
137 if (!cli_session_request(c, &calling, &called)) {
138 printf("%s rejected the session\n",host);
139 printf("We tried with a called name of %s & %s\n",
149 BOOL torture_open_connection(struct cli_state **c)
156 flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
158 status = cli_full_connection(c, myname,
159 host, NULL, port_to_use,
162 password, flags, &retry);
163 if (!NT_STATUS_IS_OK(status)) {
167 if (use_oplocks) (*c)->use_oplocks = True;
168 if (use_level_II_oplocks) (*c)->use_level_II_oplocks = True;
169 (*c)->timeout = 120000; /* set a really long timeout (2 minutes) */
174 BOOL torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
176 uint16 old_vuid = cli->vuid;
177 fstring old_user_name;
178 size_t passlen = strlen(password);
181 fstrcpy(old_user_name, cli->user_name);
183 ret = cli_session_setup(cli, username, password, passlen, password, passlen, workgroup);
184 *new_vuid = cli->vuid;
185 cli->vuid = old_vuid;
186 fstrcpy(cli->user_name, old_user_name);
191 BOOL torture_close_connection(struct cli_state *c)
195 printf("tdis failed (%s)\n", cli_errstr(c));
205 /* check if the server produced the expected error code */
206 static BOOL check_error(int line, struct cli_state *c,
207 uint8 eclass, uint32 ecode, NTSTATUS nterr)
209 if (cli_is_dos_error(c)) {
213 /* Check DOS error */
215 cli_dos_error(c, &class, &num);
217 if (eclass != class || ecode != num) {
218 printf("unexpected error code class=%d code=%d\n",
219 (int)class, (int)num);
220 printf(" expected %d/%d %s (line=%d)\n",
221 (int)eclass, (int)ecode, nt_errstr(nterr), line);
230 status = cli_nt_error(c);
232 if (NT_STATUS_V(nterr) != NT_STATUS_V(status)) {
233 printf("unexpected error code %s\n", nt_errstr(status));
234 printf(" expected %s (line=%d)\n", nt_errstr(nterr), line);
243 static BOOL wait_lock(struct cli_state *c, int fnum, uint32 offset, uint32 len)
245 while (!cli_lock(c, fnum, offset, len, -1, WRITE_LOCK)) {
246 if (!check_error(__LINE__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
252 static BOOL rw_torture(struct cli_state *c)
254 const char *lockfname = "\\torture.lck";
258 pid_t pid2, pid = getpid();
263 fnum2 = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
266 fnum2 = cli_open(c, lockfname, O_RDWR, DENY_NONE);
268 printf("open of %s failed (%s)\n", lockfname, cli_errstr(c));
273 for (i=0;i<torture_numops;i++) {
274 unsigned n = (unsigned)sys_random()%10;
276 printf("%d\r", i); fflush(stdout);
278 slprintf(fname, sizeof(fstring) - 1, "\\torture.%u", n);
280 if (!wait_lock(c, fnum2, n*sizeof(int), sizeof(int))) {
284 fnum = cli_open(c, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL);
286 printf("open failed (%s)\n", cli_errstr(c));
291 if (cli_write(c, fnum, 0, (char *)&pid, 0, sizeof(pid)) != sizeof(pid)) {
292 printf("write failed (%s)\n", cli_errstr(c));
297 if (cli_write(c, fnum, 0, (char *)buf,
298 sizeof(pid)+(j*sizeof(buf)),
299 sizeof(buf)) != sizeof(buf)) {
300 printf("write failed (%s)\n", cli_errstr(c));
307 if (cli_read(c, fnum, (char *)&pid2, 0, sizeof(pid)) != sizeof(pid)) {
308 printf("read failed (%s)\n", cli_errstr(c));
313 printf("data corruption!\n");
317 if (!cli_close(c, fnum)) {
318 printf("close failed (%s)\n", cli_errstr(c));
322 if (!cli_unlink(c, fname)) {
323 printf("unlink failed (%s)\n", cli_errstr(c));
327 if (!cli_unlock(c, fnum2, n*sizeof(int), sizeof(int))) {
328 printf("unlock failed (%s)\n", cli_errstr(c));
334 cli_unlink(c, lockfname);
341 static BOOL run_torture(int dummy)
343 struct cli_state *cli;
348 cli_sockopt(cli, sockops);
350 ret = rw_torture(cli);
352 if (!torture_close_connection(cli)) {
359 static BOOL rw_torture3(struct cli_state *c, char *lockfname)
366 unsigned countprev = 0;
371 for (i = 0; i < sizeof(buf); i += sizeof(uint32))
373 SIVAL(buf, i, sys_random());
378 fnum = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
381 printf("first open read/write of %s failed (%s)\n",
382 lockfname, cli_errstr(c));
388 for (i = 0; i < 500 && fnum == -1; i++)
390 fnum = cli_open(c, lockfname, O_RDONLY,
395 printf("second open read-only of %s failed (%s)\n",
396 lockfname, cli_errstr(c));
402 for (count = 0; count < sizeof(buf); count += sent)
404 if (count >= countprev) {
405 printf("%d %8d\r", i, count);
408 countprev += (sizeof(buf) / 20);
413 sent = ((unsigned)sys_random()%(20))+ 1;
414 if (sent > sizeof(buf) - count)
416 sent = sizeof(buf) - count;
419 if (cli_write(c, fnum, 0, buf+count, count, (size_t)sent) != sent) {
420 printf("write failed (%s)\n", cli_errstr(c));
426 sent = cli_read(c, fnum, buf_rd+count, count,
430 printf("read failed offset:%d size:%d (%s)\n",
431 count, sizeof(buf)-count,
438 if (memcmp(buf_rd+count, buf+count, sent) != 0)
440 printf("read/write compare failed\n");
441 printf("offset: %d req %d recvd %d\n",
442 count, sizeof(buf)-count, sent);
451 if (!cli_close(c, fnum)) {
452 printf("close failed (%s)\n", cli_errstr(c));
459 static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
461 const char *lockfname = "\\torture2.lck";
466 uchar buf_rd[131072];
470 if (!cli_unlink(c1, lockfname)) {
471 printf("unlink failed (%s) (normal, this file should not exist)\n", cli_errstr(c1));
474 fnum1 = cli_open(c1, lockfname, O_RDWR | O_CREAT | O_EXCL,
477 printf("first open read/write of %s failed (%s)\n",
478 lockfname, cli_errstr(c1));
481 fnum2 = cli_open(c2, lockfname, O_RDONLY,
484 printf("second open read-only of %s failed (%s)\n",
485 lockfname, cli_errstr(c2));
486 cli_close(c1, fnum1);
490 for (i=0;i<torture_numops;i++)
492 size_t buf_size = ((unsigned)sys_random()%(sizeof(buf)-1))+ 1;
494 printf("%d\r", i); fflush(stdout);
497 generate_random_buffer(buf, buf_size, False);
499 if (cli_write(c1, fnum1, 0, buf, 0, buf_size) != buf_size) {
500 printf("write failed (%s)\n", cli_errstr(c1));
505 if ((bytes_read = cli_read(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
506 printf("read failed (%s)\n", cli_errstr(c2));
507 printf("read %d, expected %d\n", bytes_read, buf_size);
512 if (memcmp(buf_rd, buf, buf_size) != 0)
514 printf("read/write compare failed\n");
520 if (!cli_close(c2, fnum2)) {
521 printf("close failed (%s)\n", cli_errstr(c2));
524 if (!cli_close(c1, fnum1)) {
525 printf("close failed (%s)\n", cli_errstr(c1));
529 if (!cli_unlink(c1, lockfname)) {
530 printf("unlink failed (%s)\n", cli_errstr(c1));
537 static BOOL run_readwritetest(int dummy)
539 static struct cli_state *cli1, *cli2;
542 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
545 cli_sockopt(cli1, sockops);
546 cli_sockopt(cli2, sockops);
548 printf("starting readwritetest\n");
550 test1 = rw_torture2(cli1, cli2);
551 printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));
554 test2 = rw_torture2(cli1, cli1);
555 printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
558 if (!torture_close_connection(cli1)) {
562 if (!torture_close_connection(cli2)) {
566 return (test1 && test2);
569 static BOOL run_readwritemulti(int dummy)
571 struct cli_state *cli;
576 cli_sockopt(cli, sockops);
578 printf("run_readwritemulti: fname %s\n", randomfname);
579 test = rw_torture3(cli, randomfname);
581 if (!torture_close_connection(cli)) {
588 static BOOL run_readwritelarge(int dummy)
590 static struct cli_state *cli1;
592 const char *lockfname = "\\large.dat";
597 if (!torture_open_connection(&cli1)) {
600 cli_sockopt(cli1, sockops);
601 memset(buf,'\0',sizeof(buf));
603 cli1->max_xmit = 128*1024;
605 printf("starting readwritelarge\n");
607 cli_unlink(cli1, lockfname);
609 fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
611 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
615 cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf));
617 if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
618 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
622 if (fsize == sizeof(buf))
623 printf("readwritelarge test 1 succeeded (size = %x)\n", fsize);
625 printf("readwritelarge test 1 failed (size = %x)\n", fsize);
629 if (!cli_close(cli1, fnum1)) {
630 printf("close failed (%s)\n", cli_errstr(cli1));
634 if (!cli_unlink(cli1, lockfname)) {
635 printf("unlink failed (%s)\n", cli_errstr(cli1));
639 fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
641 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
645 cli1->max_xmit = 4*1024;
647 cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf));
649 if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
650 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
654 if (fsize == sizeof(buf))
655 printf("readwritelarge test 2 succeeded (size = %x)\n", fsize);
657 printf("readwritelarge test 2 failed (size = %x)\n", fsize);
662 /* ToDo - set allocation. JRA */
663 if(!cli_set_allocation_size(cli1, fnum1, 0)) {
664 printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
667 if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
668 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
672 printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);
675 if (!cli_close(cli1, fnum1)) {
676 printf("close failed (%s)\n", cli_errstr(cli1));
680 if (!torture_close_connection(cli1)) {
689 #define ival(s) strtol(s, NULL, 0)
691 /* run a test that simulates an approximate netbench client load */
692 static BOOL run_netbench(int client)
694 struct cli_state *cli;
700 const char *params[20];
707 cli_sockopt(cli, sockops);
711 slprintf(cname,sizeof(fname), "client%d", client);
713 f = fopen(client_txt, "r");
720 while (fgets(line, sizeof(line)-1, f)) {
723 line[strlen(line)-1] = 0;
725 /* printf("[%d] %s\n", line_count, line); */
727 all_string_sub(line,"client1", cname, sizeof(line));
729 /* parse the command parameters */
730 params[0] = strtok(line," ");
732 while (params[i]) params[++i] = strtok(NULL," ");
738 if (!strncmp(params[0],"SMB", 3)) {
739 printf("ERROR: You are using a dbench 1 load file\n");
743 if (!strcmp(params[0],"NTCreateX")) {
744 nb_createx(params[1], ival(params[2]), ival(params[3]),
746 } else if (!strcmp(params[0],"Close")) {
747 nb_close(ival(params[1]));
748 } else if (!strcmp(params[0],"Rename")) {
749 nb_rename(params[1], params[2]);
750 } else if (!strcmp(params[0],"Unlink")) {
751 nb_unlink(params[1]);
752 } else if (!strcmp(params[0],"Deltree")) {
753 nb_deltree(params[1]);
754 } else if (!strcmp(params[0],"Rmdir")) {
756 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
757 nb_qpathinfo(params[1]);
758 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
759 nb_qfileinfo(ival(params[1]));
760 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
761 nb_qfsinfo(ival(params[1]));
762 } else if (!strcmp(params[0],"FIND_FIRST")) {
763 nb_findfirst(params[1]);
764 } else if (!strcmp(params[0],"WriteX")) {
765 nb_writex(ival(params[1]),
766 ival(params[2]), ival(params[3]), ival(params[4]));
767 } else if (!strcmp(params[0],"ReadX")) {
768 nb_readx(ival(params[1]),
769 ival(params[2]), ival(params[3]), ival(params[4]));
770 } else if (!strcmp(params[0],"Flush")) {
771 nb_flush(ival(params[1]));
773 printf("Unknown operation %s\n", params[0]);
781 if (!torture_close_connection(cli)) {
789 /* run a test that simulates an approximate netbench client load */
790 static BOOL run_nbench(int dummy)
799 signal(SIGALRM, nb_alarm);
801 t = create_procs(run_netbench, &correct);
804 printf("\nThroughput %g MB/sec\n",
805 1.0e-6 * nbio_total() / t);
811 This test checks for two things:
813 1) correct support for retaining locks over a close (ie. the server
814 must not use posix semantics)
815 2) support for lock timeouts
817 static BOOL run_locktest1(int dummy)
819 struct cli_state *cli1, *cli2;
820 const char *fname = "\\lockt1.lck";
821 int fnum1, fnum2, fnum3;
823 unsigned lock_timeout;
825 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
828 cli_sockopt(cli1, sockops);
829 cli_sockopt(cli2, sockops);
831 printf("starting locktest1\n");
833 cli_unlink(cli1, fname);
835 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
837 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
840 fnum2 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
842 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli1));
845 fnum3 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
847 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli2));
851 if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
852 printf("lock1 failed (%s)\n", cli_errstr(cli1));
857 if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
858 printf("lock2 succeeded! This is a locking bug\n");
861 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
862 NT_STATUS_LOCK_NOT_GRANTED)) return False;
866 lock_timeout = (1 + (random() % 20));
867 printf("Testing lock timeout with timeout=%u\n", lock_timeout);
869 if (cli_lock(cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {
870 printf("lock3 succeeded! This is a locking bug\n");
873 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
874 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
879 printf("error: This server appears not to support timed lock requests\n");
881 printf("server slept for %u seconds for a %u second timeout\n",
882 (unsigned int)(t2-t1), lock_timeout);
884 if (!cli_close(cli1, fnum2)) {
885 printf("close1 failed (%s)\n", cli_errstr(cli1));
889 if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
890 printf("lock4 succeeded! This is a locking bug\n");
893 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
894 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
897 if (!cli_close(cli1, fnum1)) {
898 printf("close2 failed (%s)\n", cli_errstr(cli1));
902 if (!cli_close(cli2, fnum3)) {
903 printf("close3 failed (%s)\n", cli_errstr(cli2));
907 if (!cli_unlink(cli1, fname)) {
908 printf("unlink failed (%s)\n", cli_errstr(cli1));
913 if (!torture_close_connection(cli1)) {
917 if (!torture_close_connection(cli2)) {
921 printf("Passed locktest1\n");
926 this checks to see if a secondary tconx can use open files from an
929 static BOOL run_tcon_test(int dummy)
931 static struct cli_state *cli;
932 const char *fname = "\\tcontest.tmp";
934 uint16 cnum1, cnum2, cnum3;
939 if (!torture_open_connection(&cli)) {
942 cli_sockopt(cli, sockops);
944 printf("starting tcontest\n");
946 cli_unlink(cli, fname);
948 fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
950 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
957 if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) {
958 printf("initial write failed (%s)", cli_errstr(cli));
962 if (!cli_send_tconX(cli, share, "?????",
963 password, strlen(password)+1)) {
964 printf("%s refused 2nd tree connect (%s)\n", host,
971 cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
972 vuid2 = cli->vuid + 1;
974 /* try a write with the wrong tid */
977 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
978 printf("* server allows write with wrong TID\n");
981 printf("server fails write with wrong TID : %s\n", cli_errstr(cli));
985 /* try a write with an invalid tid */
988 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
989 printf("* server allows write with invalid TID\n");
992 printf("server fails write with invalid TID : %s\n", cli_errstr(cli));
995 /* try a write with an invalid vuid */
999 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
1000 printf("* server allows write with invalid VUID\n");
1003 printf("server fails write with invalid VUID : %s\n", cli_errstr(cli));
1009 if (!cli_close(cli, fnum1)) {
1010 printf("close failed (%s)\n", cli_errstr(cli));
1016 if (!cli_tdis(cli)) {
1017 printf("secondary tdis failed (%s)\n", cli_errstr(cli));
1023 if (!torture_close_connection(cli)) {
1032 checks for old style tcon support
1034 static BOOL run_tcon2_test(int dummy)
1036 static struct cli_state *cli;
1037 uint16 cnum, max_xmit;
1041 if (!torture_open_connection(&cli)) {
1044 cli_sockopt(cli, sockops);
1046 printf("starting tcon2 test\n");
1048 asprintf(&service, "\\\\%s\\%s", host, share);
1050 status = cli_raw_tcon(cli, service, password, "?????", &max_xmit, &cnum);
1052 if (!NT_STATUS_IS_OK(status)) {
1053 printf("tcon2 failed : %s\n", cli_errstr(cli));
1055 printf("tcon OK : max_xmit=%d cnum=%d tid=%d\n",
1056 (int)max_xmit, (int)cnum, SVAL(cli->inbuf, smb_tid));
1059 if (!torture_close_connection(cli)) {
1063 printf("Passed tcon2 test\n");
1067 static BOOL tcon_devtest(struct cli_state *cli,
1068 const char *myshare, const char *devtype,
1069 const char *return_devtype,
1070 NTSTATUS expected_error)
1075 status = cli_send_tconX(cli, myshare, devtype,
1076 password, strlen(password)+1);
1078 if (NT_STATUS_IS_OK(expected_error)) {
1080 if (strcmp(cli->dev, return_devtype) == 0) {
1083 printf("tconX to share %s with type %s "
1084 "succeeded but returned the wrong "
1085 "device type (got [%s] but should have got [%s])\n",
1086 myshare, devtype, cli->dev, return_devtype);
1090 printf("tconX to share %s with type %s "
1091 "should have succeeded but failed\n",
1098 printf("tconx to share %s with type %s "
1099 "should have failed but succeeded\n",
1103 if (NT_STATUS_EQUAL(cli_nt_error(cli),
1107 printf("Returned unexpected error\n");
1116 checks for correct tconX support
1118 static BOOL run_tcon_devtype_test(int dummy)
1120 static struct cli_state *cli1 = NULL;
1126 status = cli_full_connection(&cli1, myname,
1127 host, NULL, port_to_use,
1129 username, workgroup,
1130 password, flags, &retry);
1132 if (!NT_STATUS_IS_OK(status)) {
1133 printf("could not open connection\n");
1137 if (!tcon_devtest(cli1, "IPC$", "A:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1140 if (!tcon_devtest(cli1, "IPC$", "?????", "IPC", NT_STATUS_OK))
1143 if (!tcon_devtest(cli1, "IPC$", "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1146 if (!tcon_devtest(cli1, "IPC$", "IPC", "IPC", NT_STATUS_OK))
1149 if (!tcon_devtest(cli1, "IPC$", "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1152 if (!tcon_devtest(cli1, share, "A:", "A:", NT_STATUS_OK))
1155 if (!tcon_devtest(cli1, share, "?????", "A:", NT_STATUS_OK))
1158 if (!tcon_devtest(cli1, share, "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1161 if (!tcon_devtest(cli1, share, "IPC", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1164 if (!tcon_devtest(cli1, share, "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1170 printf("Passed tcondevtest\n");
1177 This test checks that
1179 1) the server supports multiple locking contexts on the one SMB
1180 connection, distinguished by PID.
1182 2) the server correctly fails overlapping locks made by the same PID (this
1183 goes against POSIX behaviour, which is why it is tricky to implement)
1185 3) the server denies unlock requests by an incorrect client PID
1187 static BOOL run_locktest2(int dummy)
1189 static struct cli_state *cli;
1190 const char *fname = "\\lockt2.lck";
1191 int fnum1, fnum2, fnum3;
1192 BOOL correct = True;
1194 if (!torture_open_connection(&cli)) {
1198 cli_sockopt(cli, sockops);
1200 printf("starting locktest2\n");
1202 cli_unlink(cli, fname);
1206 fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1208 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
1212 fnum2 = cli_open(cli, fname, O_RDWR, DENY_NONE);
1214 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli));
1220 fnum3 = cli_open(cli, fname, O_RDWR, DENY_NONE);
1222 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli));
1228 if (!cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1229 printf("lock1 failed (%s)\n", cli_errstr(cli));
1233 if (cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1234 printf("WRITE lock1 succeeded! This is a locking bug\n");
1237 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1238 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1241 if (cli_lock(cli, fnum2, 0, 4, 0, WRITE_LOCK)) {
1242 printf("WRITE lock2 succeeded! This is a locking bug\n");
1245 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1246 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1249 if (cli_lock(cli, fnum2, 0, 4, 0, READ_LOCK)) {
1250 printf("READ lock2 succeeded! This is a locking bug\n");
1253 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1254 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
1257 if (!cli_lock(cli, fnum1, 100, 4, 0, WRITE_LOCK)) {
1258 printf("lock at 100 failed (%s)\n", cli_errstr(cli));
1261 if (cli_unlock(cli, fnum1, 100, 4)) {
1262 printf("unlock at 100 succeeded! This is a locking bug\n");
1266 if (cli_unlock(cli, fnum1, 0, 4)) {
1267 printf("unlock1 succeeded! This is a locking bug\n");
1270 if (!check_error(__LINE__, cli,
1272 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1275 if (cli_unlock(cli, fnum1, 0, 8)) {
1276 printf("unlock2 succeeded! This is a locking bug\n");
1279 if (!check_error(__LINE__, cli,
1281 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1284 if (cli_lock(cli, fnum3, 0, 4, 0, WRITE_LOCK)) {
1285 printf("lock3 succeeded! This is a locking bug\n");
1288 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
1293 if (!cli_close(cli, fnum1)) {
1294 printf("close1 failed (%s)\n", cli_errstr(cli));
1298 if (!cli_close(cli, fnum2)) {
1299 printf("close2 failed (%s)\n", cli_errstr(cli));
1303 if (!cli_close(cli, fnum3)) {
1304 printf("close3 failed (%s)\n", cli_errstr(cli));
1308 if (!torture_close_connection(cli)) {
1312 printf("locktest2 finished\n");
1319 This test checks that
1321 1) the server supports the full offset range in lock requests
1323 static BOOL run_locktest3(int dummy)
1325 static struct cli_state *cli1, *cli2;
1326 const char *fname = "\\lockt3.lck";
1327 int fnum1, fnum2, i;
1329 BOOL correct = True;
1331 #define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
1333 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1336 cli_sockopt(cli1, sockops);
1337 cli_sockopt(cli2, sockops);
1339 printf("starting locktest3\n");
1341 cli_unlink(cli1, fname);
1343 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1345 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
1348 fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
1350 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli2));
1354 for (offset=i=0;i<torture_numops;i++) {
1356 if (!cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1357 printf("lock1 %d failed (%s)\n",
1363 if (!cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1364 printf("lock2 %d failed (%s)\n",
1371 for (offset=i=0;i<torture_numops;i++) {
1374 if (cli_lock(cli1, fnum1, offset-2, 1, 0, WRITE_LOCK)) {
1375 printf("error: lock1 %d succeeded!\n", i);
1379 if (cli_lock(cli2, fnum2, offset-1, 1, 0, WRITE_LOCK)) {
1380 printf("error: lock2 %d succeeded!\n", i);
1384 if (cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1385 printf("error: lock3 %d succeeded!\n", i);
1389 if (cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1390 printf("error: lock4 %d succeeded!\n", i);
1395 for (offset=i=0;i<torture_numops;i++) {
1398 if (!cli_unlock(cli1, fnum1, offset-1, 1)) {
1399 printf("unlock1 %d failed (%s)\n",
1405 if (!cli_unlock(cli2, fnum2, offset-2, 1)) {
1406 printf("unlock2 %d failed (%s)\n",
1413 if (!cli_close(cli1, fnum1)) {
1414 printf("close1 failed (%s)\n", cli_errstr(cli1));
1418 if (!cli_close(cli2, fnum2)) {
1419 printf("close2 failed (%s)\n", cli_errstr(cli2));
1423 if (!cli_unlink(cli1, fname)) {
1424 printf("unlink failed (%s)\n", cli_errstr(cli1));
1428 if (!torture_close_connection(cli1)) {
1432 if (!torture_close_connection(cli2)) {
1436 printf("finished locktest3\n");
1441 #define EXPECTED(ret, v) if ((ret) != (v)) { \
1442 printf("** "); correct = False; \
1446 looks at overlapping locks
1448 static BOOL run_locktest4(int dummy)
1450 static struct cli_state *cli1, *cli2;
1451 const char *fname = "\\lockt4.lck";
1452 int fnum1, fnum2, f;
1455 BOOL correct = True;
1457 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1461 cli_sockopt(cli1, sockops);
1462 cli_sockopt(cli2, sockops);
1464 printf("starting locktest4\n");
1466 cli_unlink(cli1, fname);
1468 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1469 fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
1471 memset(buf, 0, sizeof(buf));
1473 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1474 printf("Failed to create file\n");
1479 ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1480 cli_lock(cli1, fnum1, 2, 4, 0, WRITE_LOCK);
1481 EXPECTED(ret, False);
1482 printf("the same process %s set overlapping write locks\n", ret?"can":"cannot");
1484 ret = cli_lock(cli1, fnum1, 10, 4, 0, READ_LOCK) &&
1485 cli_lock(cli1, fnum1, 12, 4, 0, READ_LOCK);
1486 EXPECTED(ret, True);
1487 printf("the same process %s set overlapping read locks\n", ret?"can":"cannot");
1489 ret = cli_lock(cli1, fnum1, 20, 4, 0, WRITE_LOCK) &&
1490 cli_lock(cli2, fnum2, 22, 4, 0, WRITE_LOCK);
1491 EXPECTED(ret, False);
1492 printf("a different connection %s set overlapping write locks\n", ret?"can":"cannot");
1494 ret = cli_lock(cli1, fnum1, 30, 4, 0, READ_LOCK) &&
1495 cli_lock(cli2, fnum2, 32, 4, 0, READ_LOCK);
1496 EXPECTED(ret, True);
1497 printf("a different connection %s set overlapping read locks\n", ret?"can":"cannot");
1499 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 40, 4, 0, WRITE_LOCK)) &&
1500 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 42, 4, 0, WRITE_LOCK));
1501 EXPECTED(ret, False);
1502 printf("a different pid %s set overlapping write locks\n", ret?"can":"cannot");
1504 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 50, 4, 0, READ_LOCK)) &&
1505 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 52, 4, 0, READ_LOCK));
1506 EXPECTED(ret, True);
1507 printf("a different pid %s set overlapping read locks\n", ret?"can":"cannot");
1509 ret = cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK) &&
1510 cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK);
1511 EXPECTED(ret, True);
1512 printf("the same process %s set the same read lock twice\n", ret?"can":"cannot");
1514 ret = cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK) &&
1515 cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK);
1516 EXPECTED(ret, False);
1517 printf("the same process %s set the same write lock twice\n", ret?"can":"cannot");
1519 ret = cli_lock(cli1, fnum1, 80, 4, 0, READ_LOCK) &&
1520 cli_lock(cli1, fnum1, 80, 4, 0, WRITE_LOCK);
1521 EXPECTED(ret, False);
1522 printf("the same process %s overlay a read lock with a write lock\n", ret?"can":"cannot");
1524 ret = cli_lock(cli1, fnum1, 90, 4, 0, WRITE_LOCK) &&
1525 cli_lock(cli1, fnum1, 90, 4, 0, READ_LOCK);
1526 EXPECTED(ret, True);
1527 printf("the same process %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1529 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 100, 4, 0, WRITE_LOCK)) &&
1530 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 100, 4, 0, READ_LOCK));
1531 EXPECTED(ret, False);
1532 printf("a different pid %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1534 ret = cli_lock(cli1, fnum1, 110, 4, 0, READ_LOCK) &&
1535 cli_lock(cli1, fnum1, 112, 4, 0, READ_LOCK) &&
1536 cli_unlock(cli1, fnum1, 110, 6);
1537 EXPECTED(ret, False);
1538 printf("the same process %s coalesce read locks\n", ret?"can":"cannot");
1541 ret = cli_lock(cli1, fnum1, 120, 4, 0, WRITE_LOCK) &&
1542 (cli_read(cli2, fnum2, buf, 120, 4) == 4);
1543 EXPECTED(ret, False);
1544 printf("this server %s strict write locking\n", ret?"doesn't do":"does");
1546 ret = cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK) &&
1547 (cli_write(cli2, fnum2, 0, buf, 130, 4) == 4);
1548 EXPECTED(ret, False);
1549 printf("this server %s strict read locking\n", ret?"doesn't do":"does");
1552 ret = cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1553 cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1554 cli_unlock(cli1, fnum1, 140, 4) &&
1555 cli_unlock(cli1, fnum1, 140, 4);
1556 EXPECTED(ret, True);
1557 printf("this server %s do recursive read locking\n", ret?"does":"doesn't");
1560 ret = cli_lock(cli1, fnum1, 150, 4, 0, WRITE_LOCK) &&
1561 cli_lock(cli1, fnum1, 150, 4, 0, READ_LOCK) &&
1562 cli_unlock(cli1, fnum1, 150, 4) &&
1563 (cli_read(cli2, fnum2, buf, 150, 4) == 4) &&
1564 !(cli_write(cli2, fnum2, 0, buf, 150, 4) == 4) &&
1565 cli_unlock(cli1, fnum1, 150, 4);
1566 EXPECTED(ret, True);
1567 printf("this server %s do recursive lock overlays\n", ret?"does":"doesn't");
1569 ret = cli_lock(cli1, fnum1, 160, 4, 0, READ_LOCK) &&
1570 cli_unlock(cli1, fnum1, 160, 4) &&
1571 (cli_write(cli2, fnum2, 0, buf, 160, 4) == 4) &&
1572 (cli_read(cli2, fnum2, buf, 160, 4) == 4);
1573 EXPECTED(ret, True);
1574 printf("the same process %s remove a read lock using write locking\n", ret?"can":"cannot");
1576 ret = cli_lock(cli1, fnum1, 170, 4, 0, WRITE_LOCK) &&
1577 cli_unlock(cli1, fnum1, 170, 4) &&
1578 (cli_write(cli2, fnum2, 0, buf, 170, 4) == 4) &&
1579 (cli_read(cli2, fnum2, buf, 170, 4) == 4);
1580 EXPECTED(ret, True);
1581 printf("the same process %s remove a write lock using read locking\n", ret?"can":"cannot");
1583 ret = cli_lock(cli1, fnum1, 190, 4, 0, WRITE_LOCK) &&
1584 cli_lock(cli1, fnum1, 190, 4, 0, READ_LOCK) &&
1585 cli_unlock(cli1, fnum1, 190, 4) &&
1586 !(cli_write(cli2, fnum2, 0, buf, 190, 4) == 4) &&
1587 (cli_read(cli2, fnum2, buf, 190, 4) == 4);
1588 EXPECTED(ret, True);
1589 printf("the same process %s remove the first lock first\n", ret?"does":"doesn't");
1591 cli_close(cli1, fnum1);
1592 cli_close(cli2, fnum2);
1593 fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
1594 f = cli_open(cli1, fname, O_RDWR, DENY_NONE);
1595 ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1596 cli_lock(cli1, f, 0, 1, 0, READ_LOCK) &&
1597 cli_close(cli1, fnum1) &&
1598 ((fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE)) != -1) &&
1599 cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1601 cli_close(cli1, fnum1);
1602 EXPECTED(ret, True);
1603 printf("the server %s have the NT byte range lock bug\n", !ret?"does":"doesn't");
1606 cli_close(cli1, fnum1);
1607 cli_close(cli2, fnum2);
1608 cli_unlink(cli1, fname);
1609 torture_close_connection(cli1);
1610 torture_close_connection(cli2);
1612 printf("finished locktest4\n");
1617 looks at lock upgrade/downgrade.
1619 static BOOL run_locktest5(int dummy)
1621 static struct cli_state *cli1, *cli2;
1622 const char *fname = "\\lockt5.lck";
1623 int fnum1, fnum2, fnum3;
1626 BOOL correct = True;
1628 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1632 cli_sockopt(cli1, sockops);
1633 cli_sockopt(cli2, sockops);
1635 printf("starting locktest5\n");
1637 cli_unlink(cli1, fname);
1639 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1640 fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
1641 fnum3 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
1643 memset(buf, 0, sizeof(buf));
1645 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1646 printf("Failed to create file\n");
1651 /* Check for NT bug... */
1652 ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1653 cli_lock(cli1, fnum3, 0, 1, 0, READ_LOCK);
1654 cli_close(cli1, fnum1);
1655 fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
1656 ret = cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1657 EXPECTED(ret, True);
1658 printf("this server %s the NT locking bug\n", ret ? "doesn't have" : "has");
1659 cli_close(cli1, fnum1);
1660 fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
1661 cli_unlock(cli1, fnum3, 0, 1);
1663 ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1664 cli_lock(cli1, fnum1, 1, 1, 0, READ_LOCK);
1665 EXPECTED(ret, True);
1666 printf("the same process %s overlay a write with a read lock\n", ret?"can":"cannot");
1668 ret = cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
1669 EXPECTED(ret, False);
1671 printf("a different processs %s get a read lock on the first process lock stack\n", ret?"can":"cannot");
1673 /* Unlock the process 2 lock. */
1674 cli_unlock(cli2, fnum2, 0, 4);
1676 ret = cli_lock(cli1, fnum3, 0, 4, 0, READ_LOCK);
1677 EXPECTED(ret, False);
1679 printf("the same processs on a different fnum %s get a read lock\n", ret?"can":"cannot");
1681 /* Unlock the process 1 fnum3 lock. */
1682 cli_unlock(cli1, fnum3, 0, 4);
1684 /* Stack 2 more locks here. */
1685 ret = cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK) &&
1686 cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK);
1688 EXPECTED(ret, True);
1689 printf("the same process %s stack read locks\n", ret?"can":"cannot");
1691 /* Unlock the first process lock, then check this was the WRITE lock that was
1694 ret = cli_unlock(cli1, fnum1, 0, 4) &&
1695 cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
1697 EXPECTED(ret, True);
1698 printf("the first unlock removes the %s lock\n", ret?"WRITE":"READ");
1700 /* Unlock the process 2 lock. */
1701 cli_unlock(cli2, fnum2, 0, 4);
1703 /* We should have 3 stacked locks here. Ensure we need to do 3 unlocks. */
1705 ret = cli_unlock(cli1, fnum1, 1, 1) &&
1706 cli_unlock(cli1, fnum1, 0, 4) &&
1707 cli_unlock(cli1, fnum1, 0, 4);
1709 EXPECTED(ret, True);
1710 printf("the same process %s unlock the stack of 4 locks\n", ret?"can":"cannot");
1712 /* Ensure the next unlock fails. */
1713 ret = cli_unlock(cli1, fnum1, 0, 4);
1714 EXPECTED(ret, False);
1715 printf("the same process %s count the lock stack\n", !ret?"can":"cannot");
1717 /* Ensure connection 2 can get a write lock. */
1718 ret = cli_lock(cli2, fnum2, 0, 4, 0, WRITE_LOCK);
1719 EXPECTED(ret, True);
1721 printf("a different processs %s get a write lock on the unlocked stack\n", ret?"can":"cannot");
1725 cli_close(cli1, fnum1);
1726 cli_close(cli2, fnum2);
1727 cli_unlink(cli1, fname);
1728 if (!torture_close_connection(cli1)) {
1731 if (!torture_close_connection(cli2)) {
1735 printf("finished locktest5\n");
1741 tries the unusual lockingX locktype bits
1743 static BOOL run_locktest6(int dummy)
1745 static struct cli_state *cli;
1746 const char *fname[1] = { "\\lock6.txt" };
1751 if (!torture_open_connection(&cli)) {
1755 cli_sockopt(cli, sockops);
1757 printf("starting locktest6\n");
1760 printf("Testing %s\n", fname[i]);
1762 cli_unlink(cli, fname[i]);
1764 fnum = cli_open(cli, fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1765 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CHANGE_LOCKTYPE);
1766 cli_close(cli, fnum);
1767 printf("CHANGE_LOCKTYPE gave %s\n", nt_errstr(status));
1769 fnum = cli_open(cli, fname[i], O_RDWR, DENY_NONE);
1770 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CANCEL_LOCK);
1771 cli_close(cli, fnum);
1772 printf("CANCEL_LOCK gave %s\n", nt_errstr(status));
1774 cli_unlink(cli, fname[i]);
1777 torture_close_connection(cli);
1779 printf("finished locktest6\n");
1783 static BOOL run_locktest7(int dummy)
1785 struct cli_state *cli1;
1786 const char *fname = "\\lockt7.lck";
1789 BOOL correct = False;
1791 if (!torture_open_connection(&cli1)) {
1795 cli_sockopt(cli1, sockops);
1797 printf("starting locktest7\n");
1799 cli_unlink(cli1, fname);
1801 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1803 memset(buf, 0, sizeof(buf));
1805 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1806 printf("Failed to create file\n");
1810 cli_setpid(cli1, 1);
1812 if (!cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK)) {
1813 printf("Unable to apply read lock on range 130:4, error was %s\n", cli_errstr(cli1));
1816 printf("pid1 successfully locked range 130:4 for READ\n");
1819 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
1820 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
1823 printf("pid1 successfully read the range 130:4\n");
1826 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
1827 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
1828 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
1829 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
1833 printf("pid1 successfully wrote to the range 130:4 (should be denied)\n");
1837 cli_setpid(cli1, 2);
1839 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
1840 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
1842 printf("pid2 successfully read the range 130:4\n");
1845 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
1846 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
1847 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
1848 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
1852 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
1856 cli_setpid(cli1, 1);
1857 cli_unlock(cli1, fnum1, 130, 4);
1859 if (!cli_lock(cli1, fnum1, 130, 4, 0, WRITE_LOCK)) {
1860 printf("Unable to apply write lock on range 130:4, error was %s\n", cli_errstr(cli1));
1863 printf("pid1 successfully locked range 130:4 for WRITE\n");
1866 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
1867 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
1870 printf("pid1 successfully read the range 130:4\n");
1873 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
1874 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
1877 printf("pid1 successfully wrote to the range 130:4\n");
1880 cli_setpid(cli1, 2);
1882 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
1883 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
1884 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
1885 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
1889 printf("pid2 successfully read the range 130:4 (should be denied)\n");
1893 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
1894 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
1895 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
1896 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
1900 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
1904 cli_unlock(cli1, fnum1, 130, 0);
1908 cli_close(cli1, fnum1);
1909 cli_unlink(cli1, fname);
1910 torture_close_connection(cli1);
1912 printf("finished locktest7\n");
1917 test whether fnums and tids open on one VC are available on another (a major
1920 static BOOL run_fdpasstest(int dummy)
1922 struct cli_state *cli1, *cli2;
1923 const char *fname = "\\fdpass.tst";
1927 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1930 cli_sockopt(cli1, sockops);
1931 cli_sockopt(cli2, sockops);
1933 printf("starting fdpasstest\n");
1935 cli_unlink(cli1, fname);
1937 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1939 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
1943 if (cli_write(cli1, fnum1, 0, "hello world\n", 0, 13) != 13) {
1944 printf("write failed (%s)\n", cli_errstr(cli1));
1948 cli2->vuid = cli1->vuid;
1949 cli2->cnum = cli1->cnum;
1950 cli2->pid = cli1->pid;
1952 if (cli_read(cli2, fnum1, buf, 0, 13) == 13) {
1953 printf("read succeeded! nasty security hole [%s]\n",
1958 cli_close(cli1, fnum1);
1959 cli_unlink(cli1, fname);
1961 torture_close_connection(cli1);
1962 torture_close_connection(cli2);
1964 printf("finished fdpasstest\n");
1968 static BOOL run_fdsesstest(int dummy)
1970 struct cli_state *cli;
1975 const char *fname = "\\fdsess.tst";
1976 const char *fname1 = "\\fdsess1.tst";
1982 if (!torture_open_connection(&cli))
1984 cli_sockopt(cli, sockops);
1986 if (!torture_cli_session_setup2(cli, &new_vuid))
1989 saved_cnum = cli->cnum;
1990 if (!cli_send_tconX(cli, share, "?????", "", 1))
1992 new_cnum = cli->cnum;
1993 cli->cnum = saved_cnum;
1995 printf("starting fdsesstest\n");
1997 cli_unlink(cli, fname);
1998 cli_unlink(cli, fname1);
2000 fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2002 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
2006 if (cli_write(cli, fnum1, 0, "hello world\n", 0, 13) != 13) {
2007 printf("write failed (%s)\n", cli_errstr(cli));
2011 saved_vuid = cli->vuid;
2012 cli->vuid = new_vuid;
2014 if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
2015 printf("read succeeded with different vuid! nasty security hole [%s]\n",
2019 /* Try to open a file with different vuid, samba cnum. */
2020 fnum2 = cli_open(cli, fname1, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2022 printf("create with different vuid, same cnum succeeded.\n");
2023 cli_close(cli, fnum2);
2024 cli_unlink(cli, fname1);
2026 printf("create with different vuid, same cnum failed.\n");
2027 printf("This will cause problems with service clients.\n");
2031 cli->vuid = saved_vuid;
2033 /* Try with same vuid, different cnum. */
2034 cli->cnum = new_cnum;
2036 if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
2037 printf("read succeeded with different cnum![%s]\n",
2042 cli->cnum = saved_cnum;
2043 cli_close(cli, fnum1);
2044 cli_unlink(cli, fname);
2046 torture_close_connection(cli);
2048 printf("finished fdsesstest\n");
2053 This test checks that
2055 1) the server does not allow an unlink on a file that is open
2057 static BOOL run_unlinktest(int dummy)
2059 struct cli_state *cli;
2060 const char *fname = "\\unlink.tst";
2062 BOOL correct = True;
2064 if (!torture_open_connection(&cli)) {
2068 cli_sockopt(cli, sockops);
2070 printf("starting unlink test\n");
2072 cli_unlink(cli, fname);
2076 fnum = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2078 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
2082 if (cli_unlink(cli, fname)) {
2083 printf("error: server allowed unlink on an open file\n");
2086 correct = check_error(__LINE__, cli, ERRDOS, ERRbadshare,
2087 NT_STATUS_SHARING_VIOLATION);
2090 cli_close(cli, fnum);
2091 cli_unlink(cli, fname);
2093 if (!torture_close_connection(cli)) {
2097 printf("unlink test finished\n");
2104 test how many open files this server supports on the one socket
2106 static BOOL run_maxfidtest(int dummy)
2108 struct cli_state *cli;
2109 const char *template = "\\maxfid.%d.%d";
2111 int fnums[0x11000], i;
2113 BOOL correct = True;
2118 printf("failed to connect\n");
2122 cli_sockopt(cli, sockops);
2124 for (i=0; i<0x11000; i++) {
2125 slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
2126 if ((fnums[i] = cli_open(cli, fname,
2127 O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) ==
2129 printf("open of %s failed (%s)\n",
2130 fname, cli_errstr(cli));
2131 printf("maximum fnum is %d\n", i);
2139 printf("cleaning up\n");
2141 slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
2142 cli_close(cli, fnums[i]);
2143 if (!cli_unlink(cli, fname)) {
2144 printf("unlink of %s failed (%s)\n",
2145 fname, cli_errstr(cli));
2152 printf("maxfid test finished\n");
2153 if (!torture_close_connection(cli)) {
2159 /* generate a random buffer */
2160 static void rand_buf(char *buf, int len)
2163 *buf = (char)sys_random();
2168 /* send smb negprot commands, not reading the response */
2169 static BOOL run_negprot_nowait(int dummy)
2172 static struct cli_state cli;
2173 BOOL correct = True;
2175 printf("starting negprot nowait test\n");
2177 if (!open_nbt_connection(&cli)) {
2181 for (i=0;i<50000;i++) {
2182 cli_negprot_send(&cli);
2185 if (!torture_close_connection(&cli)) {
2189 printf("finished negprot nowait test\n");
2195 /* send random IPC commands */
2196 static BOOL run_randomipc(int dummy)
2198 char *rparam = NULL;
2202 int api, param_len, i;
2203 struct cli_state *cli;
2204 BOOL correct = True;
2207 printf("starting random ipc test\n");
2209 if (!torture_open_connection(&cli)) {
2213 for (i=0;i<count;i++) {
2214 api = sys_random() % 500;
2215 param_len = (sys_random() % 64);
2217 rand_buf(param, param_len);
2222 param, param_len, 8,
2223 NULL, 0, BUFFER_SIZE,
2227 printf("%d/%d\r", i,count);
2230 printf("%d/%d\n", i, count);
2232 if (!torture_close_connection(cli)) {
2236 printf("finished random ipc test\n");
2243 static void browse_callback(const char *sname, uint32 stype,
2244 const char *comment, void *state)
2246 printf("\t%20.20s %08x %s\n", sname, stype, comment);
2252 This test checks the browse list code
2255 static BOOL run_browsetest(int dummy)
2257 static struct cli_state *cli;
2258 BOOL correct = True;
2260 printf("starting browse test\n");
2262 if (!torture_open_connection(&cli)) {
2266 printf("domain list:\n");
2267 cli_NetServerEnum(cli, cli->server_domain,
2268 SV_TYPE_DOMAIN_ENUM,
2269 browse_callback, NULL);
2271 printf("machine list:\n");
2272 cli_NetServerEnum(cli, cli->server_domain,
2274 browse_callback, NULL);
2276 if (!torture_close_connection(cli)) {
2280 printf("browse test finished\n");
2288 This checks how the getatr calls works
2290 static BOOL run_attrtest(int dummy)
2292 struct cli_state *cli;
2295 const char *fname = "\\attrib123456789.tst";
2296 BOOL correct = True;
2298 printf("starting attrib test\n");
2300 if (!torture_open_connection(&cli)) {
2304 cli_unlink(cli, fname);
2305 fnum = cli_open(cli, fname,
2306 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2307 cli_close(cli, fnum);
2308 if (!cli_getatr(cli, fname, NULL, NULL, &t)) {
2309 printf("getatr failed (%s)\n", cli_errstr(cli));
2313 if (abs(t - time(NULL)) > 60*60*24*10) {
2314 printf("ERROR: SMBgetatr bug. time is %s",
2320 t2 = t-60*60*24; /* 1 day ago */
2322 if (!cli_setatr(cli, fname, 0, t2)) {
2323 printf("setatr failed (%s)\n", cli_errstr(cli));
2327 if (!cli_getatr(cli, fname, NULL, NULL, &t)) {
2328 printf("getatr failed (%s)\n", cli_errstr(cli));
2333 printf("ERROR: getatr/setatr bug. times are\n%s",
2335 printf("%s", ctime(&t2));
2339 cli_unlink(cli, fname);
2341 if (!torture_close_connection(cli)) {
2345 printf("attrib test finished\n");
2352 This checks a couple of trans2 calls
2354 static BOOL run_trans2test(int dummy)
2356 struct cli_state *cli;
2359 time_t c_time, a_time, m_time, w_time, m_time2;
2360 const char *fname = "\\trans2.tst";
2361 const char *dname = "\\trans2";
2362 const char *fname2 = "\\trans2\\trans2.tst";
2364 BOOL correct = True;
2366 printf("starting trans2 test\n");
2368 if (!torture_open_connection(&cli)) {
2372 cli_unlink(cli, fname);
2373 fnum = cli_open(cli, fname,
2374 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2375 if (!cli_qfileinfo(cli, fnum, NULL, &size, &c_time, &a_time, &m_time,
2377 printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(cli));
2381 if (!cli_qfilename(cli, fnum, pname)) {
2382 printf("ERROR: qfilename failed (%s)\n", cli_errstr(cli));
2386 if (strcmp(pname, fname)) {
2387 printf("qfilename gave different name? [%s] [%s]\n",
2392 cli_close(cli, fnum);
2396 cli_unlink(cli, fname);
2397 fnum = cli_open(cli, fname,
2398 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2400 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
2403 cli_close(cli, fnum);
2405 if (!cli_qpathinfo(cli, fname, &c_time, &a_time, &m_time, &size, NULL)) {
2406 printf("ERROR: qpathinfo failed (%s)\n", cli_errstr(cli));
2409 if (c_time != m_time) {
2410 printf("create time=%s", ctime(&c_time));
2411 printf("modify time=%s", ctime(&m_time));
2412 printf("This system appears to have sticky create times\n");
2414 if (a_time % (60*60) == 0) {
2415 printf("access time=%s", ctime(&a_time));
2416 printf("This system appears to set a midnight access time\n");
2420 if (abs(m_time - time(NULL)) > 60*60*24*7) {
2421 printf("ERROR: totally incorrect times - maybe word reversed? mtime=%s", ctime(&m_time));
2427 cli_unlink(cli, fname);
2428 fnum = cli_open(cli, fname,
2429 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2430 cli_close(cli, fnum);
2431 if (!cli_qpathinfo2(cli, fname, &c_time, &a_time, &m_time,
2432 &w_time, &size, NULL, NULL)) {
2433 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
2436 if (w_time < 60*60*24*2) {
2437 printf("write time=%s", ctime(&w_time));
2438 printf("This system appears to set a initial 0 write time\n");
2443 cli_unlink(cli, fname);
2446 /* check if the server updates the directory modification time
2447 when creating a new file */
2448 if (!cli_mkdir(cli, dname)) {
2449 printf("ERROR: mkdir failed (%s)\n", cli_errstr(cli));
2453 if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time,
2454 &w_time, &size, NULL, NULL)) {
2455 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
2459 fnum = cli_open(cli, fname2,
2460 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2461 cli_write(cli, fnum, 0, (char *)&fnum, 0, sizeof(fnum));
2462 cli_close(cli, fnum);
2463 if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time2,
2464 &w_time, &size, NULL, NULL)) {
2465 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
2468 if (m_time2 == m_time) {
2469 printf("This system does not update directory modification times\n");
2473 cli_unlink(cli, fname2);
2474 cli_rmdir(cli, dname);
2476 if (!torture_close_connection(cli)) {
2480 printf("trans2 test finished\n");
2486 This checks new W2K calls.
2489 static BOOL new_trans(struct cli_state *pcli, int fnum, int level)
2492 BOOL correct = True;
2494 memset(buf, 0xff, sizeof(buf));
2496 if (!cli_qfileinfo_test(pcli, fnum, level, buf)) {
2497 printf("ERROR: qfileinfo (%d) failed (%s)\n", level, cli_errstr(pcli));
2500 printf("qfileinfo: level %d\n", level);
2501 dump_data(0, buf, 256);
2507 static BOOL run_w2ktest(int dummy)
2509 struct cli_state *cli;
2511 const char *fname = "\\w2ktest\\w2k.tst";
2513 BOOL correct = True;
2515 printf("starting w2k test\n");
2517 if (!torture_open_connection(&cli)) {
2521 fnum = cli_open(cli, fname,
2522 O_RDWR | O_CREAT , DENY_NONE);
2524 for (level = 1004; level < 1040; level++) {
2525 new_trans(cli, fnum, level);
2528 cli_close(cli, fnum);
2530 if (!torture_close_connection(cli)) {
2534 printf("w2k test finished\n");
2541 this is a harness for some oplock tests
2543 static BOOL run_oplock1(int dummy)
2545 struct cli_state *cli1;
2546 const char *fname = "\\lockt1.lck";
2548 BOOL correct = True;
2550 printf("starting oplock test 1\n");
2552 if (!torture_open_connection(&cli1)) {
2556 cli_unlink(cli1, fname);
2558 cli_sockopt(cli1, sockops);
2560 cli1->use_oplocks = True;
2562 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2564 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
2568 cli1->use_oplocks = False;
2570 cli_unlink(cli1, fname);
2571 cli_unlink(cli1, fname);
2573 if (!cli_close(cli1, fnum1)) {
2574 printf("close2 failed (%s)\n", cli_errstr(cli1));
2578 if (!cli_unlink(cli1, fname)) {
2579 printf("unlink failed (%s)\n", cli_errstr(cli1));
2583 if (!torture_close_connection(cli1)) {
2587 printf("finished oplock test 1\n");
2592 static BOOL run_oplock2(int dummy)
2594 struct cli_state *cli1, *cli2;
2595 const char *fname = "\\lockt2.lck";
2597 int saved_use_oplocks = use_oplocks;
2599 BOOL correct = True;
2600 volatile BOOL *shared_correct;
2602 shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
2603 *shared_correct = True;
2605 use_level_II_oplocks = True;
2608 printf("starting oplock test 2\n");
2610 if (!torture_open_connection(&cli1)) {
2611 use_level_II_oplocks = False;
2612 use_oplocks = saved_use_oplocks;
2616 cli1->use_oplocks = True;
2617 cli1->use_level_II_oplocks = True;
2619 if (!torture_open_connection(&cli2)) {
2620 use_level_II_oplocks = False;
2621 use_oplocks = saved_use_oplocks;
2625 cli2->use_oplocks = True;
2626 cli2->use_level_II_oplocks = True;
2628 cli_unlink(cli1, fname);
2630 cli_sockopt(cli1, sockops);
2631 cli_sockopt(cli2, sockops);
2633 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2635 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
2639 /* Don't need the globals any more. */
2640 use_level_II_oplocks = False;
2641 use_oplocks = saved_use_oplocks;
2645 fnum2 = cli_open(cli2, fname, O_RDWR, DENY_NONE);
2647 printf("second open of %s failed (%s)\n", fname, cli_errstr(cli1));
2648 *shared_correct = False;
2654 if (!cli_close(cli2, fnum2)) {
2655 printf("close2 failed (%s)\n", cli_errstr(cli1));
2656 *shared_correct = False;
2664 /* Ensure cli1 processes the break. */
2666 if (cli_read(cli1, fnum1, buf, 0, 4) != 4) {
2667 printf("read on fnum1 failed (%s)\n", cli_errstr(cli1));
2671 /* Should now be at level II. */
2672 /* Test if sending a write locks causes a break to none. */
2674 if (!cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK)) {
2675 printf("lock failed (%s)\n", cli_errstr(cli1));
2679 cli_unlock(cli1, fnum1, 0, 4);
2683 if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
2684 printf("lock failed (%s)\n", cli_errstr(cli1));
2688 cli_unlock(cli1, fnum1, 0, 4);
2692 cli_read(cli1, fnum1, buf, 0, 4);
2695 if (cli_write(cli1, fnum1, 0, buf, 0, 4) != 4) {
2696 printf("write on fnum1 failed (%s)\n", cli_errstr(cli1));
2701 if (!cli_close(cli1, fnum1)) {
2702 printf("close1 failed (%s)\n", cli_errstr(cli1));
2708 if (!cli_unlink(cli1, fname)) {
2709 printf("unlink failed (%s)\n", cli_errstr(cli1));
2713 if (!torture_close_connection(cli1)) {
2717 if (!*shared_correct) {
2721 printf("finished oplock test 2\n");
2726 /* handler for oplock 3 tests */
2727 static BOOL oplock3_handler(struct cli_state *cli, int fnum, unsigned char level)
2729 printf("got oplock break fnum=%d level=%d\n",
2731 return cli_oplock_ack(cli, fnum, level);
2734 static BOOL run_oplock3(int dummy)
2736 struct cli_state *cli;
2737 const char *fname = "\\oplockt3.dat";
2739 char buf[4] = "abcd";
2740 BOOL correct = True;
2741 volatile BOOL *shared_correct;
2743 shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
2744 *shared_correct = True;
2746 printf("starting oplock test 3\n");
2751 use_level_II_oplocks = True;
2752 if (!torture_open_connection(&cli)) {
2753 *shared_correct = False;
2757 /* try to trigger a oplock break in parent */
2758 fnum = cli_open(cli, fname, O_RDWR, DENY_NONE);
2759 cli_write(cli, fnum, 0, buf, 0, 4);
2765 use_level_II_oplocks = True;
2766 if (!torture_open_connection(&cli)) {
2769 cli_oplock_handler(cli, oplock3_handler);
2770 fnum = cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE);
2771 cli_write(cli, fnum, 0, buf, 0, 4);
2772 cli_close(cli, fnum);
2773 fnum = cli_open(cli, fname, O_RDWR, DENY_NONE);
2774 cli->timeout = 20000;
2775 cli_receive_smb(cli);
2776 printf("finished oplock test 3\n");
2778 return (correct && *shared_correct);
2780 /* What are we looking for here? What's sucess and what's FAILURE? */
2786 Test delete on close semantics.
2788 static BOOL run_deletetest(int dummy)
2790 struct cli_state *cli1;
2791 struct cli_state *cli2;
2792 const char *fname = "\\delete.file";
2795 BOOL correct = True;
2797 printf("starting delete test\n");
2799 if (!torture_open_connection(&cli1)) {
2803 cli_sockopt(cli1, sockops);
2805 /* Test 1 - this should delete the file on close. */
2807 cli_setatr(cli1, fname, 0, 0);
2808 cli_unlink(cli1, fname);
2810 fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
2811 FILE_SHARE_DELETE, FILE_OVERWRITE_IF,
2812 FILE_DELETE_ON_CLOSE, 0);
2815 printf("[1] open of %s failed (%s)\n", fname, cli_errstr(cli1));
2820 if (!cli_close(cli1, fnum1)) {
2821 printf("[1] close failed (%s)\n", cli_errstr(cli1));
2826 fnum1 = cli_open(cli1, fname, O_RDWR, DENY_NONE);
2828 printf("[1] open of %s succeeded (should fail)\n", fname);
2833 printf("first delete on close test succeeded.\n");
2835 /* Test 2 - this should delete the file on close. */
2837 cli_setatr(cli1, fname, 0, 0);
2838 cli_unlink(cli1, fname);
2840 fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS,
2841 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE,
2842 FILE_OVERWRITE_IF, 0, 0);
2845 printf("[2] open of %s failed (%s)\n", fname, cli_errstr(cli1));
2850 if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
2851 printf("[2] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
2856 if (!cli_close(cli1, fnum1)) {
2857 printf("[2] close failed (%s)\n", cli_errstr(cli1));
2862 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
2864 printf("[2] open of %s succeeded should have been deleted on close !\n", fname);
2865 if (!cli_close(cli1, fnum1)) {
2866 printf("[2] close failed (%s)\n", cli_errstr(cli1));
2870 cli_unlink(cli1, fname);
2872 printf("second delete on close test succeeded.\n");
2875 cli_setatr(cli1, fname, 0, 0);
2876 cli_unlink(cli1, fname);
2878 fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
2879 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
2882 printf("[3] open - 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
2887 /* This should fail with a sharing violation - open for delete is only compatible
2888 with SHARE_DELETE. */
2890 fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
2891 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, 0);
2894 printf("[3] open - 2 of %s succeeded - should have failed.\n", fname);
2899 /* This should succeed. */
2901 fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
2902 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
2905 printf("[3] open - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
2910 if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
2911 printf("[3] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
2916 if (!cli_close(cli1, fnum1)) {
2917 printf("[3] close 1 failed (%s)\n", cli_errstr(cli1));
2922 if (!cli_close(cli1, fnum2)) {
2923 printf("[3] close 2 failed (%s)\n", cli_errstr(cli1));
2928 /* This should fail - file should no longer be there. */
2930 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
2932 printf("[3] open of %s succeeded should have been deleted on close !\n", fname);
2933 if (!cli_close(cli1, fnum1)) {
2934 printf("[3] close failed (%s)\n", cli_errstr(cli1));
2936 cli_unlink(cli1, fname);
2940 printf("third delete on close test succeeded.\n");
2943 cli_setatr(cli1, fname, 0, 0);
2944 cli_unlink(cli1, fname);
2946 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2947 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
2950 printf("[4] open of %s failed (%s)\n", fname, cli_errstr(cli1));
2955 /* This should succeed. */
2956 fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
2957 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0);
2959 printf("[4] open - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
2964 if (!cli_close(cli1, fnum2)) {
2965 printf("[4] close - 1 failed (%s)\n", cli_errstr(cli1));
2970 if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
2971 printf("[4] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
2976 /* This should fail - no more opens once delete on close set. */
2977 fnum2 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS,
2978 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2981 printf("[4] open - 3 of %s succeeded ! Should have failed.\n", fname );
2985 printf("fourth delete on close test succeeded.\n");
2987 if (!cli_close(cli1, fnum1)) {
2988 printf("[4] close - 2 failed (%s)\n", cli_errstr(cli1));
2994 cli_setatr(cli1, fname, 0, 0);
2995 cli_unlink(cli1, fname);
2997 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT, DENY_NONE);
2999 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3004 /* This should fail - only allowed on NT opens with DELETE access. */
3006 if (cli_nt_delete_on_close(cli1, fnum1, True)) {
3007 printf("[5] setting delete_on_close on OpenX file succeeded - should fail !\n");
3012 if (!cli_close(cli1, fnum1)) {
3013 printf("[5] close - 2 failed (%s)\n", cli_errstr(cli1));
3018 printf("fifth delete on close test succeeded.\n");
3021 cli_setatr(cli1, fname, 0, 0);
3022 cli_unlink(cli1, fname);
3024 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
3025 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3026 FILE_OVERWRITE_IF, 0, 0);
3029 printf("[6] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3034 /* This should fail - only allowed on NT opens with DELETE access. */
3036 if (cli_nt_delete_on_close(cli1, fnum1, True)) {
3037 printf("[6] setting delete_on_close on file with no delete access succeeded - should fail !\n");
3042 if (!cli_close(cli1, fnum1)) {
3043 printf("[6] close - 2 failed (%s)\n", cli_errstr(cli1));
3048 printf("sixth delete on close test succeeded.\n");
3051 cli_setatr(cli1, fname, 0, 0);
3052 cli_unlink(cli1, fname);
3054 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3055 FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0);
3058 printf("[7] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3063 if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
3064 printf("[7] setting delete_on_close on file failed !\n");
3069 if (!cli_nt_delete_on_close(cli1, fnum1, False)) {
3070 printf("[7] unsetting delete_on_close on file failed !\n");
3075 if (!cli_close(cli1, fnum1)) {
3076 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
3081 /* This next open should succeed - we reset the flag. */
3083 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
3085 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3090 if (!cli_close(cli1, fnum1)) {
3091 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
3096 printf("seventh delete on close test succeeded.\n");
3099 cli_setatr(cli1, fname, 0, 0);
3100 cli_unlink(cli1, fname);
3102 if (!torture_open_connection(&cli2)) {
3103 printf("[8] failed to open second connection.\n");
3108 cli_sockopt(cli1, sockops);
3110 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3111 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3112 FILE_OVERWRITE_IF, 0, 0);
3115 printf("[8] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3120 fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3121 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3125 printf("[8] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3130 if (!cli_nt_delete_on_close(cli1, fnum1, True)) {
3131 printf("[8] setting delete_on_close on file failed !\n");
3136 if (!cli_close(cli1, fnum1)) {
3137 printf("[8] close - 1 failed (%s)\n", cli_errstr(cli1));
3142 if (!cli_close(cli2, fnum2)) {
3143 printf("[8] close - 2 failed (%s)\n", cli_errstr(cli2));
3148 /* This should fail.. */
3149 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
3151 printf("[8] open of %s succeeded should have been deleted on close !\n", fname);
3155 printf("eighth delete on close test succeeded.\n");
3157 /* This should fail - we need to set DELETE_ACCESS. */
3158 fnum1 = cli_nt_create_full(cli1, fname, 0,FILE_READ_DATA|FILE_WRITE_DATA,
3159 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
3162 printf("[9] open of %s succeeded should have failed!\n", fname);
3167 printf("ninth delete on close test succeeded.\n");
3169 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3170 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0);
3172 printf("[10] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3177 /* This should delete the file. */
3178 if (!cli_close(cli1, fnum1)) {
3179 printf("[10] close failed (%s)\n", cli_errstr(cli1));
3184 /* This should fail.. */
3185 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_NONE);
3187 printf("[10] open of %s succeeded should have been deleted on close !\n", fname);
3191 printf("tenth delete on close test succeeded.\n");
3192 printf("finished delete test\n");
3195 /* FIXME: This will crash if we aborted before cli2 got
3196 * intialized, because these functions don't handle
3197 * uninitialized connections. */
3199 cli_close(cli1, fnum1);
3200 cli_close(cli1, fnum2);
3201 cli_setatr(cli1, fname, 0, 0);
3202 cli_unlink(cli1, fname);
3204 if (!torture_close_connection(cli1)) {
3207 if (!torture_close_connection(cli2)) {
3215 print out server properties
3217 static BOOL run_properties(int dummy)
3219 static struct cli_state *cli;
3220 BOOL correct = True;
3222 printf("starting properties test\n");
3226 if (!torture_open_connection(&cli)) {
3230 cli_sockopt(cli, sockops);
3232 d_printf("Capabilities 0x%08x\n", cli->capabilities);
3234 if (!torture_close_connection(cli)) {
3243 /* FIRST_DESIRED_ACCESS 0xf019f */
3244 #define FIRST_DESIRED_ACCESS FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|\
3245 FILE_READ_EA| /* 0xf */ \
3246 FILE_WRITE_EA|FILE_READ_ATTRIBUTES| /* 0x90 */ \
3247 FILE_WRITE_ATTRIBUTES| /* 0x100 */ \
3248 DELETE_ACCESS|READ_CONTROL_ACCESS|\
3249 WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS /* 0xf0000 */
3250 /* SECOND_DESIRED_ACCESS 0xe0080 */
3251 #define SECOND_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
3252 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
3253 WRITE_OWNER_ACCESS /* 0xe0000 */
3256 #define THIRD_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
3257 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
3259 WRITE_OWNER_ACCESS /* */
3263 Test ntcreate calls made by xcopy
3265 static BOOL run_xcopy(int dummy)
3267 static struct cli_state *cli1;
3268 const char *fname = "\\test.txt";
3269 BOOL correct = True;
3272 printf("starting xcopy test\n");
3274 if (!torture_open_connection(&cli1)) {
3278 fnum1 = cli_nt_create_full(cli1, fname, 0,
3279 FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
3280 FILE_SHARE_NONE, FILE_OVERWRITE_IF,
3284 printf("First open failed - %s\n", cli_errstr(cli1));
3288 fnum2 = cli_nt_create_full(cli1, fname, 0,
3289 SECOND_DESIRED_ACCESS, 0,
3290 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN,
3293 printf("second open failed - %s\n", cli_errstr(cli1));
3297 if (!torture_close_connection(cli1)) {
3305 Test rename on files open with share delete and no share delete.
3307 static BOOL run_rename(int dummy)
3309 static struct cli_state *cli1;
3310 const char *fname = "\\test.txt";
3311 const char *fname1 = "\\test1.txt";
3312 BOOL correct = True;
3315 printf("starting rename test\n");
3317 if (!torture_open_connection(&cli1)) {
3321 cli_unlink(cli1, fname);
3322 cli_unlink(cli1, fname1);
3323 fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3324 FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
3327 printf("First open failed - %s\n", cli_errstr(cli1));
3331 if (!cli_rename(cli1, fname, fname1)) {
3332 printf("First rename failed (this is correct) - %s\n", cli_errstr(cli1));
3334 printf("First rename succeeded - this should have failed !\n");
3338 if (!cli_close(cli1, fnum1)) {
3339 printf("close - 1 failed (%s)\n", cli_errstr(cli1));
3343 cli_unlink(cli1, fname);
3344 cli_unlink(cli1, fname1);
3345 fnum1 = cli_nt_create_full(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3347 FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3349 FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0);
3353 printf("Second open failed - %s\n", cli_errstr(cli1));
3357 if (!cli_rename(cli1, fname, fname1)) {
3358 printf("Second rename failed - this should have succeeded - %s\n", cli_errstr(cli1));
3361 printf("Second rename succeeded\n");
3364 if (!cli_close(cli1, fnum1)) {
3365 printf("close - 2 failed (%s)\n", cli_errstr(cli1));
3369 cli_unlink(cli1, fname);
3370 cli_unlink(cli1, fname1);
3372 fnum1 = cli_nt_create_full(cli1, fname, 0, READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
3373 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3376 printf("Third open failed - %s\n", cli_errstr(cli1));
3385 fnum2 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
3386 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3389 printf("Fourth open failed - %s\n", cli_errstr(cli1));
3392 if (!cli_nt_delete_on_close(cli1, fnum2, True)) {
3393 printf("[8] setting delete_on_close on file failed !\n");
3397 if (!cli_close(cli1, fnum2)) {
3398 printf("close - 4 failed (%s)\n", cli_errstr(cli1));
3404 if (!cli_rename(cli1, fname, fname1)) {
3405 printf("Third rename failed - this should have succeeded - %s\n", cli_errstr(cli1));
3408 printf("Third rename succeeded\n");
3411 if (!cli_close(cli1, fnum1)) {
3412 printf("close - 3 failed (%s)\n", cli_errstr(cli1));
3416 cli_unlink(cli1, fname);
3417 cli_unlink(cli1, fname1);
3419 if (!torture_close_connection(cli1)) {
3426 static BOOL run_pipe_number(int dummy)
3428 struct cli_state *cli1;
3429 const char *pipe_name = "\\SPOOLSS";
3433 printf("starting pipenumber test\n");
3434 if (!torture_open_connection(&cli1)) {
3438 cli_sockopt(cli1, sockops);
3440 fnum = cli_nt_create_full(cli1, pipe_name, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3441 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0, 0);
3444 printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(cli1));
3450 printf("pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
3451 torture_close_connection(cli1);
3456 Test open mode returns on read-only files.
3458 static BOOL run_opentest(int dummy)
3460 static struct cli_state *cli1;
3461 static struct cli_state *cli2;
3462 const char *fname = "\\readonly.file";
3466 BOOL correct = True;
3469 printf("starting open test\n");
3471 if (!torture_open_connection(&cli1)) {
3475 cli_setatr(cli1, fname, 0, 0);
3476 cli_unlink(cli1, fname);
3478 cli_sockopt(cli1, sockops);
3480 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
3482 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
3486 if (!cli_close(cli1, fnum1)) {
3487 printf("close2 failed (%s)\n", cli_errstr(cli1));
3491 if (!cli_setatr(cli1, fname, aRONLY, 0)) {
3492 printf("cli_setatr failed (%s)\n", cli_errstr(cli1));
3496 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_WRITE);
3498 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
3502 /* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
3503 fnum2 = cli_open(cli1, fname, O_RDWR, DENY_ALL);
3505 if (check_error(__LINE__, cli1, ERRDOS, ERRnoaccess,
3506 NT_STATUS_ACCESS_DENIED)) {
3507 printf("correct error code ERRDOS/ERRnoaccess returned\n");
3510 printf("finished open test 1\n");
3512 cli_close(cli1, fnum1);
3514 /* Now try not readonly and ensure ERRbadshare is returned. */
3516 cli_setatr(cli1, fname, 0, 0);
3518 fnum1 = cli_open(cli1, fname, O_RDONLY, DENY_WRITE);
3520 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
3524 /* This will fail - but the error should be ERRshare. */
3525 fnum2 = cli_open(cli1, fname, O_RDWR, DENY_ALL);
3527 if (check_error(__LINE__, cli1, ERRDOS, ERRbadshare,
3528 NT_STATUS_SHARING_VIOLATION)) {
3529 printf("correct error code ERRDOS/ERRbadshare returned\n");
3532 if (!cli_close(cli1, fnum1)) {
3533 printf("close2 failed (%s)\n", cli_errstr(cli1));
3537 cli_unlink(cli1, fname);
3539 printf("finished open test 2\n");
3541 /* Test truncate open disposition on file opened for read. */
3543 fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
3545 printf("(3) open (1) of %s failed (%s)\n", fname, cli_errstr(cli1));
3549 /* write 20 bytes. */
3551 memset(buf, '\0', 20);
3553 if (cli_write(cli1, fnum1, 0, buf, 0, 20) != 20) {
3554 printf("write failed (%s)\n", cli_errstr(cli1));
3558 if (!cli_close(cli1, fnum1)) {
3559 printf("(3) close1 failed (%s)\n", cli_errstr(cli1));
3563 /* Ensure size == 20. */
3564 if (!cli_getatr(cli1, fname, NULL, &fsize, NULL)) {
3565 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
3570 printf("(3) file size != 20\n");
3574 /* Now test if we can truncate a file opened for readonly. */
3576 fnum1 = cli_open(cli1, fname, O_RDONLY|O_TRUNC, DENY_NONE);
3578 printf("(3) open (2) of %s failed (%s)\n", fname, cli_errstr(cli1));
3582 if (!cli_close(cli1, fnum1)) {
3583 printf("close2 failed (%s)\n", cli_errstr(cli1));
3587 /* Ensure size == 0. */
3588 if (!cli_getatr(cli1, fname, NULL, &fsize, NULL)) {
3589 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
3594 printf("(3) file size != 0\n");
3597 printf("finished open test 3\n");
3599 cli_unlink(cli1, fname);
3602 printf("testing ctemp\n");
3603 fnum1 = cli_ctemp(cli1, "\\", &tmp_path);
3605 printf("ctemp failed (%s)\n", cli_errstr(cli1));
3608 printf("ctemp gave path %s\n", tmp_path);
3609 if (!cli_close(cli1, fnum1)) {
3610 printf("close of temp failed (%s)\n", cli_errstr(cli1));
3612 if (!cli_unlink(cli1, tmp_path)) {
3613 printf("unlink of temp failed (%s)\n", cli_errstr(cli1));
3616 /* Test the non-io opens... */
3618 if (!torture_open_connection(&cli2)) {
3622 cli_setatr(cli2, fname, 0, 0);
3623 cli_unlink(cli2, fname);
3625 cli_sockopt(cli2, sockops);
3627 printf("TEST #1 testing 2 non-io opens (no delete)\n");
3629 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3630 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3633 printf("test 1 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3637 fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3638 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
3641 printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3645 if (!cli_close(cli1, fnum1)) {
3646 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3649 if (!cli_close(cli2, fnum2)) {
3650 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3654 printf("non-io open test #1 passed.\n");
3656 cli_unlink(cli1, fname);
3658 printf("TEST #2 testing 2 non-io opens (first with delete)\n");
3660 fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3661 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3664 printf("test 2 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3668 fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3669 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
3672 printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3676 if (!cli_close(cli1, fnum1)) {
3677 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3680 if (!cli_close(cli2, fnum2)) {
3681 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
3685 printf("non-io open test #2 passed.\n");
3687 cli_unlink(cli1, fname);
3689 printf("TEST #3 testing 2 non-io opens (second with delete)\n");
3691 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3692 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3695 printf("test 3 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3699 fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3700 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
3703 printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3707 if (!cli_close(cli1, fnum1)) {
3708 printf("test 3 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3711 if (!cli_close(cli2, fnum2)) {
3712 printf("test 3 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3716 printf("non-io open test #3 passed.\n");
3718 cli_unlink(cli1, fname);
3720 printf("TEST #4 testing 2 non-io opens (both with delete)\n");
3722 fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3723 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3726 printf("test 4 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3730 fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3731 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0);
3734 printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
3738 printf("test 3 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
3740 if (!cli_close(cli1, fnum1)) {
3741 printf("test 4 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3745 printf("non-io open test #4 passed.\n");
3747 cli_unlink(cli1, fname);
3749 printf("TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n");
3751 fnum1 = cli_nt_create_full(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3752 FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0);
3755 printf("test 5 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3759 fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3760 FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
3763 printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3767 if (!cli_close(cli1, fnum1)) {
3768 printf("test 5 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3772 if (!cli_close(cli2, fnum2)) {
3773 printf("test 5 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3777 printf("non-io open test #5 passed.\n");
3779 printf("TEST #6 testing 1 non-io open, one io open\n");
3781 cli_unlink(cli1, fname);
3783 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3784 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3787 printf("test 6 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3791 fnum2 = cli_nt_create_full(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3792 FILE_SHARE_READ, FILE_OPEN_IF, 0, 0);
3795 printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3799 if (!cli_close(cli1, fnum1)) {
3800 printf("test 6 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3804 if (!cli_close(cli2, fnum2)) {
3805 printf("test 6 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3809 printf("non-io open test #6 passed.\n");
3811 printf("TEST #7 testing 1 non-io open, one io open with delete\n");
3813 cli_unlink(cli1, fname);
3815 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3816 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3819 printf("test 7 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3823 fnum2 = cli_nt_create_full(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3824 FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0);
3827 printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
3831 printf("test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
3833 if (!cli_close(cli1, fnum1)) {
3834 printf("test 7 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3838 printf("non-io open test #7 passed.\n");
3840 cli_unlink(cli1, fname);
3842 if (!torture_close_connection(cli1)) {
3845 if (!torture_close_connection(cli2)) {
3852 static uint32 open_attrs_table[] = {
3853 FILE_ATTRIBUTE_NORMAL,
3854 FILE_ATTRIBUTE_ARCHIVE,
3855 FILE_ATTRIBUTE_READONLY,
3856 FILE_ATTRIBUTE_HIDDEN,
3857 FILE_ATTRIBUTE_SYSTEM,
3859 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY,
3860 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN,
3861 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,
3862 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
3863 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
3864 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
3866 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
3867 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
3868 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
3869 FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_SYSTEM,
3872 struct trunc_open_results {
3879 static struct trunc_open_results attr_results[] = {
3880 { 0, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
3881 { 1, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
3882 { 2, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
3883 { 16, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
3884 { 17, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
3885 { 18, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
3886 { 51, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3887 { 54, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3888 { 56, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
3889 { 68, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3890 { 71, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3891 { 73, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
3892 { 99, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3893 { 102, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3894 { 104, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
3895 { 116, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3896 { 119, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3897 { 121, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
3898 { 170, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN },
3899 { 173, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM },
3900 { 227, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3901 { 230, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
3902 { 232, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
3903 { 244, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3904 { 247, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
3905 { 249, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM }
3908 static BOOL run_openattrtest(int dummy)
3910 static struct cli_state *cli1;
3911 const char *fname = "\\openattr.file";
3913 BOOL correct = True;
3915 unsigned int i, j, k, l;
3917 printf("starting open attr test\n");
3919 if (!torture_open_connection(&cli1)) {
3923 cli_sockopt(cli1, sockops);
3925 for (k = 0, i = 0; i < sizeof(open_attrs_table)/sizeof(uint32); i++) {
3926 cli_setatr(cli1, fname, 0, 0);
3927 cli_unlink(cli1, fname);
3928 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_WRITE_DATA, open_attrs_table[i],
3929 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0);
3932 printf("open %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
3936 if (!cli_close(cli1, fnum1)) {
3937 printf("close %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
3941 for (j = 0; j < sizeof(open_attrs_table)/sizeof(uint32); j++) {
3942 fnum1 = cli_nt_create_full(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA, open_attrs_table[j],
3943 FILE_SHARE_NONE, FILE_OVERWRITE, 0, 0);
3946 for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
3947 if (attr_results[l].num == k) {
3948 printf("[%d] trunc open 0x%x -> 0x%x of %s failed - should have succeeded !(0x%x:%s)\n",
3949 k, open_attrs_table[i],
3950 open_attrs_table[j],
3951 fname, NT_STATUS_V(cli_nt_error(cli1)), cli_errstr(cli1));
3955 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_ACCESS_DENIED)) {
3956 printf("[%d] trunc open 0x%x -> 0x%x failed with wrong error code %s\n",
3957 k, open_attrs_table[i], open_attrs_table[j],
3962 printf("[%d] trunc open 0x%x -> 0x%x failed\n", k, open_attrs_table[i], open_attrs_table[j]);
3968 if (!cli_close(cli1, fnum1)) {
3969 printf("close %d (2) of %s failed (%s)\n", j, fname, cli_errstr(cli1));
3973 if (!cli_getatr(cli1, fname, &attr, NULL, NULL)) {
3974 printf("getatr(2) failed (%s)\n", cli_errstr(cli1));
3979 printf("[%d] getatr check [0x%x] trunc [0x%x] got attr 0x%x\n",
3980 k, open_attrs_table[i], open_attrs_table[j], attr );
3983 for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
3984 if (attr_results[l].num == k) {
3985 if (attr != attr_results[l].result_attr ||
3986 open_attrs_table[i] != attr_results[l].init_attr ||
3987 open_attrs_table[j] != attr_results[l].trunc_attr) {
3988 printf("getatr check failed. [0x%x] trunc [0x%x] got attr 0x%x, should be 0x%x\n",
3989 open_attrs_table[i],
3990 open_attrs_table[j],
3992 attr_results[l].result_attr);
4002 cli_setatr(cli1, fname, 0, 0);
4003 cli_unlink(cli1, fname);
4005 printf("open attr test %s.\n", correct ? "passed" : "failed");
4007 if (!torture_close_connection(cli1)) {
4013 static void list_fn(file_info *finfo, const char *name, void *state)
4019 test directory listing speed
4021 static BOOL run_dirtest(int dummy)
4024 static struct cli_state *cli;
4027 BOOL correct = True;
4029 printf("starting directory test\n");
4031 if (!torture_open_connection(&cli)) {
4035 cli_sockopt(cli, sockops);
4038 for (i=0;i<torture_numops;i++) {
4040 slprintf(fname, sizeof(fname), "\\%x", (int)random());
4041 fnum = cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE);
4043 fprintf(stderr,"Failed to open %s\n", fname);
4046 cli_close(cli, fnum);
4051 printf("Matched %d\n", cli_list(cli, "a*.*", 0, list_fn, NULL));
4052 printf("Matched %d\n", cli_list(cli, "b*.*", 0, list_fn, NULL));
4053 printf("Matched %d\n", cli_list(cli, "xyzabc", 0, list_fn, NULL));
4055 printf("dirtest core %g seconds\n", end_timer() - t1);
4058 for (i=0;i<torture_numops;i++) {
4060 slprintf(fname, sizeof(fname), "\\%x", (int)random());
4061 cli_unlink(cli, fname);
4064 if (!torture_close_connection(cli)) {
4068 printf("finished dirtest\n");
4073 static void del_fn(file_info *finfo, const char *mask, void *state)
4075 struct cli_state *pcli = (struct cli_state *)state;
4077 slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
4079 if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
4082 if (finfo->mode & aDIR) {
4083 if (!cli_rmdir(pcli, fname))
4084 printf("del_fn: failed to rmdir %s\n,", fname );
4086 if (!cli_unlink(pcli, fname))
4087 printf("del_fn: failed to unlink %s\n,", fname );
4093 sees what IOCTLs are supported
4095 BOOL torture_ioctl_test(int dummy)
4097 static struct cli_state *cli;
4098 uint16 device, function;
4100 const char *fname = "\\ioctl.dat";
4104 if (!torture_open_connection(&cli)) {
4108 printf("starting ioctl test\n");
4110 cli_unlink(cli, fname);
4112 fnum = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
4114 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
4118 status = cli_raw_ioctl(cli, fnum, 0x2d0000 | (0x0420<<2), &blob);
4119 printf("ioctl device info: %s\n", cli_errstr(cli));
4121 status = cli_raw_ioctl(cli, fnum, IOCTL_QUERY_JOB_INFO, &blob);
4122 printf("ioctl job info: %s\n", cli_errstr(cli));
4124 for (device=0;device<0x100;device++) {
4125 printf("testing device=0x%x\n", device);
4126 for (function=0;function<0x100;function++) {
4127 uint32 code = (device<<16) | function;
4129 status = cli_raw_ioctl(cli, fnum, code, &blob);
4131 if (NT_STATUS_IS_OK(status)) {
4132 printf("ioctl 0x%x OK : %d bytes\n", code, blob.length);
4133 data_blob_free(&blob);
4138 if (!torture_close_connection(cli)) {
4147 tries varients of chkpath
4149 BOOL torture_chkpath_test(int dummy)
4151 static struct cli_state *cli;
4155 if (!torture_open_connection(&cli)) {
4159 printf("starting chkpath test\n");
4161 /* cleanup from an old run */
4162 cli_rmdir(cli, "\\chkpath.dir\\dir2");
4163 cli_unlink(cli, "\\chkpath.dir\\*");
4164 cli_rmdir(cli, "\\chkpath.dir");
4166 if (!cli_mkdir(cli, "\\chkpath.dir")) {
4167 printf("mkdir1 failed : %s\n", cli_errstr(cli));
4171 if (!cli_mkdir(cli, "\\chkpath.dir\\dir2")) {
4172 printf("mkdir2 failed : %s\n", cli_errstr(cli));
4176 fnum = cli_open(cli, "\\chkpath.dir\\foo.txt", O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
4178 printf("open1 failed (%s)\n", cli_errstr(cli));
4181 cli_close(cli, fnum);
4183 if (!cli_chkpath(cli, "\\chkpath.dir")) {
4184 printf("chkpath1 failed: %s\n", cli_errstr(cli));
4188 if (!cli_chkpath(cli, "\\chkpath.dir\\dir2")) {
4189 printf("chkpath2 failed: %s\n", cli_errstr(cli));
4193 if (!cli_chkpath(cli, "\\chkpath.dir\\foo.txt")) {
4194 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath,
4195 NT_STATUS_NOT_A_DIRECTORY);
4197 printf("* chkpath on a file should fail\n");
4201 if (!cli_chkpath(cli, "\\chkpath.dir\\bar.txt")) {
4202 ret = check_error(__LINE__, cli, ERRDOS, ERRbadfile,
4203 NT_STATUS_OBJECT_NAME_NOT_FOUND);
4205 printf("* chkpath on a non existant file should fail\n");
4209 if (!cli_chkpath(cli, "\\chkpath.dir\\dirxx\\bar.txt")) {
4210 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath,
4211 NT_STATUS_OBJECT_PATH_NOT_FOUND);
4213 printf("* chkpath on a non existent component should fail\n");
4217 cli_rmdir(cli, "\\chkpath.dir\\dir2");
4218 cli_unlink(cli, "\\chkpath.dir\\*");
4219 cli_rmdir(cli, "\\chkpath.dir");
4221 if (!torture_close_connection(cli)) {
4231 static BOOL run_dirtest1(int dummy)
4234 static struct cli_state *cli;
4236 BOOL correct = True;
4238 printf("starting directory test\n");
4240 if (!torture_open_connection(&cli)) {
4244 cli_sockopt(cli, sockops);
4246 cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
4247 cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
4248 cli_rmdir(cli, "\\LISTDIR");
4249 cli_mkdir(cli, "\\LISTDIR");
4251 /* Create 1000 files and 1000 directories. */
4252 for (i=0;i<1000;i++) {
4254 slprintf(fname, sizeof(fname), "\\LISTDIR\\f%d", i);
4255 fnum = cli_nt_create_full(cli, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
4256 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0);
4258 fprintf(stderr,"Failed to open %s\n", fname);
4261 cli_close(cli, fnum);
4263 for (i=0;i<1000;i++) {
4265 slprintf(fname, sizeof(fname), "\\LISTDIR\\d%d", i);
4266 if (!cli_mkdir(cli, fname)) {
4267 fprintf(stderr,"Failed to open %s\n", fname);
4272 /* Now ensure that doing an old list sees both files and directories. */
4273 num_seen = cli_list_old(cli, "\\LISTDIR\\*", aDIR, list_fn, NULL);
4274 printf("num_seen = %d\n", num_seen );
4275 /* We should see 100 files + 1000 directories + . and .. */
4276 if (num_seen != 2002)
4279 /* Ensure if we have the "must have" bits we only see the
4282 num_seen = cli_list_old(cli, "\\LISTDIR\\*", (aDIR<<8)|aDIR, list_fn, NULL);
4283 printf("num_seen = %d\n", num_seen );
4284 if (num_seen != 1002)
4287 num_seen = cli_list_old(cli, "\\LISTDIR\\*", (aARCH<<8)|aDIR, list_fn, NULL);
4288 printf("num_seen = %d\n", num_seen );
4289 if (num_seen != 1000)
4292 /* Delete everything. */
4293 cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
4294 cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
4295 cli_rmdir(cli, "\\LISTDIR");
4298 printf("Matched %d\n", cli_list(cli, "a*.*", 0, list_fn, NULL));
4299 printf("Matched %d\n", cli_list(cli, "b*.*", 0, list_fn, NULL));
4300 printf("Matched %d\n", cli_list(cli, "xyzabc", 0, list_fn, NULL));
4303 if (!torture_close_connection(cli)) {
4307 printf("finished dirtest1\n");
4312 static BOOL run_error_map_extract(int dummy) {
4314 static struct cli_state c_dos;
4315 static struct cli_state c_nt;
4319 uint32 flgs2, errnum;
4326 /* NT-Error connection */
4328 if (!open_nbt_connection(&c_nt)) {
4332 c_nt.use_spnego = False;
4334 if (!cli_negprot(&c_nt)) {
4335 printf("%s rejected the NT-error negprot (%s)\n",host, cli_errstr(&c_nt));
4336 cli_shutdown(&c_nt);
4340 if (!cli_session_setup(&c_nt, "", "", 0, "", 0,
4342 printf("%s rejected the NT-error initial session setup (%s)\n",host, cli_errstr(&c_nt));
4346 /* DOS-Error connection */
4348 if (!open_nbt_connection(&c_dos)) {
4352 c_dos.use_spnego = False;
4353 c_dos.force_dos_errors = True;
4355 if (!cli_negprot(&c_dos)) {
4356 printf("%s rejected the DOS-error negprot (%s)\n",host, cli_errstr(&c_dos));
4357 cli_shutdown(&c_dos);
4361 if (!cli_session_setup(&c_dos, "", "", 0, "", 0,
4363 printf("%s rejected the DOS-error initial session setup (%s)\n",host, cli_errstr(&c_dos));
4367 for (error=(0xc0000000 | 0x1); error < (0xc0000000| 0xFFF); error++) {
4368 snprintf(user, sizeof(user), "%X", error);
4370 if (cli_session_setup(&c_nt, user,
4371 password, strlen(password),
4372 password, strlen(password),
4374 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
4377 flgs2 = SVAL(c_nt.inbuf,smb_flg2);
4379 /* Case #1: 32-bit NT errors */
4380 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
4381 nt_status = NT_STATUS(IVAL(c_nt.inbuf,smb_rcls));
4383 printf("/** Dos error on NT connection! (%s) */\n",
4385 nt_status = NT_STATUS(0xc0000000);
4388 if (cli_session_setup(&c_dos, user,
4389 password, strlen(password),
4390 password, strlen(password),
4392 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
4394 flgs2 = SVAL(c_dos.inbuf,smb_flg2), errnum;
4396 /* Case #1: 32-bit NT errors */
4397 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
4398 printf("/** NT error on DOS connection! (%s) */\n",
4400 errnum = errclass = 0;
4402 cli_dos_error(&c_dos, &errclass, &errnum);
4405 if (NT_STATUS_V(nt_status) != error) {
4406 printf("/*\t{ This NT error code was 'sqashed'\n\t from %s to %s \n\t during the session setup }\n*/\n",
4407 get_nt_error_c_code(NT_STATUS(error)),
4408 get_nt_error_c_code(nt_status));
4411 printf("\t{%s,\t%s,\t%s},\n",
4412 smb_dos_err_class(errclass),
4413 smb_dos_err_name(errclass, errnum),
4414 get_nt_error_c_code(NT_STATUS(error)));
4419 static double create_procs(BOOL (*fn)(int), BOOL *result)
4422 volatile pid_t *child_status;
4423 volatile BOOL *child_status_out;
4429 child_status = (volatile pid_t *)shm_setup(sizeof(pid_t)*nprocs);
4430 if (!child_status) {
4431 printf("Failed to setup shared memory\n");
4435 child_status_out = (volatile BOOL *)shm_setup(sizeof(BOOL)*nprocs);
4436 if (!child_status_out) {
4437 printf("Failed to setup result status shared memory\n");
4441 for (i = 0; i < nprocs; i++) {
4442 child_status[i] = 0;
4443 child_status_out[i] = True;
4448 for (i=0;i<nprocs;i++) {
4451 pid_t mypid = getpid();
4452 sys_srandom(((int)mypid) ^ ((int)time(NULL)));
4454 slprintf(myname,sizeof(myname),"CLIENT%d", i);
4457 if (torture_open_connection(¤t_cli)) break;
4459 printf("pid %d failed to start\n", (int)getpid());
4465 child_status[i] = getpid();
4467 while (child_status[i] && end_timer() < 5) msleep(2);
4469 child_status_out[i] = fn(i);
4476 for (i=0;i<nprocs;i++) {
4477 if (child_status[i]) synccount++;
4479 if (synccount == nprocs) break;
4481 } while (end_timer() < 30);
4483 if (synccount != nprocs) {
4484 printf("FAILED TO START %d CLIENTS (started %d)\n", nprocs, synccount);
4489 /* start the client load */
4492 for (i=0;i<nprocs;i++) {
4493 child_status[i] = 0;
4496 printf("%d clients started\n", nprocs);
4498 for (i=0;i<nprocs;i++) {
4499 while (waitpid(0, &status, 0) == -1 && errno == EINTR) /* noop */ ;
4504 for (i=0;i<nprocs;i++) {
4505 if (!child_status_out[i]) {
4512 #define FLAG_MULTIPROC 1
4519 {"FDPASS", run_fdpasstest, 0},
4520 {"LOCK1", run_locktest1, 0},
4521 {"LOCK2", run_locktest2, 0},
4522 {"LOCK3", run_locktest3, 0},
4523 {"LOCK4", run_locktest4, 0},
4524 {"LOCK5", run_locktest5, 0},
4525 {"LOCK6", run_locktest6, 0},
4526 {"LOCK7", run_locktest7, 0},
4527 {"UNLINK", run_unlinktest, 0},
4528 {"BROWSE", run_browsetest, 0},
4529 {"ATTR", run_attrtest, 0},
4530 {"TRANS2", run_trans2test, 0},
4531 {"MAXFID", run_maxfidtest, FLAG_MULTIPROC},
4532 {"TORTURE",run_torture, FLAG_MULTIPROC},
4533 {"RANDOMIPC", run_randomipc, 0},
4534 {"NEGNOWAIT", run_negprot_nowait, 0},
4535 {"NBENCH", run_nbench, 0},
4536 {"OPLOCK1", run_oplock1, 0},
4537 {"OPLOCK2", run_oplock2, 0},
4538 {"OPLOCK3", run_oplock3, 0},
4539 {"DIR", run_dirtest, 0},
4540 {"DIR1", run_dirtest1, 0},
4541 {"DENY1", torture_denytest1, 0},
4542 {"DENY2", torture_denytest2, 0},
4543 {"TCON", run_tcon_test, 0},
4544 {"TCONDEV", run_tcon_devtype_test, 0},
4545 {"RW1", run_readwritetest, 0},
4546 {"RW2", run_readwritemulti, FLAG_MULTIPROC},
4547 {"RW3", run_readwritelarge, 0},
4548 {"OPEN", run_opentest, 0},
4550 {"OPENATTR", run_openattrtest, 0},
4552 {"XCOPY", run_xcopy, 0},
4553 {"RENAME", run_rename, 0},
4554 {"DELETE", run_deletetest, 0},
4555 {"PROPERTIES", run_properties, 0},
4556 {"MANGLE", torture_mangle, 0},
4557 {"W2K", run_w2ktest, 0},
4558 {"TRANS2SCAN", torture_trans2_scan, 0},
4559 {"NTTRANSSCAN", torture_nttrans_scan, 0},
4560 {"UTABLE", torture_utable, 0},
4561 {"CASETABLE", torture_casetable, 0},
4562 {"ERRMAPEXTRACT", run_error_map_extract, 0},
4563 {"PIPE_NUMBER", run_pipe_number, 0},
4564 {"TCON2", run_tcon2_test, 0},
4565 {"IOCTL", torture_ioctl_test, 0},
4566 {"CHKPATH", torture_chkpath_test, 0},
4567 {"FDSESS", run_fdsesstest, 0},
4572 /****************************************************************************
4573 run a specified test or "ALL"
4574 ****************************************************************************/
4575 static BOOL run_test(const char *name)
4581 if (strequal(name,"ALL")) {
4582 for (i=0;torture_ops[i].name;i++) {
4583 run_test(torture_ops[i].name);
4587 for (i=0;torture_ops[i].name;i++) {
4588 snprintf(randomfname, sizeof(randomfname), "\\XX%x",
4589 (unsigned)random());
4591 if (strequal(name, torture_ops[i].name)) {
4592 printf("Running %s\n", name);
4593 if (torture_ops[i].flags & FLAG_MULTIPROC) {
4594 t = create_procs(torture_ops[i].fn, &result);
4597 printf("TEST %s FAILED!\n", name);
4602 if (!torture_ops[i].fn(0)) {
4604 printf("TEST %s FAILED!\n", name);
4608 printf("%s took %g secs\n\n", name, t);
4615 static void usage(void)
4619 printf("Usage: smbtorture //server/share <options> TEST1 TEST2 ...\n");
4621 printf("\t-d debuglevel\n");
4622 printf("\t-U user%%pass\n");
4623 printf("\t-k use kerberos\n");
4624 printf("\t-N numprocs\n");
4625 printf("\t-n my_netbios_name\n");
4626 printf("\t-W workgroup\n");
4627 printf("\t-o num_operations\n");
4628 printf("\t-O socket_options\n");
4629 printf("\t-m maximum protocol\n");
4630 printf("\t-L use oplocks\n");
4631 printf("\t-c CLIENT.TXT specify client load file for NBENCH\n");
4632 printf("\t-A showall\n");
4633 printf("\t-p port\n");
4634 printf("\t-s seed\n");
4637 printf("tests are:");
4638 for (i=0;torture_ops[i].name;i++) {
4639 printf(" %s", torture_ops[i].name);
4643 printf("default test is ALL\n");
4648 /****************************************************************************
4650 ****************************************************************************/
4651 int main(int argc,char *argv[])
4657 extern char *optarg;
4659 BOOL correct = True;
4663 #ifdef HAVE_SETBUFFER
4664 setbuffer(stdout, NULL, 0);
4667 lp_load(dyn_CONFIGFILE,True,False,False);
4674 for(p = argv[1]; *p; p++)
4678 if (strncmp(argv[1], "//", 2)) {
4682 fstrcpy(host, &argv[1][2]);
4683 p = strchr_m(&host[2],'/');
4688 fstrcpy(share, p+1);
4692 if (*username == 0 && getenv("LOGNAME")) {
4693 fstrcpy(username,getenv("LOGNAME"));
4699 srandom(time(NULL));
4701 fstrcpy(workgroup, lp_workgroup());
4703 while ((opt = getopt(argc, argv, "p:hW:U:n:N:O:o:m:Ld:Ac:ks:")) != EOF) {
4706 port_to_use = atoi(optarg);
4709 srandom(atoi(optarg));
4712 fstrcpy(workgroup,optarg);
4715 max_protocol = interpret_protocol(optarg, max_protocol);
4718 nprocs = atoi(optarg);
4721 torture_numops = atoi(optarg);
4724 DEBUGLEVEL = atoi(optarg);
4733 torture_showall = True;
4736 fstrcpy(myname, optarg);
4739 client_txt = optarg;
4743 use_kerberos = True;
4745 d_printf("No kerberos support compiled in\n");
4751 fstrcpy(username,optarg);
4752 p = strchr_m(username,'%');
4755 fstrcpy(password, p+1);
4760 printf("Unknown option %c (%d)\n", (char)opt, opt);
4765 if(use_kerberos && !gotuser) gotpass = True;
4768 p = getpass("Password:");
4770 fstrcpy(password, p);
4775 printf("host=%s share=%s user=%s myname=%s\n",
4776 host, share, username, myname);
4779 correct = run_test("ALL");
4781 for (i=1;i<argc;i++) {
4782 if (!run_test(argv[i])) {