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 int torture_numops=100;
30 static int procnum; /* records process count number when forking */
31 static struct cli_state current_cli;
32 static fstring randomfname;
33 static BOOL use_oplocks;
34 static BOOL use_level_II_oplocks;
35 static const char *client_txt = "client_oplocks.txt";
36 static BOOL use_kerberos;
38 BOOL torture_showall = False;
40 static double create_procs(BOOL (*fn)(int), BOOL *result);
43 static struct timeval tp1,tp2;
45 void start_timer(void)
47 gettimeofday(&tp1,NULL);
50 double end_timer(void)
52 gettimeofday(&tp2,NULL);
53 return((tp2.tv_sec - tp1.tv_sec) +
54 (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
58 /* return a pointer to a anonymous shared memory segment of size "size"
59 which will persist across fork() but will disappear when all processes
62 The memory is not zeroed
64 This function uses system5 shared memory. It takes advantage of a property
65 that the memory is not destroyed if it is attached when the id is removed
67 void *shm_setup(int size)
72 shmid = shmget(IPC_PRIVATE, size, SHM_R | SHM_W);
74 printf("can't get shared memory\n");
77 ret = (void *)shmat(shmid, 0, 0);
78 if (!ret || ret == (void *)-1) {
79 printf("can't attach to shared memory\n");
82 /* the following releases the ipc, but note that this process
83 and all its children will still have access to the memory, its
84 just that the shmid is no longer valid for other shm calls. This
85 means we don't leave behind lots of shm segments after we exit
87 See Stevens "advanced programming in unix env" for details
89 shmctl(shmid, IPC_RMID, 0);
95 static BOOL open_nbt_connection(struct cli_state *c)
97 struct nmb_name called, calling;
102 make_nmb_name(&calling, myname, 0x0);
103 make_nmb_name(&called , host, 0x20);
107 if (!cli_initialise(c) || !cli_connect(c, host, &ip)) {
108 printf("Failed to connect with %s\n", host);
112 c->use_kerberos = use_kerberos;
114 c->timeout = 120000; /* set a really long timeout (2 minutes) */
115 if (use_oplocks) c->use_oplocks = True;
116 if (use_level_II_oplocks) c->use_level_II_oplocks = True;
118 if (!cli_session_request(c, &calling, &called)) {
119 printf("%s rejected the session\n",host);
127 BOOL torture_open_connection(struct cli_state *c)
131 if (!open_nbt_connection(c)) {
135 if (!cli_negprot(c)) {
136 printf("%s rejected the negprot (%s)\n",host, cli_errstr(c));
141 if (!cli_session_setup(c, username,
142 password, strlen(password),
143 password, strlen(password),
145 printf("%s rejected the sessionsetup (%s)\n", host, cli_errstr(c));
150 if (!cli_send_tconX(c, share, "?????",
151 password, strlen(password)+1)) {
152 printf("%s refused tree connect (%s)\n", host, cli_errstr(c));
161 BOOL torture_close_connection(struct cli_state *c)
165 printf("tdis failed (%s)\n", cli_errstr(c));
175 /* check if the server produced the expected error code */
176 static BOOL check_error(int line, struct cli_state *c,
177 uint8 eclass, uint32 ecode, NTSTATUS nterr)
179 if (cli_is_dos_error(c)) {
183 /* Check DOS error */
185 cli_dos_error(c, &class, &num);
187 if (eclass != class || ecode != num) {
188 printf("unexpected error code class=%d code=%d\n",
189 (int)class, (int)num);
190 printf(" expected %d/%d %s (line=%d)\n",
191 (int)eclass, (int)ecode, nt_errstr(nterr), line);
200 status = cli_nt_error(c);
202 if (NT_STATUS_V(nterr) != NT_STATUS_V(status)) {
203 printf("unexpected error code %s\n", nt_errstr(status));
204 printf(" expected %s (line=%d)\n", nt_errstr(nterr), line);
213 static BOOL wait_lock(struct cli_state *c, int fnum, uint32 offset, uint32 len)
215 while (!cli_lock(c, fnum, offset, len, -1, WRITE_LOCK)) {
216 if (!check_error(__LINE__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
222 static BOOL rw_torture(struct cli_state *c)
224 const char *lockfname = "\\torture.lck";
228 pid_t pid2, pid = getpid();
233 fnum2 = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
236 fnum2 = cli_open(c, lockfname, O_RDWR, DENY_NONE);
238 printf("open of %s failed (%s)\n", lockfname, cli_errstr(c));
243 for (i=0;i<torture_numops;i++) {
244 unsigned n = (unsigned)sys_random()%10;
246 printf("%d\r", i); fflush(stdout);
248 slprintf(fname, sizeof(fstring) - 1, "\\torture.%u", n);
250 if (!wait_lock(c, fnum2, n*sizeof(int), sizeof(int))) {
254 fnum = cli_open(c, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL);
256 printf("open failed (%s)\n", cli_errstr(c));
261 if (cli_write(c, fnum, 0, (char *)&pid, 0, sizeof(pid)) != sizeof(pid)) {
262 printf("write failed (%s)\n", cli_errstr(c));
267 if (cli_write(c, fnum, 0, (char *)buf,
268 sizeof(pid)+(j*sizeof(buf)),
269 sizeof(buf)) != sizeof(buf)) {
270 printf("write failed (%s)\n", cli_errstr(c));
277 if (cli_read(c, fnum, (char *)&pid2, 0, sizeof(pid)) != sizeof(pid)) {
278 printf("read failed (%s)\n", cli_errstr(c));
283 printf("data corruption!\n");
287 if (!cli_close(c, fnum)) {
288 printf("close failed (%s)\n", cli_errstr(c));
292 if (!cli_unlink(c, fname)) {
293 printf("unlink failed (%s)\n", cli_errstr(c));
297 if (!cli_unlock(c, fnum2, n*sizeof(int), sizeof(int))) {
298 printf("unlock failed (%s)\n", cli_errstr(c));
304 cli_unlink(c, lockfname);
311 static BOOL run_torture(int dummy)
313 struct cli_state cli;
318 cli_sockopt(&cli, sockops);
320 ret = rw_torture(&cli);
322 if (!torture_close_connection(&cli)) {
329 static BOOL rw_torture3(struct cli_state *c, char *lockfname)
336 unsigned countprev = 0;
341 for (i = 0; i < sizeof(buf); i += sizeof(uint32))
343 SIVAL(buf, i, sys_random());
348 fnum = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
351 printf("first open read/write of %s failed (%s)\n",
352 lockfname, cli_errstr(c));
358 for (i = 0; i < 500 && fnum == -1; i++)
360 fnum = cli_open(c, lockfname, O_RDONLY,
365 printf("second open read-only of %s failed (%s)\n",
366 lockfname, cli_errstr(c));
372 for (count = 0; count < sizeof(buf); count += sent)
374 if (count >= countprev) {
375 printf("%d %8d\r", i, count);
378 countprev += (sizeof(buf) / 20);
383 sent = ((unsigned)sys_random()%(20))+ 1;
384 if (sent > sizeof(buf) - count)
386 sent = sizeof(buf) - count;
389 if (cli_write(c, fnum, 0, buf+count, count, (size_t)sent) != sent) {
390 printf("write failed (%s)\n", cli_errstr(c));
396 sent = cli_read(c, fnum, buf_rd+count, count,
400 printf("read failed offset:%d size:%d (%s)\n",
401 count, sizeof(buf)-count,
408 if (memcmp(buf_rd+count, buf+count, sent) != 0)
410 printf("read/write compare failed\n");
411 printf("offset: %d req %d recvd %d\n",
412 count, sizeof(buf)-count, sent);
421 if (!cli_close(c, fnum)) {
422 printf("close failed (%s)\n", cli_errstr(c));
429 static BOOL rw_torture2(struct cli_state *c1, struct cli_state *c2)
431 const char *lockfname = "\\torture2.lck";
436 uchar buf_rd[131072];
440 if (!cli_unlink(c1, lockfname)) {
441 printf("unlink failed (%s) (normal, this file should not exist)\n", cli_errstr(c1));
444 fnum1 = cli_open(c1, lockfname, O_RDWR | O_CREAT | O_EXCL,
447 printf("first open read/write of %s failed (%s)\n",
448 lockfname, cli_errstr(c1));
451 fnum2 = cli_open(c2, lockfname, O_RDONLY,
454 printf("second open read-only of %s failed (%s)\n",
455 lockfname, cli_errstr(c2));
456 cli_close(c1, fnum1);
460 for (i=0;i<torture_numops;i++)
462 size_t buf_size = ((unsigned)sys_random()%(sizeof(buf)-1))+ 1;
464 printf("%d\r", i); fflush(stdout);
467 generate_random_buffer(buf, buf_size, False);
469 if (cli_write(c1, fnum1, 0, buf, 0, buf_size) != buf_size) {
470 printf("write failed (%s)\n", cli_errstr(c1));
474 if ((bytes_read = cli_read(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
475 printf("read failed (%s)\n", cli_errstr(c2));
476 printf("read %d, expected %d\n", bytes_read, buf_size);
480 if (memcmp(buf_rd, buf, buf_size) != 0)
482 printf("read/write compare failed\n");
487 if (!cli_close(c2, fnum2)) {
488 printf("close failed (%s)\n", cli_errstr(c2));
491 if (!cli_close(c1, fnum1)) {
492 printf("close failed (%s)\n", cli_errstr(c1));
496 if (!cli_unlink(c1, lockfname)) {
497 printf("unlink failed (%s)\n", cli_errstr(c1));
504 static BOOL run_readwritetest(int dummy)
506 static struct cli_state cli1, cli2;
509 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
512 cli_sockopt(&cli1, sockops);
513 cli_sockopt(&cli2, sockops);
515 printf("starting readwritetest\n");
517 test1 = rw_torture2(&cli1, &cli2);
518 printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));
520 test2 = rw_torture2(&cli1, &cli1);
521 printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
523 if (!torture_close_connection(&cli1)) {
527 if (!torture_close_connection(&cli2)) {
531 return (test1 && test2);
534 static BOOL run_readwritemulti(int dummy)
536 static struct cli_state cli;
541 cli_sockopt(&cli, sockops);
543 printf("run_readwritemulti: fname %s\n", randomfname);
544 test = rw_torture3(&cli, randomfname);
546 if (!torture_close_connection(&cli)) {
553 static BOOL run_readwritelarge(int dummy)
555 static struct cli_state cli1;
557 const char *lockfname = "\\large.dat";
562 if (!torture_open_connection(&cli1)) {
565 cli_sockopt(&cli1, sockops);
566 memset(buf,'\0',sizeof(buf));
568 cli1.max_xmit = 128*1024;
570 printf("starting readwritelarge\n");
572 cli_unlink(&cli1, lockfname);
574 fnum1 = cli_open(&cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
576 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(&cli1));
580 cli_write(&cli1, fnum1, 0, buf, 0, sizeof(buf));
582 if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
583 printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
587 if (fsize == sizeof(buf))
588 printf("readwritelarge test 1 succeeded (size = %x)\n", fsize);
590 printf("readwritelarge test 1 failed (size = %x)\n", fsize);
594 if (!cli_close(&cli1, fnum1)) {
595 printf("close failed (%s)\n", cli_errstr(&cli1));
599 if (!cli_unlink(&cli1, lockfname)) {
600 printf("unlink failed (%s)\n", cli_errstr(&cli1));
604 fnum1 = cli_open(&cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);
606 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(&cli1));
610 cli1.max_xmit = 4*1024;
612 cli_smbwrite(&cli1, fnum1, buf, 0, sizeof(buf));
614 if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
615 printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
619 if (fsize == sizeof(buf))
620 printf("readwritelarge test 2 succeeded (size = %x)\n", fsize);
622 printf("readwritelarge test 2 failed (size = %x)\n", fsize);
627 /* ToDo - set allocation. JRA */
628 if(!cli_set_allocation_size(&cli1, fnum1, 0)) {
629 printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
632 if (!cli_qfileinfo(&cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
633 printf("qfileinfo failed (%s)\n", cli_errstr(&cli1));
637 printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);
640 if (!cli_close(&cli1, fnum1)) {
641 printf("close failed (%s)\n", cli_errstr(&cli1));
645 if (!torture_close_connection(&cli1)) {
654 #define ival(s) strtol(s, NULL, 0)
656 /* run a test that simulates an approximate netbench client load */
657 static BOOL run_netbench(int client)
659 struct cli_state cli;
672 cli_sockopt(&cli, sockops);
676 slprintf(cname,sizeof(fname), "client%d", client);
678 f = fopen(client_txt, "r");
685 while (fgets(line, sizeof(line)-1, f)) {
688 line[strlen(line)-1] = 0;
690 /* printf("[%d] %s\n", line_count, line); */
692 all_string_sub(line,"client1", cname, sizeof(line));
694 /* parse the command parameters */
695 params[0] = strtok(line," ");
697 while (params[i]) params[++i] = strtok(NULL," ");
703 if (!strncmp(params[0],"SMB", 3)) {
704 printf("ERROR: You are using a dbench 1 load file\n");
708 if (!strcmp(params[0],"NTCreateX")) {
709 nb_createx(params[1], ival(params[2]), ival(params[3]),
711 } else if (!strcmp(params[0],"Close")) {
712 nb_close(ival(params[1]));
713 } else if (!strcmp(params[0],"Rename")) {
714 nb_rename(params[1], params[2]);
715 } else if (!strcmp(params[0],"Unlink")) {
716 nb_unlink(params[1]);
717 } else if (!strcmp(params[0],"Deltree")) {
718 nb_deltree(params[1]);
719 } else if (!strcmp(params[0],"Rmdir")) {
721 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
722 nb_qpathinfo(params[1]);
723 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
724 nb_qfileinfo(ival(params[1]));
725 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
726 nb_qfsinfo(ival(params[1]));
727 } else if (!strcmp(params[0],"FIND_FIRST")) {
728 nb_findfirst(params[1]);
729 } else if (!strcmp(params[0],"WriteX")) {
730 nb_writex(ival(params[1]),
731 ival(params[2]), ival(params[3]), ival(params[4]));
732 } else if (!strcmp(params[0],"ReadX")) {
733 nb_readx(ival(params[1]),
734 ival(params[2]), ival(params[3]), ival(params[4]));
735 } else if (!strcmp(params[0],"Flush")) {
736 nb_flush(ival(params[1]));
738 printf("Unknown operation %s\n", params[0]);
746 if (!torture_close_connection(&cli)) {
754 /* run a test that simulates an approximate netbench client load */
755 static BOOL run_nbench(int dummy)
764 signal(SIGALRM, nb_alarm);
766 t = create_procs(run_netbench, &correct);
769 printf("\nThroughput %g MB/sec\n",
770 1.0e-6 * nbio_total() / t);
776 This test checks for two things:
778 1) correct support for retaining locks over a close (ie. the server
779 must not use posix semantics)
780 2) support for lock timeouts
782 static BOOL run_locktest1(int dummy)
784 static struct cli_state cli1, cli2;
785 const char *fname = "\\lockt1.lck";
786 int fnum1, fnum2, fnum3;
788 unsigned lock_timeout;
790 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
793 cli_sockopt(&cli1, sockops);
794 cli_sockopt(&cli2, sockops);
796 printf("starting locktest1\n");
798 cli_unlink(&cli1, fname);
800 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
802 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
805 fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
807 printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
810 fnum3 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
812 printf("open3 of %s failed (%s)\n", fname, cli_errstr(&cli2));
816 if (!cli_lock(&cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
817 printf("lock1 failed (%s)\n", cli_errstr(&cli1));
822 if (cli_lock(&cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
823 printf("lock2 succeeded! This is a locking bug\n");
826 if (!check_error(__LINE__, &cli2, ERRDOS, ERRlock,
827 NT_STATUS_LOCK_NOT_GRANTED)) return False;
831 lock_timeout = (1 + (random() % 20));
832 printf("Testing lock timeout with timeout=%u\n", lock_timeout);
834 if (cli_lock(&cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {
835 printf("lock3 succeeded! This is a locking bug\n");
838 if (!check_error(__LINE__, &cli2, ERRDOS, ERRlock,
839 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
844 printf("error: This server appears not to support timed lock requests\n");
846 printf("server slept for %u seconds for a %u second timeout\n",
847 (unsigned int)(t2-t1), lock_timeout);
849 if (!cli_close(&cli1, fnum2)) {
850 printf("close1 failed (%s)\n", cli_errstr(&cli1));
854 if (cli_lock(&cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
855 printf("lock4 succeeded! This is a locking bug\n");
858 if (!check_error(__LINE__, &cli2, ERRDOS, ERRlock,
859 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
862 if (!cli_close(&cli1, fnum1)) {
863 printf("close2 failed (%s)\n", cli_errstr(&cli1));
867 if (!cli_close(&cli2, fnum3)) {
868 printf("close3 failed (%s)\n", cli_errstr(&cli2));
872 if (!cli_unlink(&cli1, fname)) {
873 printf("unlink failed (%s)\n", cli_errstr(&cli1));
878 if (!torture_close_connection(&cli1)) {
882 if (!torture_close_connection(&cli2)) {
886 printf("Passed locktest1\n");
891 checks for correct tconX support
893 static BOOL run_tcon_test(int dummy)
895 static struct cli_state cli1;
896 const char *fname = "\\tcontest.tmp";
901 if (!torture_open_connection(&cli1)) {
904 cli_sockopt(&cli1, sockops);
906 printf("starting tcontest\n");
908 cli_unlink(&cli1, fname);
910 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
913 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
919 if (cli_write(&cli1, fnum1, 0, buf, 130, 4) != 4)
921 printf("write failed (%s)", cli_errstr(&cli1));
925 if (!cli_send_tconX(&cli1, share, "?????",
926 password, strlen(password)+1)) {
927 printf("%s refused 2nd tree connect (%s)\n", host,
933 if (cli_write(&cli1, fnum1, 0, buf, 130, 4) == 4)
935 printf("write succeeded (%s)", cli_errstr(&cli1));
939 if (cli_close(&cli1, fnum1)) {
940 printf("close2 succeeded (%s)\n", cli_errstr(&cli1));
944 if (!cli_tdis(&cli1)) {
945 printf("tdis failed (%s)\n", cli_errstr(&cli1));
951 if (!cli_close(&cli1, fnum1)) {
952 printf("close2 failed (%s)\n", cli_errstr(&cli1));
956 if (!torture_close_connection(&cli1)) {
960 printf("Passed tcontest\n");
964 static BOOL tcon_devtest(struct cli_state *cli,
965 const char *myshare, const char *devtype,
966 NTSTATUS expected_error)
971 status = cli_send_tconX(cli, myshare, devtype,
972 password, strlen(password)+1);
974 if (NT_STATUS_IS_OK(expected_error)) {
978 printf("tconX to share %s with type %s "
979 "should have succeeded but failed\n",
986 printf("tconx to share %s with type %s "
987 "should have failed but succeeded\n",
991 if (NT_STATUS_EQUAL(cli_nt_error(cli),
995 printf("Returned unexpected error\n");
1004 checks for correct tconX support
1006 static BOOL run_tcon_devtype_test(int dummy)
1008 static struct cli_state *cli1 = NULL;
1014 status = cli_full_connection(&cli1, myname,
1015 host, NULL, port_to_use,
1017 username, workgroup,
1018 password, flags, &retry);
1020 if (!NT_STATUS_IS_OK(status)) {
1021 printf("could not open connection\n");
1025 if (!tcon_devtest(cli1, "IPC$", "A:", NT_STATUS_BAD_DEVICE_TYPE))
1028 if (!tcon_devtest(cli1, "IPC$", "?????", NT_STATUS_OK))
1031 if (!tcon_devtest(cli1, "IPC$", "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
1034 if (!tcon_devtest(cli1, "IPC$", "IPC", NT_STATUS_OK))
1037 if (!tcon_devtest(cli1, "IPC$", "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
1040 if (!tcon_devtest(cli1, share, "A:", NT_STATUS_OK))
1043 if (!tcon_devtest(cli1, share, "?????", NT_STATUS_OK))
1046 if (!tcon_devtest(cli1, share, "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
1049 if (!tcon_devtest(cli1, share, "IPC", NT_STATUS_BAD_DEVICE_TYPE))
1052 if (!tcon_devtest(cli1, share, "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
1058 printf("Passed tcondevtest\n");
1065 This test checks that
1067 1) the server supports multiple locking contexts on the one SMB
1068 connection, distinguished by PID.
1070 2) the server correctly fails overlapping locks made by the same PID (this
1071 goes against POSIX behaviour, which is why it is tricky to implement)
1073 3) the server denies unlock requests by an incorrect client PID
1075 static BOOL run_locktest2(int dummy)
1077 static struct cli_state cli;
1078 const char *fname = "\\lockt2.lck";
1079 int fnum1, fnum2, fnum3;
1080 BOOL correct = True;
1082 if (!torture_open_connection(&cli)) {
1086 cli_sockopt(&cli, sockops);
1088 printf("starting locktest2\n");
1090 cli_unlink(&cli, fname);
1092 cli_setpid(&cli, 1);
1094 fnum1 = cli_open(&cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1096 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli));
1100 fnum2 = cli_open(&cli, fname, O_RDWR, DENY_NONE);
1102 printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli));
1106 cli_setpid(&cli, 2);
1108 fnum3 = cli_open(&cli, fname, O_RDWR, DENY_NONE);
1110 printf("open3 of %s failed (%s)\n", fname, cli_errstr(&cli));
1114 cli_setpid(&cli, 1);
1116 if (!cli_lock(&cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1117 printf("lock1 failed (%s)\n", cli_errstr(&cli));
1121 if (cli_lock(&cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1122 printf("WRITE lock1 succeeded! This is a locking bug\n");
1125 if (!check_error(__LINE__, &cli, ERRDOS, ERRlock,
1126 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1129 if (cli_lock(&cli, fnum2, 0, 4, 0, WRITE_LOCK)) {
1130 printf("WRITE lock2 succeeded! This is a locking bug\n");
1133 if (!check_error(__LINE__, &cli, ERRDOS, ERRlock,
1134 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1137 if (cli_lock(&cli, fnum2, 0, 4, 0, READ_LOCK)) {
1138 printf("READ lock2 succeeded! This is a locking bug\n");
1141 if (!check_error(__LINE__, &cli, ERRDOS, ERRlock,
1142 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
1145 if (!cli_lock(&cli, fnum1, 100, 4, 0, WRITE_LOCK)) {
1146 printf("lock at 100 failed (%s)\n", cli_errstr(&cli));
1148 cli_setpid(&cli, 2);
1149 if (cli_unlock(&cli, fnum1, 100, 4)) {
1150 printf("unlock at 100 succeeded! This is a locking bug\n");
1154 if (cli_unlock(&cli, fnum1, 0, 4)) {
1155 printf("unlock1 succeeded! This is a locking bug\n");
1158 if (!check_error(__LINE__, &cli,
1160 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1163 if (cli_unlock(&cli, fnum1, 0, 8)) {
1164 printf("unlock2 succeeded! This is a locking bug\n");
1167 if (!check_error(__LINE__, &cli,
1169 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1172 if (cli_lock(&cli, fnum3, 0, 4, 0, WRITE_LOCK)) {
1173 printf("lock3 succeeded! This is a locking bug\n");
1176 if (!check_error(__LINE__, &cli, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
1179 cli_setpid(&cli, 1);
1181 if (!cli_close(&cli, fnum1)) {
1182 printf("close1 failed (%s)\n", cli_errstr(&cli));
1186 if (!cli_close(&cli, fnum2)) {
1187 printf("close2 failed (%s)\n", cli_errstr(&cli));
1191 if (!cli_close(&cli, fnum3)) {
1192 printf("close3 failed (%s)\n", cli_errstr(&cli));
1196 if (!torture_close_connection(&cli)) {
1200 printf("locktest2 finished\n");
1207 This test checks that
1209 1) the server supports the full offset range in lock requests
1211 static BOOL run_locktest3(int dummy)
1213 static struct cli_state cli1, cli2;
1214 const char *fname = "\\lockt3.lck";
1215 int fnum1, fnum2, i;
1217 BOOL correct = True;
1219 #define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
1221 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1224 cli_sockopt(&cli1, sockops);
1225 cli_sockopt(&cli2, sockops);
1227 printf("starting locktest3\n");
1229 cli_unlink(&cli1, fname);
1231 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1233 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
1236 fnum2 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
1238 printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
1242 for (offset=i=0;i<torture_numops;i++) {
1244 if (!cli_lock(&cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1245 printf("lock1 %d failed (%s)\n",
1251 if (!cli_lock(&cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1252 printf("lock2 %d failed (%s)\n",
1259 for (offset=i=0;i<torture_numops;i++) {
1262 if (cli_lock(&cli1, fnum1, offset-2, 1, 0, WRITE_LOCK)) {
1263 printf("error: lock1 %d succeeded!\n", i);
1267 if (cli_lock(&cli2, fnum2, offset-1, 1, 0, WRITE_LOCK)) {
1268 printf("error: lock2 %d succeeded!\n", i);
1272 if (cli_lock(&cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1273 printf("error: lock3 %d succeeded!\n", i);
1277 if (cli_lock(&cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1278 printf("error: lock4 %d succeeded!\n", i);
1283 for (offset=i=0;i<torture_numops;i++) {
1286 if (!cli_unlock(&cli1, fnum1, offset-1, 1)) {
1287 printf("unlock1 %d failed (%s)\n",
1293 if (!cli_unlock(&cli2, fnum2, offset-2, 1)) {
1294 printf("unlock2 %d failed (%s)\n",
1301 if (!cli_close(&cli1, fnum1)) {
1302 printf("close1 failed (%s)\n", cli_errstr(&cli1));
1306 if (!cli_close(&cli2, fnum2)) {
1307 printf("close2 failed (%s)\n", cli_errstr(&cli2));
1311 if (!cli_unlink(&cli1, fname)) {
1312 printf("unlink failed (%s)\n", cli_errstr(&cli1));
1316 if (!torture_close_connection(&cli1)) {
1320 if (!torture_close_connection(&cli2)) {
1324 printf("finished locktest3\n");
1329 #define EXPECTED(ret, v) if ((ret) != (v)) { \
1330 printf("** "); correct = False; \
1334 looks at overlapping locks
1336 static BOOL run_locktest4(int dummy)
1338 static struct cli_state cli1, cli2;
1339 const char *fname = "\\lockt4.lck";
1340 int fnum1, fnum2, f;
1343 BOOL correct = True;
1345 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1349 cli_sockopt(&cli1, sockops);
1350 cli_sockopt(&cli2, sockops);
1352 printf("starting locktest4\n");
1354 cli_unlink(&cli1, fname);
1356 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1357 fnum2 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
1359 memset(buf, 0, sizeof(buf));
1361 if (cli_write(&cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1362 printf("Failed to create file\n");
1367 ret = cli_lock(&cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1368 cli_lock(&cli1, fnum1, 2, 4, 0, WRITE_LOCK);
1369 EXPECTED(ret, False);
1370 printf("the same process %s set overlapping write locks\n", ret?"can":"cannot");
1372 ret = cli_lock(&cli1, fnum1, 10, 4, 0, READ_LOCK) &&
1373 cli_lock(&cli1, fnum1, 12, 4, 0, READ_LOCK);
1374 EXPECTED(ret, True);
1375 printf("the same process %s set overlapping read locks\n", ret?"can":"cannot");
1377 ret = cli_lock(&cli1, fnum1, 20, 4, 0, WRITE_LOCK) &&
1378 cli_lock(&cli2, fnum2, 22, 4, 0, WRITE_LOCK);
1379 EXPECTED(ret, False);
1380 printf("a different connection %s set overlapping write locks\n", ret?"can":"cannot");
1382 ret = cli_lock(&cli1, fnum1, 30, 4, 0, READ_LOCK) &&
1383 cli_lock(&cli2, fnum2, 32, 4, 0, READ_LOCK);
1384 EXPECTED(ret, True);
1385 printf("a different connection %s set overlapping read locks\n", ret?"can":"cannot");
1387 ret = (cli_setpid(&cli1, 1), cli_lock(&cli1, fnum1, 40, 4, 0, WRITE_LOCK)) &&
1388 (cli_setpid(&cli1, 2), cli_lock(&cli1, fnum1, 42, 4, 0, WRITE_LOCK));
1389 EXPECTED(ret, False);
1390 printf("a different pid %s set overlapping write locks\n", ret?"can":"cannot");
1392 ret = (cli_setpid(&cli1, 1), cli_lock(&cli1, fnum1, 50, 4, 0, READ_LOCK)) &&
1393 (cli_setpid(&cli1, 2), cli_lock(&cli1, fnum1, 52, 4, 0, READ_LOCK));
1394 EXPECTED(ret, True);
1395 printf("a different pid %s set overlapping read locks\n", ret?"can":"cannot");
1397 ret = cli_lock(&cli1, fnum1, 60, 4, 0, READ_LOCK) &&
1398 cli_lock(&cli1, fnum1, 60, 4, 0, READ_LOCK);
1399 EXPECTED(ret, True);
1400 printf("the same process %s set the same read lock twice\n", ret?"can":"cannot");
1402 ret = cli_lock(&cli1, fnum1, 70, 4, 0, WRITE_LOCK) &&
1403 cli_lock(&cli1, fnum1, 70, 4, 0, WRITE_LOCK);
1404 EXPECTED(ret, False);
1405 printf("the same process %s set the same write lock twice\n", ret?"can":"cannot");
1407 ret = cli_lock(&cli1, fnum1, 80, 4, 0, READ_LOCK) &&
1408 cli_lock(&cli1, fnum1, 80, 4, 0, WRITE_LOCK);
1409 EXPECTED(ret, False);
1410 printf("the same process %s overlay a read lock with a write lock\n", ret?"can":"cannot");
1412 ret = cli_lock(&cli1, fnum1, 90, 4, 0, WRITE_LOCK) &&
1413 cli_lock(&cli1, fnum1, 90, 4, 0, READ_LOCK);
1414 EXPECTED(ret, True);
1415 printf("the same process %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1417 ret = (cli_setpid(&cli1, 1), cli_lock(&cli1, fnum1, 100, 4, 0, WRITE_LOCK)) &&
1418 (cli_setpid(&cli1, 2), cli_lock(&cli1, fnum1, 100, 4, 0, READ_LOCK));
1419 EXPECTED(ret, False);
1420 printf("a different pid %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1422 ret = cli_lock(&cli1, fnum1, 110, 4, 0, READ_LOCK) &&
1423 cli_lock(&cli1, fnum1, 112, 4, 0, READ_LOCK) &&
1424 cli_unlock(&cli1, fnum1, 110, 6);
1425 EXPECTED(ret, False);
1426 printf("the same process %s coalesce read locks\n", ret?"can":"cannot");
1429 ret = cli_lock(&cli1, fnum1, 120, 4, 0, WRITE_LOCK) &&
1430 (cli_read(&cli2, fnum2, buf, 120, 4) == 4);
1431 EXPECTED(ret, False);
1432 printf("this server %s strict write locking\n", ret?"doesn't do":"does");
1434 ret = cli_lock(&cli1, fnum1, 130, 4, 0, READ_LOCK) &&
1435 (cli_write(&cli2, fnum2, 0, buf, 130, 4) == 4);
1436 EXPECTED(ret, False);
1437 printf("this server %s strict read locking\n", ret?"doesn't do":"does");
1440 ret = cli_lock(&cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1441 cli_lock(&cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1442 cli_unlock(&cli1, fnum1, 140, 4) &&
1443 cli_unlock(&cli1, fnum1, 140, 4);
1444 EXPECTED(ret, True);
1445 printf("this server %s do recursive read locking\n", ret?"does":"doesn't");
1448 ret = cli_lock(&cli1, fnum1, 150, 4, 0, WRITE_LOCK) &&
1449 cli_lock(&cli1, fnum1, 150, 4, 0, READ_LOCK) &&
1450 cli_unlock(&cli1, fnum1, 150, 4) &&
1451 (cli_read(&cli2, fnum2, buf, 150, 4) == 4) &&
1452 !(cli_write(&cli2, fnum2, 0, buf, 150, 4) == 4) &&
1453 cli_unlock(&cli1, fnum1, 150, 4);
1454 EXPECTED(ret, True);
1455 printf("this server %s do recursive lock overlays\n", ret?"does":"doesn't");
1457 ret = cli_lock(&cli1, fnum1, 160, 4, 0, READ_LOCK) &&
1458 cli_unlock(&cli1, fnum1, 160, 4) &&
1459 (cli_write(&cli2, fnum2, 0, buf, 160, 4) == 4) &&
1460 (cli_read(&cli2, fnum2, buf, 160, 4) == 4);
1461 EXPECTED(ret, True);
1462 printf("the same process %s remove a read lock using write locking\n", ret?"can":"cannot");
1464 ret = cli_lock(&cli1, fnum1, 170, 4, 0, WRITE_LOCK) &&
1465 cli_unlock(&cli1, fnum1, 170, 4) &&
1466 (cli_write(&cli2, fnum2, 0, buf, 170, 4) == 4) &&
1467 (cli_read(&cli2, fnum2, buf, 170, 4) == 4);
1468 EXPECTED(ret, True);
1469 printf("the same process %s remove a write lock using read locking\n", ret?"can":"cannot");
1471 ret = cli_lock(&cli1, fnum1, 190, 4, 0, WRITE_LOCK) &&
1472 cli_lock(&cli1, fnum1, 190, 4, 0, READ_LOCK) &&
1473 cli_unlock(&cli1, fnum1, 190, 4) &&
1474 !(cli_write(&cli2, fnum2, 0, buf, 190, 4) == 4) &&
1475 (cli_read(&cli2, fnum2, buf, 190, 4) == 4);
1476 EXPECTED(ret, True);
1477 printf("the same process %s remove the first lock first\n", ret?"does":"doesn't");
1479 cli_close(&cli1, fnum1);
1480 cli_close(&cli2, fnum2);
1481 fnum1 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
1482 f = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
1483 ret = cli_lock(&cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1484 cli_lock(&cli1, f, 0, 1, 0, READ_LOCK) &&
1485 cli_close(&cli1, fnum1) &&
1486 ((fnum1 = cli_open(&cli1, fname, O_RDWR, DENY_NONE)) != -1) &&
1487 cli_lock(&cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1488 cli_close(&cli1, f);
1489 cli_close(&cli1, fnum1);
1490 EXPECTED(ret, True);
1491 printf("the server %s have the NT byte range lock bug\n", !ret?"does":"doesn't");
1494 cli_close(&cli1, fnum1);
1495 cli_close(&cli2, fnum2);
1496 cli_unlink(&cli1, fname);
1497 torture_close_connection(&cli1);
1498 torture_close_connection(&cli2);
1500 printf("finished locktest4\n");
1505 looks at lock upgrade/downgrade.
1507 static BOOL run_locktest5(int dummy)
1509 static struct cli_state cli1, cli2;
1510 const char *fname = "\\lockt5.lck";
1511 int fnum1, fnum2, fnum3;
1514 BOOL correct = True;
1516 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1520 cli_sockopt(&cli1, sockops);
1521 cli_sockopt(&cli2, sockops);
1523 printf("starting locktest5\n");
1525 cli_unlink(&cli1, fname);
1527 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1528 fnum2 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
1529 fnum3 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
1531 memset(buf, 0, sizeof(buf));
1533 if (cli_write(&cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1534 printf("Failed to create file\n");
1539 /* Check for NT bug... */
1540 ret = cli_lock(&cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1541 cli_lock(&cli1, fnum3, 0, 1, 0, READ_LOCK);
1542 cli_close(&cli1, fnum1);
1543 fnum1 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
1544 ret = cli_lock(&cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1545 EXPECTED(ret, True);
1546 printf("this server %s the NT locking bug\n", ret ? "doesn't have" : "has");
1547 cli_close(&cli1, fnum1);
1548 fnum1 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
1549 cli_unlock(&cli1, fnum3, 0, 1);
1551 ret = cli_lock(&cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1552 cli_lock(&cli1, fnum1, 1, 1, 0, READ_LOCK);
1553 EXPECTED(ret, True);
1554 printf("the same process %s overlay a write with a read lock\n", ret?"can":"cannot");
1556 ret = cli_lock(&cli2, fnum2, 0, 4, 0, READ_LOCK);
1557 EXPECTED(ret, False);
1559 printf("a different processs %s get a read lock on the first process lock stack\n", ret?"can":"cannot");
1561 /* Unlock the process 2 lock. */
1562 cli_unlock(&cli2, fnum2, 0, 4);
1564 ret = cli_lock(&cli1, fnum3, 0, 4, 0, READ_LOCK);
1565 EXPECTED(ret, False);
1567 printf("the same processs on a different fnum %s get a read lock\n", ret?"can":"cannot");
1569 /* Unlock the process 1 fnum3 lock. */
1570 cli_unlock(&cli1, fnum3, 0, 4);
1572 /* Stack 2 more locks here. */
1573 ret = cli_lock(&cli1, fnum1, 0, 4, 0, READ_LOCK) &&
1574 cli_lock(&cli1, fnum1, 0, 4, 0, READ_LOCK);
1576 EXPECTED(ret, True);
1577 printf("the same process %s stack read locks\n", ret?"can":"cannot");
1579 /* Unlock the first process lock, then check this was the WRITE lock that was
1582 ret = cli_unlock(&cli1, fnum1, 0, 4) &&
1583 cli_lock(&cli2, fnum2, 0, 4, 0, READ_LOCK);
1585 EXPECTED(ret, True);
1586 printf("the first unlock removes the %s lock\n", ret?"WRITE":"READ");
1588 /* Unlock the process 2 lock. */
1589 cli_unlock(&cli2, fnum2, 0, 4);
1591 /* We should have 3 stacked locks here. Ensure we need to do 3 unlocks. */
1593 ret = cli_unlock(&cli1, fnum1, 1, 1) &&
1594 cli_unlock(&cli1, fnum1, 0, 4) &&
1595 cli_unlock(&cli1, fnum1, 0, 4);
1597 EXPECTED(ret, True);
1598 printf("the same process %s unlock the stack of 4 locks\n", ret?"can":"cannot");
1600 /* Ensure the next unlock fails. */
1601 ret = cli_unlock(&cli1, fnum1, 0, 4);
1602 EXPECTED(ret, False);
1603 printf("the same process %s count the lock stack\n", !ret?"can":"cannot");
1605 /* Ensure connection 2 can get a write lock. */
1606 ret = cli_lock(&cli2, fnum2, 0, 4, 0, WRITE_LOCK);
1607 EXPECTED(ret, True);
1609 printf("a different processs %s get a write lock on the unlocked stack\n", ret?"can":"cannot");
1613 cli_close(&cli1, fnum1);
1614 cli_close(&cli2, fnum2);
1615 cli_unlink(&cli1, fname);
1616 if (!torture_close_connection(&cli1)) {
1619 if (!torture_close_connection(&cli2)) {
1623 printf("finished locktest5\n");
1629 tries the unusual lockingX locktype bits
1631 static BOOL run_locktest6(int dummy)
1633 static struct cli_state cli;
1634 const char *fname[1] = { "\\lock6.txt" };
1639 if (!torture_open_connection(&cli)) {
1643 cli_sockopt(&cli, sockops);
1645 printf("starting locktest6\n");
1648 printf("Testing %s\n", fname[i]);
1650 cli_unlink(&cli, fname[i]);
1652 fnum = cli_open(&cli, fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1653 status = cli_locktype(&cli, fnum, 0, 8, 0, LOCKING_ANDX_CHANGE_LOCKTYPE);
1654 cli_close(&cli, fnum);
1655 printf("CHANGE_LOCKTYPE gave %s\n", nt_errstr(status));
1657 fnum = cli_open(&cli, fname[i], O_RDWR, DENY_NONE);
1658 status = cli_locktype(&cli, fnum, 0, 8, 0, LOCKING_ANDX_CANCEL_LOCK);
1659 cli_close(&cli, fnum);
1660 printf("CANCEL_LOCK gave %s\n", nt_errstr(status));
1662 cli_unlink(&cli, fname[i]);
1665 torture_close_connection(&cli);
1667 printf("finished locktest6\n");
1672 test whether fnums and tids open on one VC are available on another (a major
1675 static BOOL run_fdpasstest(int dummy)
1677 static struct cli_state cli1, cli2, cli3;
1678 const char *fname = "\\fdpass.tst";
1682 if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
1685 cli_sockopt(&cli1, sockops);
1686 cli_sockopt(&cli2, sockops);
1688 printf("starting fdpasstest\n");
1690 cli_unlink(&cli1, fname);
1692 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1694 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
1698 if (cli_write(&cli1, fnum1, 0, "hello world\n", 0, 13) != 13) {
1699 printf("write failed (%s)\n", cli_errstr(&cli1));
1704 cli3.vuid = cli1.vuid;
1705 cli3.cnum = cli1.cnum;
1706 cli3.pid = cli1.pid;
1708 if (cli_read(&cli3, fnum1, buf, 0, 13) == 13) {
1709 printf("read succeeded! nasty security hole [%s]\n",
1714 cli_close(&cli1, fnum1);
1715 cli_unlink(&cli1, fname);
1717 torture_close_connection(&cli1);
1718 torture_close_connection(&cli2);
1720 printf("finished fdpasstest\n");
1726 This test checks that
1728 1) the server does not allow an unlink on a file that is open
1730 static BOOL run_unlinktest(int dummy)
1732 static struct cli_state cli;
1733 const char *fname = "\\unlink.tst";
1735 BOOL correct = True;
1737 if (!torture_open_connection(&cli)) {
1741 cli_sockopt(&cli, sockops);
1743 printf("starting unlink test\n");
1745 cli_unlink(&cli, fname);
1747 cli_setpid(&cli, 1);
1749 fnum = cli_open(&cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
1751 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli));
1755 if (cli_unlink(&cli, fname)) {
1756 printf("error: server allowed unlink on an open file\n");
1759 correct = check_error(__LINE__, &cli, ERRDOS, ERRbadshare,
1760 NT_STATUS_SHARING_VIOLATION);
1763 cli_close(&cli, fnum);
1764 cli_unlink(&cli, fname);
1766 if (!torture_close_connection(&cli)) {
1770 printf("unlink test finished\n");
1777 test how many open files this server supports on the one socket
1779 static BOOL run_maxfidtest(int dummy)
1781 static struct cli_state cli;
1782 const char *template = "\\maxfid.%d.%d";
1784 int fnums[0x11000], i;
1786 BOOL correct = True;
1791 printf("failed to connect\n");
1795 cli_sockopt(&cli, sockops);
1797 for (i=0; i<0x11000; i++) {
1798 slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
1799 if ((fnums[i] = cli_open(&cli, fname,
1800 O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) ==
1802 printf("open of %s failed (%s)\n",
1803 fname, cli_errstr(&cli));
1804 printf("maximum fnum is %d\n", i);
1812 printf("cleaning up\n");
1814 slprintf(fname,sizeof(fname)-1,template, i,(int)getpid());
1815 cli_close(&cli, fnums[i]);
1816 if (!cli_unlink(&cli, fname)) {
1817 printf("unlink of %s failed (%s)\n",
1818 fname, cli_errstr(&cli));
1825 printf("maxfid test finished\n");
1826 if (!torture_close_connection(&cli)) {
1832 /* generate a random buffer */
1833 static void rand_buf(char *buf, int len)
1836 *buf = (char)sys_random();
1841 /* send smb negprot commands, not reading the response */
1842 static BOOL run_negprot_nowait(int dummy)
1845 static struct cli_state cli;
1846 BOOL correct = True;
1848 printf("starting negprot nowait test\n");
1850 if (!open_nbt_connection(&cli)) {
1854 for (i=0;i<50000;i++) {
1855 cli_negprot_send(&cli);
1858 if (!torture_close_connection(&cli)) {
1862 printf("finished negprot nowait test\n");
1868 /* send random IPC commands */
1869 static BOOL run_randomipc(int dummy)
1871 char *rparam = NULL;
1875 int api, param_len, i;
1876 static struct cli_state cli;
1877 BOOL correct = True;
1880 printf("starting random ipc test\n");
1882 if (!torture_open_connection(&cli)) {
1886 for (i=0;i<count;i++) {
1887 api = sys_random() % 500;
1888 param_len = (sys_random() % 64);
1890 rand_buf(param, param_len);
1895 param, param_len, 8,
1896 NULL, 0, BUFFER_SIZE,
1900 printf("%d/%d\r", i,count);
1903 printf("%d/%d\n", i, count);
1905 if (!torture_close_connection(&cli)) {
1909 printf("finished random ipc test\n");
1916 static void browse_callback(const char *sname, uint32 stype,
1917 const char *comment, void *state)
1919 printf("\t%20.20s %08x %s\n", sname, stype, comment);
1925 This test checks the browse list code
1928 static BOOL run_browsetest(int dummy)
1930 static struct cli_state cli;
1931 BOOL correct = True;
1933 printf("starting browse test\n");
1935 if (!torture_open_connection(&cli)) {
1939 printf("domain list:\n");
1940 cli_NetServerEnum(&cli, cli.server_domain,
1941 SV_TYPE_DOMAIN_ENUM,
1942 browse_callback, NULL);
1944 printf("machine list:\n");
1945 cli_NetServerEnum(&cli, cli.server_domain,
1947 browse_callback, NULL);
1949 if (!torture_close_connection(&cli)) {
1953 printf("browse test finished\n");
1961 This checks how the getatr calls works
1963 static BOOL run_attrtest(int dummy)
1965 static struct cli_state cli;
1968 const char *fname = "\\attrib.tst";
1969 BOOL correct = True;
1971 printf("starting attrib test\n");
1973 if (!torture_open_connection(&cli)) {
1977 cli_unlink(&cli, fname);
1978 fnum = cli_open(&cli, fname,
1979 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
1980 cli_close(&cli, fnum);
1981 if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
1982 printf("getatr failed (%s)\n", cli_errstr(&cli));
1986 if (abs(t - time(NULL)) > 60*60*24*10) {
1987 printf("ERROR: SMBgetatr bug. time is %s",
1993 t2 = t-60*60*24; /* 1 day ago */
1995 if (!cli_setatr(&cli, fname, 0, t2)) {
1996 printf("setatr failed (%s)\n", cli_errstr(&cli));
2000 if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
2001 printf("getatr failed (%s)\n", cli_errstr(&cli));
2006 printf("ERROR: getatr/setatr bug. times are\n%s",
2008 printf("%s", ctime(&t2));
2012 cli_unlink(&cli, fname);
2014 if (!torture_close_connection(&cli)) {
2018 printf("attrib test finished\n");
2025 This checks a couple of trans2 calls
2027 static BOOL run_trans2test(int dummy)
2029 static struct cli_state cli;
2032 time_t c_time, a_time, m_time, w_time, m_time2;
2033 const char *fname = "\\trans2.tst";
2034 const char *dname = "\\trans2";
2035 const char *fname2 = "\\trans2\\trans2.tst";
2037 BOOL correct = True;
2039 printf("starting trans2 test\n");
2041 if (!torture_open_connection(&cli)) {
2045 cli_unlink(&cli, fname);
2046 fnum = cli_open(&cli, fname,
2047 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2048 if (!cli_qfileinfo(&cli, fnum, NULL, &size, &c_time, &a_time, &m_time,
2050 printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(&cli));
2054 if (!cli_qfilename(&cli, fnum, pname)) {
2055 printf("ERROR: qfilename failed (%s)\n", cli_errstr(&cli));
2059 if (strcmp(pname, fname)) {
2060 printf("qfilename gave different name? [%s] [%s]\n",
2065 cli_close(&cli, fnum);
2069 cli_unlink(&cli, fname);
2070 fnum = cli_open(&cli, fname,
2071 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2073 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli));
2076 cli_close(&cli, fnum);
2078 if (!cli_qpathinfo(&cli, fname, &c_time, &a_time, &m_time, &size, NULL)) {
2079 printf("ERROR: qpathinfo failed (%s)\n", cli_errstr(&cli));
2082 if (c_time != m_time) {
2083 printf("create time=%s", ctime(&c_time));
2084 printf("modify time=%s", ctime(&m_time));
2085 printf("This system appears to have sticky create times\n");
2088 if (a_time % (60*60) == 0) {
2089 printf("access time=%s", ctime(&a_time));
2090 printf("This system appears to set a midnight access time\n");
2094 if (abs(m_time - time(NULL)) > 60*60*24*7) {
2095 printf("ERROR: totally incorrect times - maybe word reversed? mtime=%s", ctime(&m_time));
2101 cli_unlink(&cli, fname);
2102 fnum = cli_open(&cli, fname,
2103 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2104 cli_close(&cli, fnum);
2105 if (!cli_qpathinfo2(&cli, fname, &c_time, &a_time, &m_time,
2106 &w_time, &size, NULL, NULL)) {
2107 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
2110 if (w_time < 60*60*24*2) {
2111 printf("write time=%s", ctime(&w_time));
2112 printf("This system appears to set a initial 0 write time\n");
2117 cli_unlink(&cli, fname);
2120 /* check if the server updates the directory modification time
2121 when creating a new file */
2122 if (!cli_mkdir(&cli, dname)) {
2123 printf("ERROR: mkdir failed (%s)\n", cli_errstr(&cli));
2127 if (!cli_qpathinfo2(&cli, "\\trans2\\", &c_time, &a_time, &m_time,
2128 &w_time, &size, NULL, NULL)) {
2129 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
2133 fnum = cli_open(&cli, fname2,
2134 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
2135 cli_write(&cli, fnum, 0, (char *)&fnum, 0, sizeof(fnum));
2136 cli_close(&cli, fnum);
2137 if (!cli_qpathinfo2(&cli, "\\trans2\\", &c_time, &a_time, &m_time2,
2138 &w_time, &size, NULL, NULL)) {
2139 printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
2142 if (m_time2 == m_time) {
2143 printf("This system does not update directory modification times\n");
2147 cli_unlink(&cli, fname2);
2148 cli_rmdir(&cli, dname);
2150 if (!torture_close_connection(&cli)) {
2154 printf("trans2 test finished\n");
2160 This checks new W2K calls.
2163 static BOOL new_trans(struct cli_state *pcli, int fnum, int level)
2166 BOOL correct = True;
2168 memset(buf, 0xff, sizeof(buf));
2170 if (!cli_qfileinfo_test(pcli, fnum, level, buf)) {
2171 printf("ERROR: qfileinfo (%d) failed (%s)\n", level, cli_errstr(pcli));
2174 printf("qfileinfo: level %d\n", level);
2175 dump_data(0, buf, 256);
2181 static BOOL run_w2ktest(int dummy)
2183 static struct cli_state cli;
2185 const char *fname = "\\w2ktest\\w2k.tst";
2187 BOOL correct = True;
2189 printf("starting w2k test\n");
2191 if (!torture_open_connection(&cli)) {
2195 fnum = cli_open(&cli, fname,
2196 O_RDWR | O_CREAT , DENY_NONE);
2198 for (level = 1004; level < 1040; level++) {
2199 new_trans(&cli, fnum, level);
2202 cli_close(&cli, fnum);
2204 if (!torture_close_connection(&cli)) {
2208 printf("w2k test finished\n");
2215 this is a harness for some oplock tests
2217 static BOOL run_oplock1(int dummy)
2219 static struct cli_state cli1;
2220 const char *fname = "\\lockt1.lck";
2222 BOOL correct = True;
2224 printf("starting oplock test 1\n");
2226 if (!torture_open_connection(&cli1)) {
2230 cli_unlink(&cli1, fname);
2232 cli_sockopt(&cli1, sockops);
2234 cli1.use_oplocks = True;
2236 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2238 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2242 cli1.use_oplocks = False;
2244 cli_unlink(&cli1, fname);
2245 cli_unlink(&cli1, fname);
2247 if (!cli_close(&cli1, fnum1)) {
2248 printf("close2 failed (%s)\n", cli_errstr(&cli1));
2252 if (!cli_unlink(&cli1, fname)) {
2253 printf("unlink failed (%s)\n", cli_errstr(&cli1));
2257 if (!torture_close_connection(&cli1)) {
2261 printf("finished oplock test 1\n");
2266 static BOOL run_oplock2(int dummy)
2268 static struct cli_state cli1, cli2;
2269 const char *fname = "\\lockt2.lck";
2271 int saved_use_oplocks = use_oplocks;
2273 BOOL correct = True;
2274 volatile BOOL *shared_correct;
2276 shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
2277 *shared_correct = True;
2279 use_level_II_oplocks = True;
2282 printf("starting oplock test 2\n");
2284 if (!torture_open_connection(&cli1)) {
2285 use_level_II_oplocks = False;
2286 use_oplocks = saved_use_oplocks;
2290 cli1.use_oplocks = True;
2291 cli1.use_level_II_oplocks = True;
2293 if (!torture_open_connection(&cli2)) {
2294 use_level_II_oplocks = False;
2295 use_oplocks = saved_use_oplocks;
2299 cli2.use_oplocks = True;
2300 cli2.use_level_II_oplocks = True;
2302 cli_unlink(&cli1, fname);
2304 cli_sockopt(&cli1, sockops);
2305 cli_sockopt(&cli2, sockops);
2307 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
2309 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2313 /* Don't need the globals any more. */
2314 use_level_II_oplocks = False;
2315 use_oplocks = saved_use_oplocks;
2319 fnum2 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
2321 printf("second open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2322 *shared_correct = False;
2328 if (!cli_close(&cli2, fnum2)) {
2329 printf("close2 failed (%s)\n", cli_errstr(&cli1));
2330 *shared_correct = False;
2338 /* Ensure cli1 processes the break. */
2340 if (cli_read(&cli1, fnum1, buf, 0, 4) != 4) {
2341 printf("read on fnum1 failed (%s)\n", cli_errstr(&cli1));
2345 /* Should now be at level II. */
2346 /* Test if sending a write locks causes a break to none. */
2348 if (!cli_lock(&cli1, fnum1, 0, 4, 0, READ_LOCK)) {
2349 printf("lock failed (%s)\n", cli_errstr(&cli1));
2353 cli_unlock(&cli1, fnum1, 0, 4);
2357 if (!cli_lock(&cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
2358 printf("lock failed (%s)\n", cli_errstr(&cli1));
2362 cli_unlock(&cli1, fnum1, 0, 4);
2366 cli_read(&cli1, fnum1, buf, 0, 4);
2369 if (cli_write(&cli1, fnum1, 0, buf, 0, 4) != 4) {
2370 printf("write on fnum1 failed (%s)\n", cli_errstr(&cli1));
2375 if (!cli_close(&cli1, fnum1)) {
2376 printf("close1 failed (%s)\n", cli_errstr(&cli1));
2382 if (!cli_unlink(&cli1, fname)) {
2383 printf("unlink failed (%s)\n", cli_errstr(&cli1));
2387 if (!torture_close_connection(&cli1)) {
2391 if (!*shared_correct) {
2395 printf("finished oplock test 2\n");
2400 /* handler for oplock 3 tests */
2401 static BOOL oplock3_handler(struct cli_state *cli, int fnum, unsigned char level)
2403 printf("got oplock break fnum=%d level=%d\n",
2405 return cli_oplock_ack(cli, fnum, level);
2408 static BOOL run_oplock3(int dummy)
2410 static struct cli_state cli;
2411 const char *fname = "\\oplockt3.dat";
2413 char buf[4] = "abcd";
2414 BOOL correct = True;
2415 volatile BOOL *shared_correct;
2417 shared_correct = (volatile BOOL *)shm_setup(sizeof(BOOL));
2418 *shared_correct = True;
2420 printf("starting oplock test 3\n");
2425 use_level_II_oplocks = True;
2426 if (!torture_open_connection(&cli)) {
2427 *shared_correct = False;
2431 /* try to trigger a oplock break in parent */
2432 fnum = cli_open(&cli, fname, O_RDWR, DENY_NONE);
2433 cli_write(&cli, fnum, 0, buf, 0, 4);
2439 use_level_II_oplocks = True;
2440 if (!torture_open_connection(&cli)) {
2443 cli_oplock_handler(&cli, oplock3_handler);
2444 fnum = cli_open(&cli, fname, O_RDWR|O_CREAT, DENY_NONE);
2445 cli_write(&cli, fnum, 0, buf, 0, 4);
2446 cli_close(&cli, fnum);
2447 fnum = cli_open(&cli, fname, O_RDWR, DENY_NONE);
2448 cli.timeout = 20000;
2449 cli_receive_smb(&cli);
2450 printf("finished oplock test 3\n");
2452 return (correct && *shared_correct);
2454 /* What are we looking for here? What's sucess and what's FAILURE? */
2460 Test delete on close semantics.
2462 static BOOL run_deletetest(int dummy)
2464 static struct cli_state cli1;
2465 static struct cli_state cli2;
2466 const char *fname = "\\delete.file";
2469 BOOL correct = True;
2471 printf("starting delete test\n");
2476 if (!torture_open_connection(&cli1)) {
2480 cli_sockopt(&cli1, sockops);
2482 /* Test 1 - this should *NOT* delete the file on close. */
2484 cli_setatr(&cli1, fname, 0, 0);
2485 cli_unlink(&cli1, fname);
2487 fnum1 = cli_nt_create_full(&cli1, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
2488 FILE_SHARE_DELETE, FILE_OVERWRITE_IF,
2489 DELETE_ON_CLOSE_FLAG);
2492 printf("[1] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2497 if (!cli_close(&cli1, fnum1)) {
2498 printf("[1] close failed (%s)\n", cli_errstr(&cli1));
2503 fnum1 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
2505 printf("[1] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2510 if (!cli_close(&cli1, fnum1)) {
2511 printf("[1] close failed (%s)\n", cli_errstr(&cli1));
2516 printf("first delete on close test succeeded.\n");
2518 /* Test 2 - this should delete the file on close. */
2520 cli_setatr(&cli1, fname, 0, 0);
2521 cli_unlink(&cli1, fname);
2523 fnum1 = cli_nt_create_full(&cli1, fname, GENERIC_ALL_ACCESS,
2524 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE,
2525 FILE_OVERWRITE_IF, 0);
2528 printf("[2] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2533 if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
2534 printf("[2] setting delete_on_close failed (%s)\n", cli_errstr(&cli1));
2539 if (!cli_close(&cli1, fnum1)) {
2540 printf("[2] close failed (%s)\n", cli_errstr(&cli1));
2545 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
2547 printf("[2] open of %s succeeded should have been deleted on close !\n", fname);
2548 if (!cli_close(&cli1, fnum1)) {
2549 printf("[2] close failed (%s)\n", cli_errstr(&cli1));
2553 cli_unlink(&cli1, fname);
2555 printf("second delete on close test succeeded.\n");
2558 cli_setatr(&cli1, fname, 0, 0);
2559 cli_unlink(&cli1, fname);
2561 fnum1 = cli_nt_create_full(&cli1, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
2562 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
2565 printf("[3] open - 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
2570 /* This should fail with a sharing violation - open for delete is only compatible
2571 with SHARE_DELETE. */
2573 fnum2 = cli_nt_create_full(&cli1, fname, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
2574 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0);
2577 printf("[3] open - 2 of %s succeeded - should have failed.\n", fname);
2582 /* This should succeed. */
2584 fnum2 = cli_nt_create_full(&cli1, fname, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
2585 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
2588 printf("[3] open - 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
2593 if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
2594 printf("[3] setting delete_on_close failed (%s)\n", cli_errstr(&cli1));
2599 if (!cli_close(&cli1, fnum1)) {
2600 printf("[3] close 1 failed (%s)\n", cli_errstr(&cli1));
2605 if (!cli_close(&cli1, fnum2)) {
2606 printf("[3] close 2 failed (%s)\n", cli_errstr(&cli1));
2611 /* This should fail - file should no longer be there. */
2613 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
2615 printf("[3] open of %s succeeded should have been deleted on close !\n", fname);
2616 if (!cli_close(&cli1, fnum1)) {
2617 printf("[3] close failed (%s)\n", cli_errstr(&cli1));
2619 cli_unlink(&cli1, fname);
2623 printf("third delete on close test succeeded.\n");
2626 cli_setatr(&cli1, fname, 0, 0);
2627 cli_unlink(&cli1, fname);
2629 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2630 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
2633 printf("[4] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2638 /* This should succeed. */
2639 fnum2 = cli_nt_create_full(&cli1, fname, GENERIC_READ_ACCESS,
2640 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
2642 printf("[4] open - 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
2647 if (!cli_close(&cli1, fnum2)) {
2648 printf("[4] close - 1 failed (%s)\n", cli_errstr(&cli1));
2653 if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
2654 printf("[4] setting delete_on_close failed (%s)\n", cli_errstr(&cli1));
2659 /* This should fail - no more opens once delete on close set. */
2660 fnum2 = cli_nt_create_full(&cli1, fname, GENERIC_READ_ACCESS,
2661 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
2663 printf("[4] open - 3 of %s succeeded ! Should have failed.\n", fname );
2667 printf("fourth delete on close test succeeded.\n");
2669 if (!cli_close(&cli1, fnum1)) {
2670 printf("[4] close - 2 failed (%s)\n", cli_errstr(&cli1));
2676 cli_setatr(&cli1, fname, 0, 0);
2677 cli_unlink(&cli1, fname);
2679 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT, DENY_NONE);
2681 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2686 /* This should fail - only allowed on NT opens with DELETE access. */
2688 if (cli_nt_delete_on_close(&cli1, fnum1, True)) {
2689 printf("[5] setting delete_on_close on OpenX file succeeded - should fail !\n");
2694 if (!cli_close(&cli1, fnum1)) {
2695 printf("[5] close - 2 failed (%s)\n", cli_errstr(&cli1));
2700 printf("fifth delete on close test succeeded.\n");
2703 cli_setatr(&cli1, fname, 0, 0);
2704 cli_unlink(&cli1, fname);
2706 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA,
2707 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2708 FILE_OVERWRITE_IF, 0);
2711 printf("[6] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2716 /* This should fail - only allowed on NT opens with DELETE access. */
2718 if (cli_nt_delete_on_close(&cli1, fnum1, True)) {
2719 printf("[6] setting delete_on_close on file with no delete access succeeded - should fail !\n");
2724 if (!cli_close(&cli1, fnum1)) {
2725 printf("[6] close - 2 failed (%s)\n", cli_errstr(&cli1));
2730 printf("sixth delete on close test succeeded.\n");
2733 cli_setatr(&cli1, fname, 0, 0);
2734 cli_unlink(&cli1, fname);
2736 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2737 FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0);
2740 printf("[7] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2745 if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
2746 printf("[7] setting delete_on_close on file failed !\n");
2751 if (!cli_nt_delete_on_close(&cli1, fnum1, False)) {
2752 printf("[7] unsetting delete_on_close on file failed !\n");
2757 if (!cli_close(&cli1, fnum1)) {
2758 printf("[7] close - 2 failed (%s)\n", cli_errstr(&cli1));
2763 /* This next open should succeed - we reset the flag. */
2765 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
2767 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2772 if (!cli_close(&cli1, fnum1)) {
2773 printf("[7] close - 2 failed (%s)\n", cli_errstr(&cli1));
2778 printf("seventh delete on close test succeeded.\n");
2781 cli_setatr(&cli1, fname, 0, 0);
2782 cli_unlink(&cli1, fname);
2784 if (!torture_open_connection(&cli2)) {
2785 printf("[8] failed to open second connection.\n");
2790 cli_sockopt(&cli1, sockops);
2792 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2793 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0);
2796 printf("[8] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2801 fnum2 = cli_nt_create_full(&cli2, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2802 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0);
2805 printf("[8] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2810 if (!cli_nt_delete_on_close(&cli1, fnum1, True)) {
2811 printf("[8] setting delete_on_close on file failed !\n");
2816 if (!cli_close(&cli1, fnum1)) {
2817 printf("[8] close - 1 failed (%s)\n", cli_errstr(&cli1));
2822 if (!cli_close(&cli2, fnum2)) {
2823 printf("[8] close - 2 failed (%s)\n", cli_errstr(&cli2));
2828 /* This should fail.. */
2829 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
2831 printf("[8] open of %s succeeded should have been deleted on close !\n", fname);
2835 printf("eighth delete on close test succeeded.\n");
2837 /* This should fail - we need to set DELETE_ACCESS. */
2838 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA,
2839 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE);
2842 printf("[9] open of %s succeeded should have failed!\n", fname);
2847 printf("ninth delete on close test succeeded.\n");
2849 fnum1 = cli_nt_create_full(&cli1, fname, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
2850 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE);
2852 printf("[10] open of %s failed (%s)\n", fname, cli_errstr(&cli1));
2857 /* This should delete the file. */
2858 if (!cli_close(&cli1, fnum1)) {
2859 printf("[10] close failed (%s)\n", cli_errstr(&cli1));
2864 /* This should fail.. */
2865 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_NONE);
2867 printf("[10] open of %s succeeded should have been deleted on close !\n", fname);
2871 printf("tenth delete on close test succeeded.\n");
2872 printf("finished delete test\n");
2876 cli_close(&cli1, fnum1);
2877 cli_close(&cli1, fnum2);
2878 cli_setatr(&cli1, fname, 0, 0);
2879 cli_unlink(&cli1, fname);
2881 if (!torture_close_connection(&cli1)) {
2884 if (!torture_close_connection(&cli2)) {
2892 print out server properties
2894 static BOOL run_properties(int dummy)
2896 static struct cli_state cli;
2897 BOOL correct = True;
2899 printf("starting properties test\n");
2903 if (!torture_open_connection(&cli)) {
2907 cli_sockopt(&cli, sockops);
2909 d_printf("Capabilities 0x%08x\n", cli.capabilities);
2911 if (!torture_close_connection(&cli)) {
2920 /* FIRST_DESIRED_ACCESS 0xf019f */
2921 #define FIRST_DESIRED_ACCESS FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|\
2922 FILE_READ_EA| /* 0xf */ \
2923 FILE_WRITE_EA|FILE_READ_ATTRIBUTES| /* 0x90 */ \
2924 FILE_WRITE_ATTRIBUTES| /* 0x100 */ \
2925 DELETE_ACCESS|READ_CONTROL_ACCESS|\
2926 WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS /* 0xf0000 */
2927 /* SECOND_DESIRED_ACCESS 0xe0080 */
2928 #define SECOND_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
2929 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
2930 WRITE_OWNER_ACCESS /* 0xe0000 */
2933 #define THIRD_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
2934 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
2936 WRITE_OWNER_ACCESS /* */
2940 Test ntcreate calls made by xcopy
2942 static BOOL run_xcopy(int dummy)
2944 static struct cli_state cli1;
2945 const char *fname = "\\test.txt";
2946 BOOL correct = True;
2949 printf("starting xcopy test\n");
2951 if (!torture_open_connection(&cli1)) {
2955 fnum1 = cli_nt_create_full(&cli1, fname,
2956 FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
2957 FILE_SHARE_NONE, FILE_OVERWRITE_IF,
2961 printf("First open failed - %s\n", cli_errstr(&cli1));
2965 fnum2 = cli_nt_create_full(&cli1, fname,
2966 SECOND_DESIRED_ACCESS, 0,
2967 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN,
2970 printf("second open failed - %s\n", cli_errstr(&cli1));
2974 if (!torture_close_connection(&cli1)) {
2982 Test rename on files open with share delete and no share delete.
2984 static BOOL run_rename(int dummy)
2986 static struct cli_state cli1;
2987 const char *fname = "\\test.txt";
2988 const char *fname1 = "\\test1.txt";
2989 BOOL correct = True;
2992 printf("starting rename test\n");
2994 if (!torture_open_connection(&cli1)) {
2998 cli_unlink(&cli1, fname);
2999 cli_unlink(&cli1, fname1);
3000 fnum1 = cli_nt_create_full(&cli1, fname, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3001 FILE_SHARE_READ, FILE_OVERWRITE_IF, 0);
3004 printf("First open failed - %s\n", cli_errstr(&cli1));
3008 if (!cli_rename(&cli1, fname, fname1)) {
3009 printf("First rename failed (this is correct) - %s\n", cli_errstr(&cli1));
3011 printf("First rename succeeded - this should have failed !\n");
3015 if (!cli_close(&cli1, fnum1)) {
3016 printf("close - 1 failed (%s)\n", cli_errstr(&cli1));
3020 cli_unlink(&cli1, fname);
3021 cli_unlink(&cli1, fname1);
3022 fnum1 = cli_nt_create_full(&cli1, fname,GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3024 FILE_SHARE_DELETE|FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3026 FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_OVERWRITE_IF, 0);
3030 printf("Second open failed - %s\n", cli_errstr(&cli1));
3034 if (!cli_rename(&cli1, fname, fname1)) {
3035 printf("Second rename failed - this should have succeeded - %s\n", cli_errstr(&cli1));
3038 printf("Second rename succeeded\n");
3041 if (!cli_close(&cli1, fnum1)) {
3042 printf("close - 2 failed (%s)\n", cli_errstr(&cli1));
3046 cli_unlink(&cli1, fname);
3047 cli_unlink(&cli1, fname1);
3049 fnum1 = cli_nt_create_full(&cli1, fname,READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
3050 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3053 printf("Third open failed - %s\n", cli_errstr(&cli1));
3062 fnum2 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
3063 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3066 printf("Fourth open failed - %s\n", cli_errstr(&cli1));
3069 if (!cli_nt_delete_on_close(&cli1, fnum2, True)) {
3070 printf("[8] setting delete_on_close on file failed !\n");
3074 if (!cli_close(&cli1, fnum2)) {
3075 printf("close - 4 failed (%s)\n", cli_errstr(&cli1));
3081 if (!cli_rename(&cli1, fname, fname1)) {
3082 printf("Third rename failed - this should have succeeded - %s\n", cli_errstr(&cli1));
3085 printf("Third rename succeeded\n");
3088 if (!cli_close(&cli1, fnum1)) {
3089 printf("close - 3 failed (%s)\n", cli_errstr(&cli1));
3093 cli_unlink(&cli1, fname);
3094 cli_unlink(&cli1, fname1);
3096 if (!torture_close_connection(&cli1)) {
3103 static BOOL run_pipe_number(int dummy)
3105 static struct cli_state cli1;
3106 const char *pipe_name = "\\SPOOLSS";
3110 printf("starting pipenumber test\n");
3111 if (!torture_open_connection(&cli1)) {
3115 cli_sockopt(&cli1, sockops);
3117 fnum = cli_nt_create_full(&cli1, pipe_name,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3118 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0);
3121 printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(&cli1));
3127 printf("pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
3128 torture_close_connection(&cli1);
3133 Test open mode returns on read-only files.
3135 static BOOL run_opentest(int dummy)
3137 static struct cli_state cli1;
3138 static struct cli_state cli2;
3139 const char *fname = "\\readonly.file";
3143 BOOL correct = True;
3147 printf("starting open test\n");
3149 if (!torture_open_connection(&cli1)) {
3153 cli_setatr(&cli1, fname, 0, 0);
3154 cli_unlink(&cli1, fname);
3156 cli_sockopt(&cli1, sockops);
3158 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
3160 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
3164 if (!cli_close(&cli1, fnum1)) {
3165 printf("close2 failed (%s)\n", cli_errstr(&cli1));
3169 if (!cli_setatr(&cli1, fname, aRONLY, 0)) {
3170 printf("cli_setatr failed (%s)\n", cli_errstr(&cli1));
3174 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_WRITE);
3176 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
3180 /* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
3181 fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_ALL);
3183 if (check_error(__LINE__, &cli1, ERRDOS, ERRnoaccess,
3184 NT_STATUS_ACCESS_DENIED)) {
3185 printf("correct error code ERRDOS/ERRnoaccess returned\n");
3188 printf("finished open test 1\n");
3190 cli_close(&cli1, fnum1);
3192 /* Now try not readonly and ensure ERRbadshare is returned. */
3194 cli_setatr(&cli1, fname, 0, 0);
3196 fnum1 = cli_open(&cli1, fname, O_RDONLY, DENY_WRITE);
3198 printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
3202 /* This will fail - but the error should be ERRshare. */
3203 fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_ALL);
3205 if (check_error(__LINE__, &cli1, ERRDOS, ERRbadshare,
3206 NT_STATUS_SHARING_VIOLATION)) {
3207 printf("correct error code ERRDOS/ERRbadshare returned\n");
3210 if (!cli_close(&cli1, fnum1)) {
3211 printf("close2 failed (%s)\n", cli_errstr(&cli1));
3215 cli_unlink(&cli1, fname);
3217 printf("finished open test 2\n");
3219 /* Test truncate open disposition on file opened for read. */
3221 fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
3223 printf("(3) open (1) of %s failed (%s)\n", fname, cli_errstr(&cli1));
3227 /* write 20 bytes. */
3229 memset(buf, '\0', 20);
3231 if (cli_write(&cli1, fnum1, 0, buf, 0, 20) != 20) {
3232 printf("write failed (%s)\n", cli_errstr(&cli1));
3236 if (!cli_close(&cli1, fnum1)) {
3237 printf("(3) close1 failed (%s)\n", cli_errstr(&cli1));
3241 /* Ensure size == 20. */
3242 if (!cli_getatr(&cli1, fname, NULL, &fsize, NULL)) {
3243 printf("(3) getatr failed (%s)\n", cli_errstr(&cli1));
3248 printf("(3) file size != 20\n");
3252 /* Now test if we can truncate a file opened for readonly. */
3254 fnum1 = cli_open(&cli1, fname, O_RDONLY|O_TRUNC, DENY_NONE);
3256 printf("(3) open (2) of %s failed (%s)\n", fname, cli_errstr(&cli1));
3260 if (!cli_close(&cli1, fnum1)) {
3261 printf("close2 failed (%s)\n", cli_errstr(&cli1));
3265 /* Ensure size == 0. */
3266 if (!cli_getatr(&cli1, fname, NULL, &fsize, NULL)) {
3267 printf("(3) getatr failed (%s)\n", cli_errstr(&cli1));
3272 printf("(3) file size != 0\n");
3275 printf("finished open test 3\n");
3277 cli_unlink(&cli1, fname);
3280 printf("testing ctemp\n");
3281 fnum1 = cli_ctemp(&cli1, "\\", &tmp_path);
3283 printf("ctemp failed (%s)\n", cli_errstr(&cli1));
3286 printf("ctemp gave path %s\n", tmp_path);
3287 if (!cli_close(&cli1, fnum1)) {
3288 printf("close of temp failed (%s)\n", cli_errstr(&cli1));
3290 if (!cli_unlink(&cli1, tmp_path)) {
3291 printf("unlink of temp failed (%s)\n", cli_errstr(&cli1));
3294 /* Test the non-io opens... */
3296 if (!torture_open_connection(&cli2)) {
3300 cli_setatr(&cli2, fname, 0, 0);
3301 cli_unlink(&cli2, fname);
3303 cli_sockopt(&cli2, sockops);
3305 printf("TEST #1 testing 2 non-io opens (no delete)\n");
3307 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3308 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3311 printf("test 1 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3315 fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3316 FILE_SHARE_NONE, FILE_OPEN_IF, 0);
3319 printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3323 if (!cli_close(&cli1, fnum1)) {
3324 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3327 if (!cli_close(&cli2, fnum2)) {
3328 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3332 printf("non-io open test #1 passed.\n");
3334 cli_unlink(&cli1, fname);
3336 printf("TEST #2 testing 2 non-io opens (first with delete)\n");
3338 fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3339 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3342 printf("test 2 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3346 fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3347 FILE_SHARE_NONE, FILE_OPEN_IF, 0);
3350 printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3354 if (!cli_close(&cli1, fnum1)) {
3355 printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3358 if (!cli_close(&cli2, fnum2)) {
3359 printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3363 printf("non-io open test #2 passed.\n");
3365 cli_unlink(&cli1, fname);
3367 printf("TEST #3 testing 2 non-io opens (second with delete)\n");
3369 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3370 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3373 printf("test 3 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3377 fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3378 FILE_SHARE_NONE, FILE_OPEN_IF, 0);
3381 printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3385 if (!cli_close(&cli1, fnum1)) {
3386 printf("test 3 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3389 if (!cli_close(&cli2, fnum2)) {
3390 printf("test 3 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3394 printf("non-io open test #3 passed.\n");
3396 cli_unlink(&cli1, fname);
3398 printf("TEST #4 testing 2 non-io opens (both with delete)\n");
3400 fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3401 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3404 printf("test 4 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3408 fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3409 FILE_SHARE_NONE, FILE_OPEN_IF, 0);
3412 printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(&cli2));
3416 printf("test 3 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(&cli2), "sharing violation");
3418 if (!cli_close(&cli1, fnum1)) {
3419 printf("test 4 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3423 printf("non-io open test #4 passed.\n");
3425 cli_unlink(&cli1, fname);
3427 printf("TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n");
3429 fnum1 = cli_nt_create_full(&cli1, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3430 FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0);
3433 printf("test 5 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3437 fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3438 FILE_SHARE_DELETE, FILE_OPEN_IF, 0);
3441 printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3445 if (!cli_close(&cli1, fnum1)) {
3446 printf("test 5 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3450 if (!cli_close(&cli2, fnum2)) {
3451 printf("test 5 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3455 printf("non-io open test #5 passed.\n");
3457 printf("TEST #6 testing 1 non-io open, one io open\n");
3459 cli_unlink(&cli1, fname);
3461 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3462 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3465 printf("test 6 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3469 fnum2 = cli_nt_create_full(&cli2, fname,FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3470 FILE_SHARE_READ, FILE_OPEN_IF, 0);
3473 printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3477 if (!cli_close(&cli1, fnum1)) {
3478 printf("test 6 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3482 if (!cli_close(&cli2, fnum2)) {
3483 printf("test 6 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
3487 printf("non-io open test #6 passed.\n");
3489 printf("TEST #7 testing 1 non-io open, one io open with delete\n");
3491 cli_unlink(&cli1, fname);
3493 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3494 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3497 printf("test 7 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3501 fnum2 = cli_nt_create_full(&cli2, fname,DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
3502 FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0);
3505 printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(&cli2));
3509 printf("test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(&cli2), "sharing violation");
3511 if (!cli_close(&cli1, fnum1)) {
3512 printf("test 7 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3516 printf("non-io open test #7 passed.\n");
3518 cli_unlink(&cli1, fname);
3520 /* Test 8 - attributes test #1... */
3521 fnum1 = cli_nt_create_full(&cli1, fname,FILE_WRITE_DATA, FILE_ATTRIBUTE_HIDDEN,
3522 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3525 printf("test 8 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3529 if (!cli_close(&cli1, fnum1)) {
3530 printf("test 8 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3534 /* FILE_SUPERSEDE && FILE_OVERWRITE_IF have the same effect here. */
3535 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL,
3536 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3539 printf("test 8 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3543 if (!cli_close(&cli1, fnum1)) {
3544 printf("test 8 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3548 /* This open should fail with ACCESS_DENIED for FILE_SUPERSEDE, FILE_OVERWRITE and FILE_OVERWRITE_IF. */
3549 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
3550 FILE_SHARE_NONE, FILE_OVERWRITE, 0);
3553 printf("test 8 open 3 of %s succeeded - should have failed with (NT_STATUS_ACCESS_DENIED)\n", fname);
3555 cli_close(&cli1, fnum1);
3557 if (check_error(__LINE__, &cli1, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED)) {
3558 printf("correct error code NT_STATUS_ACCESS_DENIED/ERRDOS:ERRnoaccess returned\n");
3562 printf("Attribute open test #8 %s.\n", correct ? "passed" : "failed");
3564 cli_unlink(&cli1, fname);
3567 * Test #9. Open with NORMAL, close, then re-open with attribute
3568 * HIDDEN and request to truncate.
3571 fnum1 = cli_nt_create_full(&cli1, fname,FILE_WRITE_DATA, FILE_ATTRIBUTE_NORMAL,
3572 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0);
3575 printf("test 9 open 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3579 if (!cli_close(&cli1, fnum1)) {
3580 printf("test 9 close 1 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3584 fnum1 = cli_nt_create_full(&cli1, fname,FILE_READ_DATA|FILE_WRITE_DATA, FILE_ATTRIBUTE_HIDDEN,
3585 FILE_SHARE_NONE, FILE_OVERWRITE, 0);
3588 printf("test 9 open 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3592 if (!cli_close(&cli1, fnum1)) {
3593 printf("test 9 close 2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
3597 /* Ensure we have attr hidden. */
3598 if (!cli_getatr(&cli1, fname, &attr, NULL, NULL)) {
3599 printf("test 9 getatr(2) failed (%s)\n", cli_errstr(&cli1));
3603 if (!(attr & FILE_ATTRIBUTE_HIDDEN)) {
3604 printf("test 9 getatr didn't have HIDDEN attribute\n");
3605 cli_unlink(&cli1, fname);
3609 printf("Attribute open test #9 %s.\n", correct ? "passed" : "failed");
3611 cli_unlink(&cli1, fname);
3613 if (!torture_close_connection(&cli1)) {
3616 if (!torture_close_connection(&cli2)) {
3623 static void list_fn(file_info *finfo, const char *name, void *state)
3629 test directory listing speed
3631 static BOOL run_dirtest(int dummy)
3634 static struct cli_state cli;
3637 BOOL correct = True;
3639 printf("starting directory test\n");
3641 if (!torture_open_connection(&cli)) {
3645 cli_sockopt(&cli, sockops);
3648 for (i=0;i<torture_numops;i++) {
3650 slprintf(fname, sizeof(fname), "\\%x", (int)random());
3651 fnum = cli_open(&cli, fname, O_RDWR|O_CREAT, DENY_NONE);
3653 fprintf(stderr,"Failed to open %s\n", fname);
3656 cli_close(&cli, fnum);
3661 printf("Matched %d\n", cli_list(&cli, "a*.*", 0, list_fn, NULL));
3662 printf("Matched %d\n", cli_list(&cli, "b*.*", 0, list_fn, NULL));
3663 printf("Matched %d\n", cli_list(&cli, "xyzabc", 0, list_fn, NULL));
3665 printf("dirtest core %g seconds\n", end_timer() - t1);
3668 for (i=0;i<torture_numops;i++) {
3670 slprintf(fname, sizeof(fname), "\\%x", (int)random());
3671 cli_unlink(&cli, fname);
3674 if (!torture_close_connection(&cli)) {
3678 printf("finished dirtest\n");
3683 static void del_fn(file_info *finfo, const char *mask, void *state)
3685 struct cli_state *pcli = (struct cli_state *)state;
3687 slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
3689 if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
3692 if (finfo->mode & aDIR) {
3693 if (!cli_rmdir(pcli, fname))
3694 printf("del_fn: failed to rmdir %s\n,", fname );
3696 if (!cli_unlink(pcli, fname))
3697 printf("del_fn: failed to unlink %s\n,", fname );
3701 static BOOL run_dirtest1(int dummy)
3704 static struct cli_state cli;
3706 BOOL correct = True;
3708 printf("starting directory test\n");
3710 if (!torture_open_connection(&cli)) {
3714 cli_sockopt(&cli, sockops);
3716 cli_list(&cli, "\\LISTDIR\\*", 0, del_fn, &cli);
3717 cli_list(&cli, "\\LISTDIR\\*", aDIR, del_fn, &cli);
3718 cli_rmdir(&cli, "\\LISTDIR");
3719 cli_mkdir(&cli, "\\LISTDIR");
3721 /* Create 1000 files and 1000 directories. */
3722 for (i=0;i<1000;i++) {
3724 slprintf(fname, sizeof(fname), "\\LISTDIR\\f%d", i);
3725 fnum = cli_nt_create_full(&cli, fname, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
3726 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0);
3728 fprintf(stderr,"Failed to open %s\n", fname);
3731 cli_close(&cli, fnum);
3733 for (i=0;i<1000;i++) {
3735 slprintf(fname, sizeof(fname), "\\LISTDIR\\d%d", i);
3736 if (!cli_mkdir(&cli, fname)) {
3737 fprintf(stderr,"Failed to open %s\n", fname);
3742 /* Now ensure that doing an old list sees both files and directories. */
3743 num_seen = cli_list_old(&cli, "\\LISTDIR\\*", aDIR, list_fn, NULL);
3744 printf("num_seen = %d\n", num_seen );
3745 /* We should see 100 files + 1000 directories + . and .. */
3746 if (num_seen != 2002)
3749 /* Ensure if we have the "must have" bits we only see the
3752 num_seen = cli_list_old(&cli, "\\LISTDIR\\*", (aDIR<<8)|aDIR, list_fn, NULL);
3753 printf("num_seen = %d\n", num_seen );
3754 if (num_seen != 1002)
3757 num_seen = cli_list_old(&cli, "\\LISTDIR\\*", (aARCH<<8)|aDIR, list_fn, NULL);
3758 printf("num_seen = %d\n", num_seen );
3759 if (num_seen != 1000)
3762 /* Delete everything. */
3763 cli_list(&cli, "\\LISTDIR\\*", 0, del_fn, &cli);
3764 cli_list(&cli, "\\LISTDIR\\*", aDIR, del_fn, &cli);
3765 cli_rmdir(&cli, "\\LISTDIR");
3768 printf("Matched %d\n", cli_list(&cli, "a*.*", 0, list_fn, NULL));
3769 printf("Matched %d\n", cli_list(&cli, "b*.*", 0, list_fn, NULL));
3770 printf("Matched %d\n", cli_list(&cli, "xyzabc", 0, list_fn, NULL));
3773 if (!torture_close_connection(&cli)) {
3777 printf("finished dirtest1\n");
3782 static BOOL run_error_map_extract(int dummy) {
3784 static struct cli_state c_dos;
3785 static struct cli_state c_nt;
3789 uint32 flgs2, errnum;
3796 /* NT-Error connection */
3798 if (!open_nbt_connection(&c_nt)) {
3802 c_nt.use_spnego = False;
3804 if (!cli_negprot(&c_nt)) {
3805 printf("%s rejected the NT-error negprot (%s)\n",host, cli_errstr(&c_nt));
3806 cli_shutdown(&c_nt);
3810 if (!cli_session_setup(&c_nt, "", "", 0, "", 0,
3812 printf("%s rejected the NT-error initial session setup (%s)\n",host, cli_errstr(&c_nt));
3816 /* DOS-Error connection */
3818 if (!open_nbt_connection(&c_dos)) {
3822 c_dos.use_spnego = False;
3823 c_dos.force_dos_errors = True;
3825 if (!cli_negprot(&c_dos)) {
3826 printf("%s rejected the DOS-error negprot (%s)\n",host, cli_errstr(&c_dos));
3827 cli_shutdown(&c_dos);
3831 if (!cli_session_setup(&c_dos, "", "", 0, "", 0,
3833 printf("%s rejected the DOS-error initial session setup (%s)\n",host, cli_errstr(&c_dos));
3837 for (error=(0xc0000000 | 0x1); error < (0xc0000000| 0xFFF); error++) {
3838 snprintf(user, sizeof(user), "%X", error);
3840 if (cli_session_setup(&c_nt, user,
3841 password, strlen(password),
3842 password, strlen(password),
3844 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
3847 flgs2 = SVAL(c_nt.inbuf,smb_flg2);
3849 /* Case #1: 32-bit NT errors */
3850 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
3851 nt_status = NT_STATUS(IVAL(c_nt.inbuf,smb_rcls));
3853 printf("/** Dos error on NT connection! (%s) */\n",
3855 nt_status = NT_STATUS(0xc0000000);
3858 if (cli_session_setup(&c_dos, user,
3859 password, strlen(password),
3860 password, strlen(password),
3862 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
3864 flgs2 = SVAL(c_dos.inbuf,smb_flg2), errnum;
3866 /* Case #1: 32-bit NT errors */
3867 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
3868 printf("/** NT error on DOS connection! (%s) */\n",
3870 errnum = errclass = 0;
3872 cli_dos_error(&c_dos, &errclass, &errnum);
3875 if (NT_STATUS_V(nt_status) != error) {
3876 printf("/*\t{ This NT error code was 'sqashed'\n\t from %s to %s \n\t during the session setup }\n*/\n",
3877 get_nt_error_c_code(NT_STATUS(error)),
3878 get_nt_error_c_code(nt_status));
3881 printf("\t{%s,\t%s,\t%s},\n",
3882 smb_dos_err_class(errclass),
3883 smb_dos_err_name(errclass, errnum),
3884 get_nt_error_c_code(NT_STATUS(error)));
3889 static double create_procs(BOOL (*fn)(int), BOOL *result)
3892 volatile pid_t *child_status;
3893 volatile BOOL *child_status_out;
3899 child_status = (volatile pid_t *)shm_setup(sizeof(pid_t)*nprocs);
3900 if (!child_status) {
3901 printf("Failed to setup shared memory\n");
3905 child_status_out = (volatile BOOL *)shm_setup(sizeof(BOOL)*nprocs);
3906 if (!child_status_out) {
3907 printf("Failed to setup result status shared memory\n");
3911 for (i = 0; i < nprocs; i++) {
3912 child_status[i] = 0;
3913 child_status_out[i] = True;
3918 for (i=0;i<nprocs;i++) {
3921 pid_t mypid = getpid();
3922 sys_srandom(((int)mypid) ^ ((int)time(NULL)));
3924 slprintf(myname,sizeof(myname),"CLIENT%d", i);
3927 memset(¤t_cli, 0, sizeof(current_cli));
3928 if (torture_open_connection(¤t_cli)) break;
3930 printf("pid %d failed to start\n", (int)getpid());
3936 child_status[i] = getpid();
3938 while (child_status[i] && end_timer() < 5) msleep(2);
3940 child_status_out[i] = fn(i);
3947 for (i=0;i<nprocs;i++) {
3948 if (child_status[i]) synccount++;
3950 if (synccount == nprocs) break;
3952 } while (end_timer() < 30);
3954 if (synccount != nprocs) {
3955 printf("FAILED TO START %d CLIENTS (started %d)\n", nprocs, synccount);
3960 /* start the client load */
3963 for (i=0;i<nprocs;i++) {
3964 child_status[i] = 0;
3967 printf("%d clients started\n", nprocs);
3969 for (i=0;i<nprocs;i++) {
3970 while (waitpid(0, &status, 0) == -1 && errno == EINTR) /* noop */ ;
3975 for (i=0;i<nprocs;i++) {
3976 if (!child_status_out[i]) {
3983 #define FLAG_MULTIPROC 1
3990 {"FDPASS", run_fdpasstest, 0},
3991 {"LOCK1", run_locktest1, 0},
3992 {"LOCK2", run_locktest2, 0},
3993 {"LOCK3", run_locktest3, 0},
3994 {"LOCK4", run_locktest4, 0},
3995 {"LOCK5", run_locktest5, 0},
3996 {"LOCK6", run_locktest6, 0},
3997 {"UNLINK", run_unlinktest, 0},
3998 {"BROWSE", run_browsetest, 0},
3999 {"ATTR", run_attrtest, 0},
4000 {"TRANS2", run_trans2test, 0},
4001 {"MAXFID", run_maxfidtest, FLAG_MULTIPROC},
4002 {"TORTURE",run_torture, FLAG_MULTIPROC},
4003 {"RANDOMIPC", run_randomipc, 0},
4004 {"NEGNOWAIT", run_negprot_nowait, 0},
4005 {"NBENCH", run_nbench, 0},
4006 {"OPLOCK1", run_oplock1, 0},
4007 {"OPLOCK2", run_oplock2, 0},
4008 {"OPLOCK3", run_oplock3, 0},
4009 {"DIR", run_dirtest, 0},
4010 {"DIR1", run_dirtest1, 0},
4011 {"DENY1", torture_denytest1, 0},
4012 {"DENY2", torture_denytest2, 0},
4013 {"TCON", run_tcon_test, 0},
4014 {"TCONDEV", run_tcon_devtype_test, 0},
4015 {"RW1", run_readwritetest, 0},
4016 {"RW2", run_readwritemulti, FLAG_MULTIPROC},
4017 {"RW3", run_readwritelarge, 0},
4018 {"OPEN", run_opentest, 0},
4019 {"XCOPY", run_xcopy, 0},
4020 {"RENAME", run_rename, 0},
4021 {"DELETE", run_deletetest, 0},
4022 {"PROPERTIES", run_properties, 0},
4023 {"MANGLE", torture_mangle, 0},
4024 {"W2K", run_w2ktest, 0},
4025 {"TRANS2SCAN", torture_trans2_scan, 0},
4026 {"NTTRANSSCAN", torture_nttrans_scan, 0},
4027 {"UTABLE", torture_utable, 0},
4028 {"CASETABLE", torture_casetable, 0},
4029 {"ERRMAPEXTRACT", run_error_map_extract, 0},
4030 {"PIPE_NUMBER", run_pipe_number, 0},
4035 /****************************************************************************
4036 run a specified test or "ALL"
4037 ****************************************************************************/
4038 static BOOL run_test(const char *name)
4044 if (strequal(name,"ALL")) {
4045 for (i=0;torture_ops[i].name;i++) {
4046 run_test(torture_ops[i].name);
4050 for (i=0;torture_ops[i].name;i++) {
4051 snprintf(randomfname, sizeof(randomfname), "\\XX%x",
4052 (unsigned)random());
4054 if (strequal(name, torture_ops[i].name)) {
4055 printf("Running %s\n", name);
4056 if (torture_ops[i].flags & FLAG_MULTIPROC) {
4057 t = create_procs(torture_ops[i].fn, &result);
4060 printf("TEST %s FAILED!\n", name);
4065 if (!torture_ops[i].fn(0)) {
4067 printf("TEST %s FAILED!\n", name);
4071 printf("%s took %g secs\n\n", name, t);
4078 static void usage(void)
4082 printf("Usage: smbtorture //server/share <options> TEST1 TEST2 ...\n");
4084 printf("\t-d debuglevel\n");
4085 printf("\t-U user%%pass\n");
4086 printf("\t-k use kerberos\n");
4087 printf("\t-N numprocs\n");
4088 printf("\t-n my_netbios_name\n");
4089 printf("\t-W workgroup\n");
4090 printf("\t-o num_operations\n");
4091 printf("\t-O socket_options\n");
4092 printf("\t-m maximum protocol\n");
4093 printf("\t-L use oplocks\n");
4094 printf("\t-c CLIENT.TXT specify client load file for NBENCH\n");
4095 printf("\t-A showall\n");
4096 printf("\t-s seed\n");
4099 printf("tests are:");
4100 for (i=0;torture_ops[i].name;i++) {
4101 printf(" %s", torture_ops[i].name);
4105 printf("default test is ALL\n");
4114 /****************************************************************************
4116 ****************************************************************************/
4117 int main(int argc,char *argv[])
4123 extern char *optarg;
4125 BOOL correct = True;
4129 #ifdef HAVE_SETBUFFER
4130 setbuffer(stdout, NULL, 0);
4133 lp_load(dyn_CONFIGFILE,True,False,False);
4140 for(p = argv[1]; *p; p++)
4144 if (strncmp(argv[1], "//", 2)) {
4148 fstrcpy(host, &argv[1][2]);
4149 p = strchr_m(&host[2],'/');
4154 fstrcpy(share, p+1);
4158 if (*username == 0 && getenv("LOGNAME")) {
4159 fstrcpy(username,getenv("LOGNAME"));
4165 srandom(time(NULL));
4167 fstrcpy(workgroup, lp_workgroup());
4169 while ((opt = getopt(argc, argv, "hW:U:n:N:O:o:m:Ld:Ac:ks:")) != EOF) {
4172 srandom(atoi(optarg));
4175 fstrcpy(workgroup,optarg);
4178 max_protocol = interpret_protocol(optarg, max_protocol);
4181 nprocs = atoi(optarg);
4184 torture_numops = atoi(optarg);
4187 DEBUGLEVEL = atoi(optarg);
4196 torture_showall = True;
4199 fstrcpy(myname, optarg);
4202 client_txt = optarg;
4206 use_kerberos = True;
4208 d_printf("No kerberos support compiled in\n");
4214 fstrcpy(username,optarg);
4215 p = strchr_m(username,'%');
4218 fstrcpy(password, p+1);
4223 printf("Unknown option %c (%d)\n", (char)opt, opt);
4228 if(use_kerberos && !gotuser) gotpass = True;
4231 p = getpass("Password:");
4233 fstrcpy(password, p);
4238 printf("host=%s share=%s user=%s myname=%s\n",
4239 host, share, username, myname);
4242 correct = run_test("ALL");
4244 for (i=1;i<argc;i++) {
4245 if (!run_test(argv[i])) {