2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1997-1998
5 Copyright (C) Jeremy Allison 2009
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "wbc_async.h"
23 #include "torture/proto.h"
24 #include "libcli/security/security.h"
26 #include "tldap_util.h"
27 #include "../librpc/gen_ndr/svcctl.h"
29 #include "nsswitch/winbind_client.h"
31 #include "talloc_dict.h"
32 #include "async_smb.h"
37 static fstring host, workgroup, share, password, username, myname;
38 static int max_protocol = PROTOCOL_NT1;
39 static const char *sockops="TCP_NODELAY";
41 static int port_to_use=0;
42 int torture_numops=100;
43 int torture_blocksize=1024*1024;
44 static int procnum; /* records process count number when forking */
45 static struct cli_state *current_cli;
46 static fstring randomfname;
47 static bool use_oplocks;
48 static bool use_level_II_oplocks;
49 static const char *client_txt = "client_oplocks.txt";
50 static bool use_kerberos;
51 static fstring multishare_conn_fname;
52 static bool use_multishare_conn = False;
53 static bool do_encrypt;
54 static const char *local_path = NULL;
55 static int signing_state = Undefined;
57 bool torture_showall = False;
59 static double create_procs(bool (*fn)(int), bool *result);
62 /* return a pointer to a anonymous shared memory segment of size "size"
63 which will persist across fork() but will disappear when all processes
66 The memory is not zeroed
68 This function uses system5 shared memory. It takes advantage of a property
69 that the memory is not destroyed if it is attached when the id is removed
71 void *shm_setup(int size)
77 shmid = shm_open("private", O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
79 printf("can't get shared memory\n");
82 shm_unlink("private");
83 if (ftruncate(shmid, size) == -1) {
84 printf("can't set shared memory size\n");
87 ret = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, shmid, 0);
88 if (ret == MAP_FAILED) {
89 printf("can't map shared memory\n");
93 shmid = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
95 printf("can't get shared memory\n");
98 ret = (void *)shmat(shmid, 0, 0);
99 if (!ret || ret == (void *)-1) {
100 printf("can't attach to shared memory\n");
103 /* the following releases the ipc, but note that this process
104 and all its children will still have access to the memory, its
105 just that the shmid is no longer valid for other shm calls. This
106 means we don't leave behind lots of shm segments after we exit
108 See Stevens "advanced programming in unix env" for details
110 shmctl(shmid, IPC_RMID, 0);
116 /********************************************************************
117 Ensure a connection is encrypted.
118 ********************************************************************/
120 static bool force_cli_encryption(struct cli_state *c,
121 const char *sharename)
124 uint32 caplow, caphigh;
127 if (!SERVER_HAS_UNIX_CIFS(c)) {
128 d_printf("Encryption required and "
129 "server that doesn't support "
130 "UNIX extensions - failing connect\n");
134 status = cli_unix_extensions_version(c, &major, &minor, &caplow,
136 if (!NT_STATUS_IS_OK(status)) {
137 d_printf("Encryption required and "
138 "can't get UNIX CIFS extensions "
139 "version from server: %s\n", nt_errstr(status));
143 if (!(caplow & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)) {
144 d_printf("Encryption required and "
145 "share %s doesn't support "
146 "encryption.\n", sharename);
150 if (c->use_kerberos) {
151 status = cli_gss_smb_encryption_start(c);
153 status = cli_raw_ntlm_smb_encryption_start(c,
159 if (!NT_STATUS_IS_OK(status)) {
160 d_printf("Encryption required and "
161 "setup failed with error %s.\n",
170 static struct cli_state *open_nbt_connection(void)
172 struct nmb_name called, calling;
173 struct sockaddr_storage ss;
177 make_nmb_name(&calling, myname, 0x0);
178 make_nmb_name(&called , host, 0x20);
182 if (!(c = cli_initialise_ex(signing_state))) {
183 printf("Failed initialize cli_struct to connect with %s\n", host);
187 c->port = port_to_use;
189 status = cli_connect(c, host, &ss);
190 if (!NT_STATUS_IS_OK(status)) {
191 printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
195 c->use_kerberos = use_kerberos;
197 c->timeout = 120000; /* set a really long timeout (2 minutes) */
198 if (use_oplocks) c->use_oplocks = True;
199 if (use_level_II_oplocks) c->use_level_II_oplocks = True;
201 if (!cli_session_request(c, &calling, &called)) {
203 * Well, that failed, try *SMBSERVER ...
204 * However, we must reconnect as well ...
206 status = cli_connect(c, host, &ss);
207 if (!NT_STATUS_IS_OK(status)) {
208 printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
212 make_nmb_name(&called, "*SMBSERVER", 0x20);
213 if (!cli_session_request(c, &calling, &called)) {
214 printf("%s rejected the session\n",host);
215 printf("We tried with a called name of %s & %s\n",
225 /****************************************************************************
226 Send a corrupt session request. See rfc1002.txt 4.3 and 4.3.2.
227 ****************************************************************************/
229 static bool cli_bad_session_request(struct cli_state *cli,
230 struct nmb_name *calling, struct nmb_name *called)
237 memcpy(&(cli->calling), calling, sizeof(*calling));
238 memcpy(&(cli->called ), called , sizeof(*called ));
240 /* put in the destination name */
242 tmp = name_mangle(talloc_tos(), cli->called.name,
243 cli->called.name_type);
249 namelen = name_len((unsigned char *)tmp, talloc_get_size(tmp));
251 memcpy(p, tmp, namelen);
256 /* Deliberately corrupt the name len (first byte) */
261 tmp = name_mangle(talloc_tos(), cli->calling.name,
262 cli->calling.name_type);
268 namelen = name_len((unsigned char *)tmp, talloc_get_size(tmp));
270 memcpy(p, tmp, namelen);
274 /* Deliberately corrupt the name len (first byte) */
277 /* send a session request (RFC 1002) */
278 /* setup the packet length
279 * Remove four bytes from the length count, since the length
280 * field in the NBT Session Service header counts the number
281 * of bytes which follow. The cli_send_smb() function knows
282 * about this and accounts for those four bytes.
286 _smb_setlen(cli->outbuf,len);
287 SCVAL(cli->outbuf,0,0x81);
290 DEBUG(5,("Sent session request\n"));
292 if (!cli_receive_smb(cli))
295 if (CVAL(cli->inbuf,0) != 0x82) {
296 /* This is the wrong place to put the error... JRA. */
297 cli->rap_error = CVAL(cli->inbuf,4);
303 static struct cli_state *open_bad_nbt_connection(void)
305 struct nmb_name called, calling;
306 struct sockaddr_storage ss;
310 make_nmb_name(&calling, myname, 0x0);
311 make_nmb_name(&called , host, 0x20);
315 if (!(c = cli_initialise_ex(signing_state))) {
316 printf("Failed initialize cli_struct to connect with %s\n", host);
322 status = cli_connect(c, host, &ss);
323 if (!NT_STATUS_IS_OK(status)) {
324 printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
328 c->timeout = 4000; /* set a short timeout (4 seconds) */
330 if (!cli_bad_session_request(c, &calling, &called)) {
331 printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
339 /* Insert a NULL at the first separator of the given path and return a pointer
340 * to the remainder of the string.
343 terminate_path_at_separator(char * path)
351 if ((p = strchr_m(path, '/'))) {
356 if ((p = strchr_m(path, '\\'))) {
366 parse a //server/share type UNC name
368 bool smbcli_parse_unc(const char *unc_name, TALLOC_CTX *mem_ctx,
369 char **hostname, char **sharename)
373 *hostname = *sharename = NULL;
375 if (strncmp(unc_name, "\\\\", 2) &&
376 strncmp(unc_name, "//", 2)) {
380 *hostname = talloc_strdup(mem_ctx, &unc_name[2]);
381 p = terminate_path_at_separator(*hostname);
384 *sharename = talloc_strdup(mem_ctx, p);
385 terminate_path_at_separator(*sharename);
388 if (*hostname && *sharename) {
392 TALLOC_FREE(*hostname);
393 TALLOC_FREE(*sharename);
397 static bool torture_open_connection_share(struct cli_state **c,
398 const char *hostname,
399 const char *sharename)
405 flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
407 flags |= CLI_FULL_CONNECTION_OPLOCKS;
408 if (use_level_II_oplocks)
409 flags |= CLI_FULL_CONNECTION_LEVEL_II_OPLOCKS;
411 status = cli_full_connection(c, myname,
412 hostname, NULL, port_to_use,
415 password, flags, signing_state);
416 if (!NT_STATUS_IS_OK(status)) {
417 printf("failed to open share connection: //%s/%s port:%d - %s\n",
418 hostname, sharename, port_to_use, nt_errstr(status));
422 (*c)->timeout = 120000; /* set a really long timeout (2 minutes) */
425 return force_cli_encryption(*c,
431 bool torture_open_connection(struct cli_state **c, int conn_index)
433 char **unc_list = NULL;
434 int num_unc_names = 0;
437 if (use_multishare_conn==True) {
439 unc_list = file_lines_load(multishare_conn_fname, &num_unc_names, 0, NULL);
440 if (!unc_list || num_unc_names <= 0) {
441 printf("Failed to load unc names list from '%s'\n", multishare_conn_fname);
445 if (!smbcli_parse_unc(unc_list[conn_index % num_unc_names],
447 printf("Failed to parse UNC name %s\n",
448 unc_list[conn_index % num_unc_names]);
449 TALLOC_FREE(unc_list);
453 result = torture_open_connection_share(c, h, s);
455 /* h, s were copied earlier */
456 TALLOC_FREE(unc_list);
460 return torture_open_connection_share(c, host, share);
463 bool torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
465 uint16 old_vuid = cli->vuid;
466 fstring old_user_name;
467 size_t passlen = strlen(password);
471 fstrcpy(old_user_name, cli->user_name);
473 ret = NT_STATUS_IS_OK(cli_session_setup(cli, username,
477 *new_vuid = cli->vuid;
478 cli->vuid = old_vuid;
479 status = cli_set_username(cli, old_user_name);
480 if (!NT_STATUS_IS_OK(status)) {
487 bool torture_close_connection(struct cli_state *c)
492 status = cli_tdis(c);
493 if (!NT_STATUS_IS_OK(status)) {
494 printf("tdis failed (%s)\n", nt_errstr(status));
504 /* check if the server produced the expected error code */
505 static bool check_error(int line, struct cli_state *c,
506 uint8 eclass, uint32 ecode, NTSTATUS nterr)
508 if (cli_is_dos_error(c)) {
512 /* Check DOS error */
514 cli_dos_error(c, &cclass, &num);
516 if (eclass != cclass || ecode != num) {
517 printf("unexpected error code class=%d code=%d\n",
518 (int)cclass, (int)num);
519 printf(" expected %d/%d %s (line=%d)\n",
520 (int)eclass, (int)ecode, nt_errstr(nterr), line);
529 status = cli_nt_error(c);
531 if (NT_STATUS_V(nterr) != NT_STATUS_V(status)) {
532 printf("unexpected error code %s\n", nt_errstr(status));
533 printf(" expected %s (line=%d)\n", nt_errstr(nterr), line);
542 static bool wait_lock(struct cli_state *c, int fnum, uint32 offset, uint32 len)
544 while (!cli_lock(c, fnum, offset, len, -1, WRITE_LOCK)) {
545 if (!check_error(__LINE__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
551 static bool rw_torture(struct cli_state *c)
553 const char *lockfname = "\\torture.lck";
557 pid_t pid2, pid = getpid();
563 memset(buf, '\0', sizeof(buf));
565 status = cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
567 if (!NT_STATUS_IS_OK(status)) {
568 status = cli_open(c, lockfname, O_RDWR, DENY_NONE, &fnum2);
570 if (!NT_STATUS_IS_OK(status)) {
571 printf("open of %s failed (%s)\n", lockfname, cli_errstr(c));
575 for (i=0;i<torture_numops;i++) {
576 unsigned n = (unsigned)sys_random()%10;
578 printf("%d\r", i); fflush(stdout);
580 slprintf(fname, sizeof(fstring) - 1, "\\torture.%u", n);
582 if (!wait_lock(c, fnum2, n*sizeof(int), sizeof(int))) {
586 if (!NT_STATUS_IS_OK(cli_open(c, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL, &fnum))) {
587 printf("open failed (%s)\n", cli_errstr(c));
592 if (cli_write(c, fnum, 0, (char *)&pid, 0, sizeof(pid)) != sizeof(pid)) {
593 printf("write failed (%s)\n", cli_errstr(c));
598 if (cli_write(c, fnum, 0, (char *)buf,
599 sizeof(pid)+(j*sizeof(buf)),
600 sizeof(buf)) != sizeof(buf)) {
601 printf("write failed (%s)\n", cli_errstr(c));
608 if (cli_read(c, fnum, (char *)&pid2, 0, sizeof(pid)) != sizeof(pid)) {
609 printf("read failed (%s)\n", cli_errstr(c));
614 printf("data corruption!\n");
618 if (!NT_STATUS_IS_OK(cli_close(c, fnum))) {
619 printf("close failed (%s)\n", cli_errstr(c));
623 if (!NT_STATUS_IS_OK(cli_unlink(c, fname, aSYSTEM | aHIDDEN))) {
624 printf("unlink failed (%s)\n", cli_errstr(c));
628 if (!NT_STATUS_IS_OK(cli_unlock(c, fnum2, n*sizeof(int), sizeof(int)))) {
629 printf("unlock failed (%s)\n", cli_errstr(c));
635 cli_unlink(c, lockfname, aSYSTEM | aHIDDEN);
642 static bool run_torture(int dummy)
644 struct cli_state *cli;
649 cli_sockopt(cli, sockops);
651 ret = rw_torture(cli);
653 if (!torture_close_connection(cli)) {
660 static bool rw_torture3(struct cli_state *c, char *lockfname)
662 uint16_t fnum = (uint16_t)-1;
667 unsigned countprev = 0;
673 for (i = 0; i < sizeof(buf); i += sizeof(uint32))
675 SIVAL(buf, i, sys_random());
680 if (!NT_STATUS_IS_OK(cli_open(c, lockfname, O_RDWR | O_CREAT | O_EXCL,
681 DENY_NONE, &fnum))) {
682 printf("first open read/write of %s failed (%s)\n",
683 lockfname, cli_errstr(c));
689 for (i = 0; i < 500 && fnum == (uint16_t)-1; i++)
691 status = cli_open(c, lockfname, O_RDONLY,
693 if (!NT_STATUS_IS_OK(status)) {
698 if (!NT_STATUS_IS_OK(status)) {
699 printf("second open read-only of %s failed (%s)\n",
700 lockfname, cli_errstr(c));
706 for (count = 0; count < sizeof(buf); count += sent)
708 if (count >= countprev) {
709 printf("%d %8d\r", i, count);
712 countprev += (sizeof(buf) / 20);
717 sent = ((unsigned)sys_random()%(20))+ 1;
718 if (sent > sizeof(buf) - count)
720 sent = sizeof(buf) - count;
723 if (cli_write(c, fnum, 0, buf+count, count, (size_t)sent) != sent) {
724 printf("write failed (%s)\n", cli_errstr(c));
730 sent = cli_read(c, fnum, buf_rd+count, count,
734 printf("read failed offset:%d size:%ld (%s)\n",
735 count, (unsigned long)sizeof(buf)-count,
742 if (memcmp(buf_rd+count, buf+count, sent) != 0)
744 printf("read/write compare failed\n");
745 printf("offset: %d req %ld recvd %ld\n", count, (unsigned long)sizeof(buf)-count, (unsigned long)sent);
754 if (!NT_STATUS_IS_OK(cli_close(c, fnum))) {
755 printf("close failed (%s)\n", cli_errstr(c));
762 static bool rw_torture2(struct cli_state *c1, struct cli_state *c2)
764 const char *lockfname = "\\torture2.lck";
773 if (!NT_STATUS_IS_OK(cli_unlink(c1, lockfname, aSYSTEM | aHIDDEN))) {
774 printf("unlink failed (%s) (normal, this file should not exist)\n", cli_errstr(c1));
777 if (!NT_STATUS_IS_OK(cli_open(c1, lockfname, O_RDWR | O_CREAT | O_EXCL,
778 DENY_NONE, &fnum1))) {
779 printf("first open read/write of %s failed (%s)\n",
780 lockfname, cli_errstr(c1));
783 if (!NT_STATUS_IS_OK(cli_open(c2, lockfname, O_RDONLY,
784 DENY_NONE, &fnum2))) {
785 printf("second open read-only of %s failed (%s)\n",
786 lockfname, cli_errstr(c2));
787 cli_close(c1, fnum1);
791 for (i=0;i<torture_numops;i++)
793 size_t buf_size = ((unsigned)sys_random()%(sizeof(buf)-1))+ 1;
795 printf("%d\r", i); fflush(stdout);
798 generate_random_buffer((unsigned char *)buf, buf_size);
800 if (cli_write(c1, fnum1, 0, buf, 0, buf_size) != buf_size) {
801 printf("write failed (%s)\n", cli_errstr(c1));
806 if ((bytes_read = cli_read(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
807 printf("read failed (%s)\n", cli_errstr(c2));
808 printf("read %d, expected %ld\n", (int)bytes_read,
809 (unsigned long)buf_size);
814 if (memcmp(buf_rd, buf, buf_size) != 0)
816 printf("read/write compare failed\n");
822 if (!NT_STATUS_IS_OK(cli_close(c2, fnum2))) {
823 printf("close failed (%s)\n", cli_errstr(c2));
826 if (!NT_STATUS_IS_OK(cli_close(c1, fnum1))) {
827 printf("close failed (%s)\n", cli_errstr(c1));
831 if (!NT_STATUS_IS_OK(cli_unlink(c1, lockfname, aSYSTEM | aHIDDEN))) {
832 printf("unlink failed (%s)\n", cli_errstr(c1));
839 static bool run_readwritetest(int dummy)
841 struct cli_state *cli1, *cli2;
842 bool test1, test2 = False;
844 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
847 cli_sockopt(cli1, sockops);
848 cli_sockopt(cli2, sockops);
850 printf("starting readwritetest\n");
852 test1 = rw_torture2(cli1, cli2);
853 printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));
856 test2 = rw_torture2(cli1, cli1);
857 printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));
860 if (!torture_close_connection(cli1)) {
864 if (!torture_close_connection(cli2)) {
868 return (test1 && test2);
871 static bool run_readwritemulti(int dummy)
873 struct cli_state *cli;
878 cli_sockopt(cli, sockops);
880 printf("run_readwritemulti: fname %s\n", randomfname);
881 test = rw_torture3(cli, randomfname);
883 if (!torture_close_connection(cli)) {
890 static bool run_readwritelarge_internal(int max_xmit_k)
892 static struct cli_state *cli1;
894 const char *lockfname = "\\large.dat";
899 if (!torture_open_connection(&cli1, 0)) {
902 cli_sockopt(cli1, sockops);
903 memset(buf,'\0',sizeof(buf));
905 cli1->max_xmit = max_xmit_k*1024;
907 if (signing_state == Required) {
908 /* Horrible cheat to force
909 multiple signed outstanding
910 packets against a Samba server.
912 cli1->is_samba = false;
915 printf("starting readwritelarge_internal\n");
917 cli_unlink(cli1, lockfname, aSYSTEM | aHIDDEN);
919 if (!NT_STATUS_IS_OK(cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE, &fnum1))) {
920 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
924 cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf));
926 if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
927 cli1, fnum1, NULL, &fsize, NULL, NULL,
928 NULL, NULL, NULL))) {
929 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
933 if (fsize == sizeof(buf))
934 printf("readwritelarge_internal test 1 succeeded (size = %lx)\n",
935 (unsigned long)fsize);
937 printf("readwritelarge_internal test 1 failed (size = %lx)\n",
938 (unsigned long)fsize);
942 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
943 printf("close failed (%s)\n", cli_errstr(cli1));
947 if (!NT_STATUS_IS_OK(cli_unlink(cli1, lockfname, aSYSTEM | aHIDDEN))) {
948 printf("unlink failed (%s)\n", cli_errstr(cli1));
952 if (!NT_STATUS_IS_OK(cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE, &fnum1))) {
953 printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));
957 cli1->max_xmit = 4*1024;
959 cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf));
961 if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
962 cli1, fnum1, NULL, &fsize, NULL, NULL,
963 NULL, NULL, NULL))) {
964 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
968 if (fsize == sizeof(buf))
969 printf("readwritelarge_internal test 2 succeeded (size = %lx)\n",
970 (unsigned long)fsize);
972 printf("readwritelarge_internal test 2 failed (size = %lx)\n",
973 (unsigned long)fsize);
978 /* ToDo - set allocation. JRA */
979 if(!cli_set_allocation_size(cli1, fnum1, 0)) {
980 printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
983 if (!cli_qfileinfo_basic(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL,
985 printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
989 printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);
992 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
993 printf("close failed (%s)\n", cli_errstr(cli1));
997 if (!torture_close_connection(cli1)) {
1003 static bool run_readwritelarge(int dummy)
1005 return run_readwritelarge_internal(128);
1008 static bool run_readwritelarge_signtest(int dummy)
1011 signing_state = Required;
1012 ret = run_readwritelarge_internal(2);
1013 signing_state = Undefined;
1020 #define ival(s) strtol(s, NULL, 0)
1022 /* run a test that simulates an approximate netbench client load */
1023 static bool run_netbench(int client)
1025 struct cli_state *cli;
1030 const char *params[20];
1031 bool correct = True;
1037 cli_sockopt(cli, sockops);
1041 slprintf(cname,sizeof(cname)-1, "client%d", client);
1043 f = fopen(client_txt, "r");
1050 while (fgets(line, sizeof(line)-1, f)) {
1054 line[strlen(line)-1] = 0;
1056 /* printf("[%d] %s\n", line_count, line); */
1058 all_string_sub(line,"client1", cname, sizeof(line));
1060 /* parse the command parameters */
1061 params[0] = strtok_r(line, " ", &saveptr);
1063 while (params[i]) params[++i] = strtok_r(NULL, " ", &saveptr);
1067 if (i < 2) continue;
1069 if (!strncmp(params[0],"SMB", 3)) {
1070 printf("ERROR: You are using a dbench 1 load file\n");
1074 if (!strcmp(params[0],"NTCreateX")) {
1075 nb_createx(params[1], ival(params[2]), ival(params[3]),
1077 } else if (!strcmp(params[0],"Close")) {
1078 nb_close(ival(params[1]));
1079 } else if (!strcmp(params[0],"Rename")) {
1080 nb_rename(params[1], params[2]);
1081 } else if (!strcmp(params[0],"Unlink")) {
1082 nb_unlink(params[1]);
1083 } else if (!strcmp(params[0],"Deltree")) {
1084 nb_deltree(params[1]);
1085 } else if (!strcmp(params[0],"Rmdir")) {
1086 nb_rmdir(params[1]);
1087 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
1088 nb_qpathinfo(params[1]);
1089 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
1090 nb_qfileinfo(ival(params[1]));
1091 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
1092 nb_qfsinfo(ival(params[1]));
1093 } else if (!strcmp(params[0],"FIND_FIRST")) {
1094 nb_findfirst(params[1]);
1095 } else if (!strcmp(params[0],"WriteX")) {
1096 nb_writex(ival(params[1]),
1097 ival(params[2]), ival(params[3]), ival(params[4]));
1098 } else if (!strcmp(params[0],"ReadX")) {
1099 nb_readx(ival(params[1]),
1100 ival(params[2]), ival(params[3]), ival(params[4]));
1101 } else if (!strcmp(params[0],"Flush")) {
1102 nb_flush(ival(params[1]));
1104 printf("Unknown operation %s\n", params[0]);
1112 if (!torture_close_connection(cli)) {
1120 /* run a test that simulates an approximate netbench client load */
1121 static bool run_nbench(int dummy)
1124 bool correct = True;
1130 signal(SIGALRM, nb_alarm);
1132 t = create_procs(run_netbench, &correct);
1135 printf("\nThroughput %g MB/sec\n",
1136 1.0e-6 * nbio_total() / t);
1142 This test checks for two things:
1144 1) correct support for retaining locks over a close (ie. the server
1145 must not use posix semantics)
1146 2) support for lock timeouts
1148 static bool run_locktest1(int dummy)
1150 struct cli_state *cli1, *cli2;
1151 const char *fname = "\\lockt1.lck";
1152 uint16_t fnum1, fnum2, fnum3;
1154 unsigned lock_timeout;
1156 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
1159 cli_sockopt(cli1, sockops);
1160 cli_sockopt(cli2, sockops);
1162 printf("starting locktest1\n");
1164 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
1166 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
1167 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
1170 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum2))) {
1171 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli1));
1174 if (!NT_STATUS_IS_OK(cli_open(cli2, fname, O_RDWR, DENY_NONE, &fnum3))) {
1175 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli2));
1179 if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
1180 printf("lock1 failed (%s)\n", cli_errstr(cli1));
1185 if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
1186 printf("lock2 succeeded! This is a locking bug\n");
1189 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
1190 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1194 lock_timeout = (1 + (random() % 20));
1195 printf("Testing lock timeout with timeout=%u\n", lock_timeout);
1197 if (cli_lock(cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {
1198 printf("lock3 succeeded! This is a locking bug\n");
1201 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
1202 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
1206 if (ABS(t2 - t1) < lock_timeout-1) {
1207 printf("error: This server appears not to support timed lock requests\n");
1210 printf("server slept for %u seconds for a %u second timeout\n",
1211 (unsigned int)(t2-t1), lock_timeout);
1213 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum2))) {
1214 printf("close1 failed (%s)\n", cli_errstr(cli1));
1218 if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {
1219 printf("lock4 succeeded! This is a locking bug\n");
1222 if (!check_error(__LINE__, cli2, ERRDOS, ERRlock,
1223 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
1226 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
1227 printf("close2 failed (%s)\n", cli_errstr(cli1));
1231 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum3))) {
1232 printf("close3 failed (%s)\n", cli_errstr(cli2));
1236 if (!NT_STATUS_IS_OK(cli_unlink(cli1, fname, aSYSTEM | aHIDDEN))) {
1237 printf("unlink failed (%s)\n", cli_errstr(cli1));
1242 if (!torture_close_connection(cli1)) {
1246 if (!torture_close_connection(cli2)) {
1250 printf("Passed locktest1\n");
1255 this checks to see if a secondary tconx can use open files from an
1258 static bool run_tcon_test(int dummy)
1260 static struct cli_state *cli;
1261 const char *fname = "\\tcontest.tmp";
1263 uint16 cnum1, cnum2, cnum3;
1264 uint16 vuid1, vuid2;
1269 memset(buf, '\0', sizeof(buf));
1271 if (!torture_open_connection(&cli, 0)) {
1274 cli_sockopt(cli, sockops);
1276 printf("starting tcontest\n");
1278 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
1280 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
1281 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
1288 if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) {
1289 printf("initial write failed (%s)", cli_errstr(cli));
1293 status = cli_tcon_andx(cli, share, "?????",
1294 password, strlen(password)+1);
1295 if (!NT_STATUS_IS_OK(status)) {
1296 printf("%s refused 2nd tree connect (%s)\n", host,
1303 cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
1304 vuid2 = cli->vuid + 1;
1306 /* try a write with the wrong tid */
1309 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
1310 printf("* server allows write with wrong TID\n");
1313 printf("server fails write with wrong TID : %s\n", cli_errstr(cli));
1317 /* try a write with an invalid tid */
1320 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
1321 printf("* server allows write with invalid TID\n");
1324 printf("server fails write with invalid TID : %s\n", cli_errstr(cli));
1327 /* try a write with an invalid vuid */
1331 if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
1332 printf("* server allows write with invalid VUID\n");
1335 printf("server fails write with invalid VUID : %s\n", cli_errstr(cli));
1341 if (!NT_STATUS_IS_OK(cli_close(cli, fnum1))) {
1342 printf("close failed (%s)\n", cli_errstr(cli));
1348 status = cli_tdis(cli);
1349 if (!NT_STATUS_IS_OK(status)) {
1350 printf("secondary tdis failed (%s)\n", nt_errstr(status));
1356 if (!torture_close_connection(cli)) {
1365 checks for old style tcon support
1367 static bool run_tcon2_test(int dummy)
1369 static struct cli_state *cli;
1370 uint16 cnum, max_xmit;
1374 if (!torture_open_connection(&cli, 0)) {
1377 cli_sockopt(cli, sockops);
1379 printf("starting tcon2 test\n");
1381 if (asprintf(&service, "\\\\%s\\%s", host, share) == -1) {
1385 status = cli_raw_tcon(cli, service, password, "?????", &max_xmit, &cnum);
1387 if (!NT_STATUS_IS_OK(status)) {
1388 printf("tcon2 failed : %s\n", cli_errstr(cli));
1390 printf("tcon OK : max_xmit=%d cnum=%d tid=%d\n",
1391 (int)max_xmit, (int)cnum, SVAL(cli->inbuf, smb_tid));
1394 if (!torture_close_connection(cli)) {
1398 printf("Passed tcon2 test\n");
1402 static bool tcon_devtest(struct cli_state *cli,
1403 const char *myshare, const char *devtype,
1404 const char *return_devtype,
1405 NTSTATUS expected_error)
1410 status = cli_tcon_andx(cli, myshare, devtype,
1411 password, strlen(password)+1);
1413 if (NT_STATUS_IS_OK(expected_error)) {
1414 if (NT_STATUS_IS_OK(status)) {
1415 if (strcmp(cli->dev, return_devtype) == 0) {
1418 printf("tconX to share %s with type %s "
1419 "succeeded but returned the wrong "
1420 "device type (got [%s] but should have got [%s])\n",
1421 myshare, devtype, cli->dev, return_devtype);
1425 printf("tconX to share %s with type %s "
1426 "should have succeeded but failed\n",
1432 if (NT_STATUS_IS_OK(status)) {
1433 printf("tconx to share %s with type %s "
1434 "should have failed but succeeded\n",
1438 if (NT_STATUS_EQUAL(cli_nt_error(cli),
1442 printf("Returned unexpected error\n");
1451 checks for correct tconX support
1453 static bool run_tcon_devtype_test(int dummy)
1455 static struct cli_state *cli1 = NULL;
1460 status = cli_full_connection(&cli1, myname,
1461 host, NULL, port_to_use,
1463 username, workgroup,
1464 password, flags, signing_state);
1466 if (!NT_STATUS_IS_OK(status)) {
1467 printf("could not open connection\n");
1471 if (!tcon_devtest(cli1, "IPC$", "A:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1474 if (!tcon_devtest(cli1, "IPC$", "?????", "IPC", NT_STATUS_OK))
1477 if (!tcon_devtest(cli1, "IPC$", "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1480 if (!tcon_devtest(cli1, "IPC$", "IPC", "IPC", NT_STATUS_OK))
1483 if (!tcon_devtest(cli1, "IPC$", "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1486 if (!tcon_devtest(cli1, share, "A:", "A:", NT_STATUS_OK))
1489 if (!tcon_devtest(cli1, share, "?????", "A:", NT_STATUS_OK))
1492 if (!tcon_devtest(cli1, share, "LPT:", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1495 if (!tcon_devtest(cli1, share, "IPC", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1498 if (!tcon_devtest(cli1, share, "FOOBA", NULL, NT_STATUS_BAD_DEVICE_TYPE))
1504 printf("Passed tcondevtest\n");
1511 This test checks that
1513 1) the server supports multiple locking contexts on the one SMB
1514 connection, distinguished by PID.
1516 2) the server correctly fails overlapping locks made by the same PID (this
1517 goes against POSIX behaviour, which is why it is tricky to implement)
1519 3) the server denies unlock requests by an incorrect client PID
1521 static bool run_locktest2(int dummy)
1523 static struct cli_state *cli;
1524 const char *fname = "\\lockt2.lck";
1525 uint16_t fnum1, fnum2, fnum3;
1526 bool correct = True;
1528 if (!torture_open_connection(&cli, 0)) {
1532 cli_sockopt(cli, sockops);
1534 printf("starting locktest2\n");
1536 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
1540 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
1541 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
1545 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum2))) {
1546 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli));
1552 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum3))) {
1553 printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli));
1559 if (!cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1560 printf("lock1 failed (%s)\n", cli_errstr(cli));
1564 if (cli_lock(cli, fnum1, 0, 4, 0, WRITE_LOCK)) {
1565 printf("WRITE lock1 succeeded! This is a locking bug\n");
1568 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1569 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1572 if (cli_lock(cli, fnum2, 0, 4, 0, WRITE_LOCK)) {
1573 printf("WRITE lock2 succeeded! This is a locking bug\n");
1576 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1577 NT_STATUS_LOCK_NOT_GRANTED)) return False;
1580 if (cli_lock(cli, fnum2, 0, 4, 0, READ_LOCK)) {
1581 printf("READ lock2 succeeded! This is a locking bug\n");
1584 if (!check_error(__LINE__, cli, ERRDOS, ERRlock,
1585 NT_STATUS_FILE_LOCK_CONFLICT)) return False;
1588 if (!cli_lock(cli, fnum1, 100, 4, 0, WRITE_LOCK)) {
1589 printf("lock at 100 failed (%s)\n", cli_errstr(cli));
1592 if (NT_STATUS_IS_OK(cli_unlock(cli, fnum1, 100, 4))) {
1593 printf("unlock at 100 succeeded! This is a locking bug\n");
1597 if (NT_STATUS_IS_OK(cli_unlock(cli, fnum1, 0, 4))) {
1598 printf("unlock1 succeeded! This is a locking bug\n");
1601 if (!check_error(__LINE__, cli,
1603 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1606 if (NT_STATUS_IS_OK(cli_unlock(cli, fnum1, 0, 8))) {
1607 printf("unlock2 succeeded! This is a locking bug\n");
1610 if (!check_error(__LINE__, cli,
1612 NT_STATUS_RANGE_NOT_LOCKED)) return False;
1615 if (cli_lock(cli, fnum3, 0, 4, 0, WRITE_LOCK)) {
1616 printf("lock3 succeeded! This is a locking bug\n");
1619 if (!check_error(__LINE__, cli, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
1624 if (!NT_STATUS_IS_OK(cli_close(cli, fnum1))) {
1625 printf("close1 failed (%s)\n", cli_errstr(cli));
1629 if (!NT_STATUS_IS_OK(cli_close(cli, fnum2))) {
1630 printf("close2 failed (%s)\n", cli_errstr(cli));
1634 if (!NT_STATUS_IS_OK(cli_close(cli, fnum3))) {
1635 printf("close3 failed (%s)\n", cli_errstr(cli));
1639 if (!torture_close_connection(cli)) {
1643 printf("locktest2 finished\n");
1650 This test checks that
1652 1) the server supports the full offset range in lock requests
1654 static bool run_locktest3(int dummy)
1656 static struct cli_state *cli1, *cli2;
1657 const char *fname = "\\lockt3.lck";
1658 uint16_t fnum1, fnum2;
1661 bool correct = True;
1663 #define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
1665 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
1668 cli_sockopt(cli1, sockops);
1669 cli_sockopt(cli2, sockops);
1671 printf("starting locktest3\n");
1673 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
1675 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
1676 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
1679 if (!NT_STATUS_IS_OK(cli_open(cli2, fname, O_RDWR, DENY_NONE, &fnum2))) {
1680 printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli2));
1684 for (offset=i=0;i<torture_numops;i++) {
1686 if (!cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1687 printf("lock1 %d failed (%s)\n",
1693 if (!cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1694 printf("lock2 %d failed (%s)\n",
1701 for (offset=i=0;i<torture_numops;i++) {
1704 if (cli_lock(cli1, fnum1, offset-2, 1, 0, WRITE_LOCK)) {
1705 printf("error: lock1 %d succeeded!\n", i);
1709 if (cli_lock(cli2, fnum2, offset-1, 1, 0, WRITE_LOCK)) {
1710 printf("error: lock2 %d succeeded!\n", i);
1714 if (cli_lock(cli1, fnum1, offset-1, 1, 0, WRITE_LOCK)) {
1715 printf("error: lock3 %d succeeded!\n", i);
1719 if (cli_lock(cli2, fnum2, offset-2, 1, 0, WRITE_LOCK)) {
1720 printf("error: lock4 %d succeeded!\n", i);
1725 for (offset=i=0;i<torture_numops;i++) {
1728 if (!NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, offset-1, 1))) {
1729 printf("unlock1 %d failed (%s)\n",
1735 if (!NT_STATUS_IS_OK(cli_unlock(cli2, fnum2, offset-2, 1))) {
1736 printf("unlock2 %d failed (%s)\n",
1743 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
1744 printf("close1 failed (%s)\n", cli_errstr(cli1));
1748 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
1749 printf("close2 failed (%s)\n", cli_errstr(cli2));
1753 if (!NT_STATUS_IS_OK(cli_unlink(cli1, fname, aSYSTEM | aHIDDEN))) {
1754 printf("unlink failed (%s)\n", cli_errstr(cli1));
1758 if (!torture_close_connection(cli1)) {
1762 if (!torture_close_connection(cli2)) {
1766 printf("finished locktest3\n");
1771 #define EXPECTED(ret, v) if ((ret) != (v)) { \
1772 printf("** "); correct = False; \
1776 looks at overlapping locks
1778 static bool run_locktest4(int dummy)
1780 static struct cli_state *cli1, *cli2;
1781 const char *fname = "\\lockt4.lck";
1782 uint16_t fnum1, fnum2, f;
1785 bool correct = True;
1787 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
1791 cli_sockopt(cli1, sockops);
1792 cli_sockopt(cli2, sockops);
1794 printf("starting locktest4\n");
1796 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
1798 cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1);
1799 cli_open(cli2, fname, O_RDWR, DENY_NONE, &fnum2);
1801 memset(buf, 0, sizeof(buf));
1803 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1804 printf("Failed to create file\n");
1809 ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1810 cli_lock(cli1, fnum1, 2, 4, 0, WRITE_LOCK);
1811 EXPECTED(ret, False);
1812 printf("the same process %s set overlapping write locks\n", ret?"can":"cannot");
1814 ret = cli_lock(cli1, fnum1, 10, 4, 0, READ_LOCK) &&
1815 cli_lock(cli1, fnum1, 12, 4, 0, READ_LOCK);
1816 EXPECTED(ret, True);
1817 printf("the same process %s set overlapping read locks\n", ret?"can":"cannot");
1819 ret = cli_lock(cli1, fnum1, 20, 4, 0, WRITE_LOCK) &&
1820 cli_lock(cli2, fnum2, 22, 4, 0, WRITE_LOCK);
1821 EXPECTED(ret, False);
1822 printf("a different connection %s set overlapping write locks\n", ret?"can":"cannot");
1824 ret = cli_lock(cli1, fnum1, 30, 4, 0, READ_LOCK) &&
1825 cli_lock(cli2, fnum2, 32, 4, 0, READ_LOCK);
1826 EXPECTED(ret, True);
1827 printf("a different connection %s set overlapping read locks\n", ret?"can":"cannot");
1829 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 40, 4, 0, WRITE_LOCK)) &&
1830 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 42, 4, 0, WRITE_LOCK));
1831 EXPECTED(ret, False);
1832 printf("a different pid %s set overlapping write locks\n", ret?"can":"cannot");
1834 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 50, 4, 0, READ_LOCK)) &&
1835 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 52, 4, 0, READ_LOCK));
1836 EXPECTED(ret, True);
1837 printf("a different pid %s set overlapping read locks\n", ret?"can":"cannot");
1839 ret = cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK) &&
1840 cli_lock(cli1, fnum1, 60, 4, 0, READ_LOCK);
1841 EXPECTED(ret, True);
1842 printf("the same process %s set the same read lock twice\n", ret?"can":"cannot");
1844 ret = cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK) &&
1845 cli_lock(cli1, fnum1, 70, 4, 0, WRITE_LOCK);
1846 EXPECTED(ret, False);
1847 printf("the same process %s set the same write lock twice\n", ret?"can":"cannot");
1849 ret = cli_lock(cli1, fnum1, 80, 4, 0, READ_LOCK) &&
1850 cli_lock(cli1, fnum1, 80, 4, 0, WRITE_LOCK);
1851 EXPECTED(ret, False);
1852 printf("the same process %s overlay a read lock with a write lock\n", ret?"can":"cannot");
1854 ret = cli_lock(cli1, fnum1, 90, 4, 0, WRITE_LOCK) &&
1855 cli_lock(cli1, fnum1, 90, 4, 0, READ_LOCK);
1856 EXPECTED(ret, True);
1857 printf("the same process %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1859 ret = (cli_setpid(cli1, 1), cli_lock(cli1, fnum1, 100, 4, 0, WRITE_LOCK)) &&
1860 (cli_setpid(cli1, 2), cli_lock(cli1, fnum1, 100, 4, 0, READ_LOCK));
1861 EXPECTED(ret, False);
1862 printf("a different pid %s overlay a write lock with a read lock\n", ret?"can":"cannot");
1864 ret = cli_lock(cli1, fnum1, 110, 4, 0, READ_LOCK) &&
1865 cli_lock(cli1, fnum1, 112, 4, 0, READ_LOCK) &&
1866 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 110, 6));
1867 EXPECTED(ret, False);
1868 printf("the same process %s coalesce read locks\n", ret?"can":"cannot");
1871 ret = cli_lock(cli1, fnum1, 120, 4, 0, WRITE_LOCK) &&
1872 (cli_read(cli2, fnum2, buf, 120, 4) == 4);
1873 EXPECTED(ret, False);
1874 printf("this server %s strict write locking\n", ret?"doesn't do":"does");
1876 ret = cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK) &&
1877 (cli_write(cli2, fnum2, 0, buf, 130, 4) == 4);
1878 EXPECTED(ret, False);
1879 printf("this server %s strict read locking\n", ret?"doesn't do":"does");
1882 ret = cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1883 cli_lock(cli1, fnum1, 140, 4, 0, READ_LOCK) &&
1884 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 140, 4)) &&
1885 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 140, 4));
1886 EXPECTED(ret, True);
1887 printf("this server %s do recursive read locking\n", ret?"does":"doesn't");
1890 ret = cli_lock(cli1, fnum1, 150, 4, 0, WRITE_LOCK) &&
1891 cli_lock(cli1, fnum1, 150, 4, 0, READ_LOCK) &&
1892 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 150, 4)) &&
1893 (cli_read(cli2, fnum2, buf, 150, 4) == 4) &&
1894 !(cli_write(cli2, fnum2, 0, buf, 150, 4) == 4) &&
1895 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 150, 4));
1896 EXPECTED(ret, True);
1897 printf("this server %s do recursive lock overlays\n", ret?"does":"doesn't");
1899 ret = cli_lock(cli1, fnum1, 160, 4, 0, READ_LOCK) &&
1900 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 160, 4)) &&
1901 (cli_write(cli2, fnum2, 0, buf, 160, 4) == 4) &&
1902 (cli_read(cli2, fnum2, buf, 160, 4) == 4);
1903 EXPECTED(ret, True);
1904 printf("the same process %s remove a read lock using write locking\n", ret?"can":"cannot");
1906 ret = cli_lock(cli1, fnum1, 170, 4, 0, WRITE_LOCK) &&
1907 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 170, 4)) &&
1908 (cli_write(cli2, fnum2, 0, buf, 170, 4) == 4) &&
1909 (cli_read(cli2, fnum2, buf, 170, 4) == 4);
1910 EXPECTED(ret, True);
1911 printf("the same process %s remove a write lock using read locking\n", ret?"can":"cannot");
1913 ret = cli_lock(cli1, fnum1, 190, 4, 0, WRITE_LOCK) &&
1914 cli_lock(cli1, fnum1, 190, 4, 0, READ_LOCK) &&
1915 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 190, 4)) &&
1916 !(cli_write(cli2, fnum2, 0, buf, 190, 4) == 4) &&
1917 (cli_read(cli2, fnum2, buf, 190, 4) == 4);
1918 EXPECTED(ret, True);
1919 printf("the same process %s remove the first lock first\n", ret?"does":"doesn't");
1921 cli_close(cli1, fnum1);
1922 cli_close(cli2, fnum2);
1923 cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1);
1924 cli_open(cli1, fname, O_RDWR, DENY_NONE, &f);
1925 ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1926 cli_lock(cli1, f, 0, 1, 0, READ_LOCK) &&
1927 NT_STATUS_IS_OK(cli_close(cli1, fnum1)) &&
1928 NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1)) &&
1929 cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1931 cli_close(cli1, fnum1);
1932 EXPECTED(ret, True);
1933 printf("the server %s have the NT byte range lock bug\n", !ret?"does":"doesn't");
1936 cli_close(cli1, fnum1);
1937 cli_close(cli2, fnum2);
1938 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
1939 torture_close_connection(cli1);
1940 torture_close_connection(cli2);
1942 printf("finished locktest4\n");
1947 looks at lock upgrade/downgrade.
1949 static bool run_locktest5(int dummy)
1951 static struct cli_state *cli1, *cli2;
1952 const char *fname = "\\lockt5.lck";
1953 uint16_t fnum1, fnum2, fnum3;
1956 bool correct = True;
1958 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
1962 cli_sockopt(cli1, sockops);
1963 cli_sockopt(cli2, sockops);
1965 printf("starting locktest5\n");
1967 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
1969 cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1);
1970 cli_open(cli2, fname, O_RDWR, DENY_NONE, &fnum2);
1971 cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum3);
1973 memset(buf, 0, sizeof(buf));
1975 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
1976 printf("Failed to create file\n");
1981 /* Check for NT bug... */
1982 ret = cli_lock(cli1, fnum1, 0, 8, 0, READ_LOCK) &&
1983 cli_lock(cli1, fnum3, 0, 1, 0, READ_LOCK);
1984 cli_close(cli1, fnum1);
1985 cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1);
1986 ret = cli_lock(cli1, fnum1, 7, 1, 0, WRITE_LOCK);
1987 EXPECTED(ret, True);
1988 printf("this server %s the NT locking bug\n", ret ? "doesn't have" : "has");
1989 cli_close(cli1, fnum1);
1990 cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1);
1991 cli_unlock(cli1, fnum3, 0, 1);
1993 ret = cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK) &&
1994 cli_lock(cli1, fnum1, 1, 1, 0, READ_LOCK);
1995 EXPECTED(ret, True);
1996 printf("the same process %s overlay a write with a read lock\n", ret?"can":"cannot");
1998 ret = cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
1999 EXPECTED(ret, False);
2001 printf("a different processs %s get a read lock on the first process lock stack\n", ret?"can":"cannot");
2003 /* Unlock the process 2 lock. */
2004 cli_unlock(cli2, fnum2, 0, 4);
2006 ret = cli_lock(cli1, fnum3, 0, 4, 0, READ_LOCK);
2007 EXPECTED(ret, False);
2009 printf("the same processs on a different fnum %s get a read lock\n", ret?"can":"cannot");
2011 /* Unlock the process 1 fnum3 lock. */
2012 cli_unlock(cli1, fnum3, 0, 4);
2014 /* Stack 2 more locks here. */
2015 ret = cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK) &&
2016 cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK);
2018 EXPECTED(ret, True);
2019 printf("the same process %s stack read locks\n", ret?"can":"cannot");
2021 /* Unlock the first process lock, then check this was the WRITE lock that was
2024 ret = NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 0, 4)) &&
2025 cli_lock(cli2, fnum2, 0, 4, 0, READ_LOCK);
2027 EXPECTED(ret, True);
2028 printf("the first unlock removes the %s lock\n", ret?"WRITE":"READ");
2030 /* Unlock the process 2 lock. */
2031 cli_unlock(cli2, fnum2, 0, 4);
2033 /* We should have 3 stacked locks here. Ensure we need to do 3 unlocks. */
2035 ret = NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 1, 1)) &&
2036 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 0, 4)) &&
2037 NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 0, 4));
2039 EXPECTED(ret, True);
2040 printf("the same process %s unlock the stack of 4 locks\n", ret?"can":"cannot");
2042 /* Ensure the next unlock fails. */
2043 ret = NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 0, 4));
2044 EXPECTED(ret, False);
2045 printf("the same process %s count the lock stack\n", !ret?"can":"cannot");
2047 /* Ensure connection 2 can get a write lock. */
2048 ret = cli_lock(cli2, fnum2, 0, 4, 0, WRITE_LOCK);
2049 EXPECTED(ret, True);
2051 printf("a different processs %s get a write lock on the unlocked stack\n", ret?"can":"cannot");
2055 cli_close(cli1, fnum1);
2056 cli_close(cli2, fnum2);
2057 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2058 if (!torture_close_connection(cli1)) {
2061 if (!torture_close_connection(cli2)) {
2065 printf("finished locktest5\n");
2071 tries the unusual lockingX locktype bits
2073 static bool run_locktest6(int dummy)
2075 static struct cli_state *cli;
2076 const char *fname[1] = { "\\lock6.txt" };
2081 if (!torture_open_connection(&cli, 0)) {
2085 cli_sockopt(cli, sockops);
2087 printf("starting locktest6\n");
2090 printf("Testing %s\n", fname[i]);
2092 cli_unlink(cli, fname[i], aSYSTEM | aHIDDEN);
2094 cli_open(cli, fname[i], O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum);
2095 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CHANGE_LOCKTYPE);
2096 cli_close(cli, fnum);
2097 printf("CHANGE_LOCKTYPE gave %s\n", nt_errstr(status));
2099 cli_open(cli, fname[i], O_RDWR, DENY_NONE, &fnum);
2100 status = cli_locktype(cli, fnum, 0, 8, 0, LOCKING_ANDX_CANCEL_LOCK);
2101 cli_close(cli, fnum);
2102 printf("CANCEL_LOCK gave %s\n", nt_errstr(status));
2104 cli_unlink(cli, fname[i], aSYSTEM | aHIDDEN);
2107 torture_close_connection(cli);
2109 printf("finished locktest6\n");
2113 static bool run_locktest7(int dummy)
2115 struct cli_state *cli1;
2116 const char *fname = "\\lockt7.lck";
2119 bool correct = False;
2121 if (!torture_open_connection(&cli1, 0)) {
2125 cli_sockopt(cli1, sockops);
2127 printf("starting locktest7\n");
2129 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2131 cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1);
2133 memset(buf, 0, sizeof(buf));
2135 if (cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) {
2136 printf("Failed to create file\n");
2140 cli_setpid(cli1, 1);
2142 if (!cli_lock(cli1, fnum1, 130, 4, 0, READ_LOCK)) {
2143 printf("Unable to apply read lock on range 130:4, error was %s\n", cli_errstr(cli1));
2146 printf("pid1 successfully locked range 130:4 for READ\n");
2149 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
2150 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
2153 printf("pid1 successfully read the range 130:4\n");
2156 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
2157 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
2158 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
2159 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
2163 printf("pid1 successfully wrote to the range 130:4 (should be denied)\n");
2167 cli_setpid(cli1, 2);
2169 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
2170 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
2172 printf("pid2 successfully read the range 130:4\n");
2175 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
2176 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
2177 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
2178 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
2182 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
2186 cli_setpid(cli1, 1);
2187 cli_unlock(cli1, fnum1, 130, 4);
2189 if (!cli_lock(cli1, fnum1, 130, 4, 0, WRITE_LOCK)) {
2190 printf("Unable to apply write lock on range 130:4, error was %s\n", cli_errstr(cli1));
2193 printf("pid1 successfully locked range 130:4 for WRITE\n");
2196 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
2197 printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
2200 printf("pid1 successfully read the range 130:4\n");
2203 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
2204 printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
2207 printf("pid1 successfully wrote to the range 130:4\n");
2210 cli_setpid(cli1, 2);
2212 if (cli_read(cli1, fnum1, buf, 130, 4) != 4) {
2213 printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
2214 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
2215 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
2219 printf("pid2 successfully read the range 130:4 (should be denied)\n");
2223 if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4) {
2224 printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(cli1));
2225 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
2226 printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
2230 printf("pid2 successfully wrote to the range 130:4 (should be denied)\n");
2234 cli_unlock(cli1, fnum1, 130, 0);
2238 cli_close(cli1, fnum1);
2239 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2240 torture_close_connection(cli1);
2242 printf("finished locktest7\n");
2247 * This demonstrates a problem with our use of GPFS share modes: A file
2248 * descriptor sitting in the pending close queue holding a GPFS share mode
2249 * blocks opening a file another time. Happens with Word 2007 temp files.
2250 * With "posix locking = yes" and "gpfs:sharemodes = yes" enabled, the third
2251 * open is denied with NT_STATUS_SHARING_VIOLATION.
2254 static bool run_locktest8(int dummy)
2256 struct cli_state *cli1;
2257 const char *fname = "\\lockt8.lck";
2258 uint16_t fnum1, fnum2;
2260 bool correct = False;
2263 if (!torture_open_connection(&cli1, 0)) {
2267 cli_sockopt(cli1, sockops);
2269 printf("starting locktest8\n");
2271 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2273 status = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_WRITE,
2275 if (!NT_STATUS_IS_OK(status)) {
2276 d_fprintf(stderr, "cli_open returned %s\n", cli_errstr(cli1));
2280 memset(buf, 0, sizeof(buf));
2282 status = cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum2);
2283 if (!NT_STATUS_IS_OK(status)) {
2284 d_fprintf(stderr, "cli_open second time returned %s\n",
2289 if (!cli_lock(cli1, fnum2, 1, 1, 0, READ_LOCK)) {
2290 printf("Unable to apply read lock on range 1:1, error was "
2291 "%s\n", cli_errstr(cli1));
2295 status = cli_close(cli1, fnum1);
2296 if (!NT_STATUS_IS_OK(status)) {
2297 d_fprintf(stderr, "cli_close(fnum1) %s\n", cli_errstr(cli1));
2301 status = cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1);
2302 if (!NT_STATUS_IS_OK(status)) {
2303 d_fprintf(stderr, "cli_open third time returned %s\n",
2311 cli_close(cli1, fnum1);
2312 cli_close(cli1, fnum2);
2313 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2314 torture_close_connection(cli1);
2316 printf("finished locktest8\n");
2321 * This test is designed to be run in conjunction with
2322 * external NFS or POSIX locks taken in the filesystem.
2323 * It checks that the smbd server will block until the
2324 * lock is released and then acquire it. JRA.
2327 static bool got_alarm;
2328 static int alarm_fd;
2330 static void alarm_handler(int dummy)
2335 static void alarm_handler_parent(int dummy)
2340 static void do_local_lock(int read_fd, int write_fd)
2345 const char *local_pathname = NULL;
2348 local_pathname = talloc_asprintf(talloc_tos(),
2349 "%s/lockt9.lck", local_path);
2350 if (!local_pathname) {
2351 printf("child: alloc fail\n");
2355 unlink(local_pathname);
2356 fd = open(local_pathname, O_RDWR|O_CREAT, 0666);
2358 printf("child: open of %s failed %s.\n",
2359 local_pathname, strerror(errno));
2363 /* Now take a fcntl lock. */
2364 lock.l_type = F_WRLCK;
2365 lock.l_whence = SEEK_SET;
2368 lock.l_pid = getpid();
2370 ret = fcntl(fd,F_SETLK,&lock);
2372 printf("child: failed to get lock 0:4 on file %s. Error %s\n",
2373 local_pathname, strerror(errno));
2376 printf("child: got lock 0:4 on file %s.\n",
2381 CatchSignal(SIGALRM, alarm_handler);
2383 /* Signal the parent. */
2384 if (write(write_fd, &c, 1) != 1) {
2385 printf("child: start signal fail %s.\n",
2392 /* Wait for the parent to be ready. */
2393 if (read(read_fd, &c, 1) != 1) {
2394 printf("child: reply signal fail %s.\n",
2402 printf("child: released lock 0:4 on file %s.\n",
2408 static bool run_locktest9(int dummy)
2410 struct cli_state *cli1;
2411 const char *fname = "\\lockt9.lck";
2413 bool correct = False;
2414 int pipe_in[2], pipe_out[2];
2418 struct timeval start;
2422 printf("starting locktest9\n");
2424 if (local_path == NULL) {
2425 d_fprintf(stderr, "locktest9 must be given a local path via -l <localpath>\n");
2429 if (pipe(pipe_in) == -1 || pipe(pipe_out) == -1) {
2434 if (child_pid == -1) {
2438 if (child_pid == 0) {
2440 do_local_lock(pipe_out[0], pipe_in[1]);
2450 ret = read(pipe_in[0], &c, 1);
2452 d_fprintf(stderr, "failed to read start signal from child. %s\n",
2457 if (!torture_open_connection(&cli1, 0)) {
2461 cli_sockopt(cli1, sockops);
2463 status = cli_open(cli1, fname, O_RDWR, DENY_NONE,
2465 if (!NT_STATUS_IS_OK(status)) {
2466 d_fprintf(stderr, "cli_open returned %s\n", cli_errstr(cli1));
2470 /* Ensure the child has the lock. */
2471 if (cli_lock(cli1, fnum, 0, 4, 0, WRITE_LOCK)) {
2472 d_fprintf(stderr, "Got the lock on range 0:4 - this should not happen !\n");
2475 d_printf("Child has the lock.\n");
2478 /* Tell the child to wait 5 seconds then exit. */
2479 ret = write(pipe_out[1], &c, 1);
2481 d_fprintf(stderr, "failed to send exit signal to child. %s\n",
2486 /* Wait 20 seconds for the lock. */
2487 alarm_fd = cli1->fd;
2488 CatchSignal(SIGALRM, alarm_handler_parent);
2491 start = timeval_current();
2493 if (!cli_lock(cli1, fnum, 0, 4, -1, WRITE_LOCK)) {
2494 d_fprintf(stderr, "Unable to apply write lock on range 0:4, error was "
2495 "%s\n", cli_errstr(cli1));
2500 seconds = timeval_elapsed(&start);
2502 printf("Parent got the lock after %.2f seconds.\n",
2505 status = cli_close(cli1, fnum);
2506 if (!NT_STATUS_IS_OK(status)) {
2507 d_fprintf(stderr, "cli_close(fnum1) %s\n", cli_errstr(cli1));
2514 cli_close(cli1, fnum);
2515 torture_close_connection(cli1);
2519 printf("finished locktest9\n");
2524 test whether fnums and tids open on one VC are available on another (a major
2527 static bool run_fdpasstest(int dummy)
2529 struct cli_state *cli1, *cli2;
2530 const char *fname = "\\fdpass.tst";
2534 if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
2537 cli_sockopt(cli1, sockops);
2538 cli_sockopt(cli2, sockops);
2540 printf("starting fdpasstest\n");
2542 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2544 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
2545 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
2549 if (cli_write(cli1, fnum1, 0, "hello world\n", 0, 13) != 13) {
2550 printf("write failed (%s)\n", cli_errstr(cli1));
2554 cli2->vuid = cli1->vuid;
2555 cli2->cnum = cli1->cnum;
2556 cli2->pid = cli1->pid;
2558 if (cli_read(cli2, fnum1, buf, 0, 13) == 13) {
2559 printf("read succeeded! nasty security hole [%s]\n",
2564 cli_close(cli1, fnum1);
2565 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
2567 torture_close_connection(cli1);
2568 torture_close_connection(cli2);
2570 printf("finished fdpasstest\n");
2574 static bool run_fdsesstest(int dummy)
2576 struct cli_state *cli;
2581 const char *fname = "\\fdsess.tst";
2582 const char *fname1 = "\\fdsess1.tst";
2588 if (!torture_open_connection(&cli, 0))
2590 cli_sockopt(cli, sockops);
2592 if (!torture_cli_session_setup2(cli, &new_vuid))
2595 saved_cnum = cli->cnum;
2596 if (!NT_STATUS_IS_OK(cli_tcon_andx(cli, share, "?????", "", 1)))
2598 new_cnum = cli->cnum;
2599 cli->cnum = saved_cnum;
2601 printf("starting fdsesstest\n");
2603 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2604 cli_unlink(cli, fname1, aSYSTEM | aHIDDEN);
2606 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
2607 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
2611 if (cli_write(cli, fnum1, 0, "hello world\n", 0, 13) != 13) {
2612 printf("write failed (%s)\n", cli_errstr(cli));
2616 saved_vuid = cli->vuid;
2617 cli->vuid = new_vuid;
2619 if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
2620 printf("read succeeded with different vuid! nasty security hole [%s]\n",
2624 /* Try to open a file with different vuid, samba cnum. */
2625 if (NT_STATUS_IS_OK(cli_open(cli, fname1, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum2))) {
2626 printf("create with different vuid, same cnum succeeded.\n");
2627 cli_close(cli, fnum2);
2628 cli_unlink(cli, fname1, aSYSTEM | aHIDDEN);
2630 printf("create with different vuid, same cnum failed.\n");
2631 printf("This will cause problems with service clients.\n");
2635 cli->vuid = saved_vuid;
2637 /* Try with same vuid, different cnum. */
2638 cli->cnum = new_cnum;
2640 if (cli_read(cli, fnum1, buf, 0, 13) == 13) {
2641 printf("read succeeded with different cnum![%s]\n",
2646 cli->cnum = saved_cnum;
2647 cli_close(cli, fnum1);
2648 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2650 torture_close_connection(cli);
2652 printf("finished fdsesstest\n");
2657 This test checks that
2659 1) the server does not allow an unlink on a file that is open
2661 static bool run_unlinktest(int dummy)
2663 struct cli_state *cli;
2664 const char *fname = "\\unlink.tst";
2666 bool correct = True;
2668 if (!torture_open_connection(&cli, 0)) {
2672 cli_sockopt(cli, sockops);
2674 printf("starting unlink test\n");
2676 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2680 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum))) {
2681 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
2685 if (NT_STATUS_IS_OK(cli_unlink(cli, fname, aSYSTEM | aHIDDEN))) {
2686 printf("error: server allowed unlink on an open file\n");
2689 correct = check_error(__LINE__, cli, ERRDOS, ERRbadshare,
2690 NT_STATUS_SHARING_VIOLATION);
2693 cli_close(cli, fnum);
2694 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2696 if (!torture_close_connection(cli)) {
2700 printf("unlink test finished\n");
2707 test how many open files this server supports on the one socket
2709 static bool run_maxfidtest(int dummy)
2711 struct cli_state *cli;
2712 const char *ftemplate = "\\maxfid.%d.%d";
2714 uint16_t fnums[0x11000];
2717 bool correct = True;
2722 printf("failed to connect\n");
2726 cli_sockopt(cli, sockops);
2728 for (i=0; i<0x11000; i++) {
2729 slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
2730 if (!NT_STATUS_IS_OK(cli_open(cli, fname,
2731 O_RDWR|O_CREAT|O_TRUNC, DENY_NONE, &fnums[i]))) {
2732 printf("open of %s failed (%s)\n",
2733 fname, cli_errstr(cli));
2734 printf("maximum fnum is %d\n", i);
2742 printf("cleaning up\n");
2744 slprintf(fname,sizeof(fname)-1,ftemplate, i,(int)getpid());
2745 cli_close(cli, fnums[i]);
2746 if (!NT_STATUS_IS_OK(cli_unlink(cli, fname, aSYSTEM | aHIDDEN))) {
2747 printf("unlink of %s failed (%s)\n",
2748 fname, cli_errstr(cli));
2755 printf("maxfid test finished\n");
2756 if (!torture_close_connection(cli)) {
2762 /* generate a random buffer */
2763 static void rand_buf(char *buf, int len)
2766 *buf = (char)sys_random();
2771 /* send smb negprot commands, not reading the response */
2772 static bool run_negprot_nowait(int dummy)
2775 static struct cli_state *cli;
2776 bool correct = True;
2778 printf("starting negprot nowait test\n");
2780 if (!(cli = open_nbt_connection())) {
2784 for (i=0;i<50000;i++) {
2785 cli_negprot_sendsync(cli);
2788 if (!torture_close_connection(cli)) {
2792 printf("finished negprot nowait test\n");
2797 /* send smb negprot commands, not reading the response */
2798 static bool run_bad_nbt_session(int dummy)
2800 static struct cli_state *cli;
2802 printf("starting bad nbt session test\n");
2804 if (!(cli = open_bad_nbt_connection())) {
2809 printf("finished bad nbt session test\n");
2813 /* send random IPC commands */
2814 static bool run_randomipc(int dummy)
2816 char *rparam = NULL;
2818 unsigned int rdrcnt,rprcnt;
2820 int api, param_len, i;
2821 struct cli_state *cli;
2822 bool correct = True;
2825 printf("starting random ipc test\n");
2827 if (!torture_open_connection(&cli, 0)) {
2831 for (i=0;i<count;i++) {
2832 api = sys_random() % 500;
2833 param_len = (sys_random() % 64);
2835 rand_buf(param, param_len);
2840 param, param_len, 8,
2841 NULL, 0, BUFFER_SIZE,
2845 printf("%d/%d\r", i,count);
2848 printf("%d/%d\n", i, count);
2850 if (!torture_close_connection(cli)) {
2854 printf("finished random ipc test\n");
2861 static void browse_callback(const char *sname, uint32 stype,
2862 const char *comment, void *state)
2864 printf("\t%20.20s %08x %s\n", sname, stype, comment);
2870 This test checks the browse list code
2873 static bool run_browsetest(int dummy)
2875 static struct cli_state *cli;
2876 bool correct = True;
2878 printf("starting browse test\n");
2880 if (!torture_open_connection(&cli, 0)) {
2884 printf("domain list:\n");
2885 cli_NetServerEnum(cli, cli->server_domain,
2886 SV_TYPE_DOMAIN_ENUM,
2887 browse_callback, NULL);
2889 printf("machine list:\n");
2890 cli_NetServerEnum(cli, cli->server_domain,
2892 browse_callback, NULL);
2894 if (!torture_close_connection(cli)) {
2898 printf("browse test finished\n");
2906 This checks how the getatr calls works
2908 static bool run_attrtest(int dummy)
2910 struct cli_state *cli;
2913 const char *fname = "\\attrib123456789.tst";
2914 bool correct = True;
2916 printf("starting attrib test\n");
2918 if (!torture_open_connection(&cli, 0)) {
2922 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2923 cli_open(cli, fname,
2924 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
2925 cli_close(cli, fnum);
2926 if (!NT_STATUS_IS_OK(cli_getatr(cli, fname, NULL, NULL, &t))) {
2927 printf("getatr failed (%s)\n", cli_errstr(cli));
2931 if (abs(t - time(NULL)) > 60*60*24*10) {
2932 printf("ERROR: SMBgetatr bug. time is %s",
2938 t2 = t-60*60*24; /* 1 day ago */
2940 if (!NT_STATUS_IS_OK(cli_setatr(cli, fname, 0, t2))) {
2941 printf("setatr failed (%s)\n", cli_errstr(cli));
2945 if (!NT_STATUS_IS_OK(cli_getatr(cli, fname, NULL, NULL, &t))) {
2946 printf("getatr failed (%s)\n", cli_errstr(cli));
2951 printf("ERROR: getatr/setatr bug. times are\n%s",
2953 printf("%s", ctime(&t2));
2957 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
2959 if (!torture_close_connection(cli)) {
2963 printf("attrib test finished\n");
2970 This checks a couple of trans2 calls
2972 static bool run_trans2test(int dummy)
2974 struct cli_state *cli;
2977 time_t c_time, a_time, m_time;
2978 struct timespec c_time_ts, a_time_ts, m_time_ts, w_time_ts, m_time2_ts;
2979 const char *fname = "\\trans2.tst";
2980 const char *dname = "\\trans2";
2981 const char *fname2 = "\\trans2\\trans2.tst";
2983 bool correct = True;
2987 printf("starting trans2 test\n");
2989 if (!torture_open_connection(&cli, 0)) {
2993 status = cli_get_fs_attr_info(cli, &fs_attr);
2994 if (!NT_STATUS_IS_OK(status)) {
2995 printf("ERROR: cli_get_fs_attr_info returned %s\n",
3000 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
3001 cli_open(cli, fname,
3002 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
3003 if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
3004 cli, fnum, NULL, &size, &c_time_ts,
3005 &a_time_ts, &w_time_ts,
3006 &m_time_ts, NULL))) {
3007 printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(cli));
3011 if (!NT_STATUS_IS_OK(cli_qfilename(cli, fnum, pname, sizeof(pname)))) {
3012 printf("ERROR: qfilename failed (%s)\n", cli_errstr(cli));
3016 if (strcmp(pname, fname)) {
3017 printf("qfilename gave different name? [%s] [%s]\n",
3022 cli_close(cli, fnum);
3026 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
3027 if (!NT_STATUS_IS_OK(cli_open(cli, fname,
3028 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum))) {
3029 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
3032 cli_close(cli, fnum);
3034 status = cli_qpathinfo1(cli, fname, &c_time, &a_time, &m_time, &size,
3036 if (!NT_STATUS_IS_OK(status)) {
3037 printf("ERROR: qpathinfo failed (%s)\n", nt_errstr(status));
3040 if (c_time != m_time) {
3041 printf("create time=%s", ctime(&c_time));
3042 printf("modify time=%s", ctime(&m_time));
3043 printf("This system appears to have sticky create times\n");
3045 if (a_time % (60*60) == 0) {
3046 printf("access time=%s", ctime(&a_time));
3047 printf("This system appears to set a midnight access time\n");
3051 if (abs(m_time - time(NULL)) > 60*60*24*7) {
3052 printf("ERROR: totally incorrect times - maybe word reversed? mtime=%s", ctime(&m_time));
3058 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
3059 cli_open(cli, fname,
3060 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
3061 cli_close(cli, fnum);
3062 status = cli_qpathinfo2(cli, fname, &c_time_ts, &a_time_ts, &w_time_ts,
3063 &m_time_ts, &size, NULL, NULL);
3064 if (!NT_STATUS_IS_OK(status)) {
3065 printf("ERROR: qpathinfo2 failed (%s)\n", nt_errstr(status));
3068 if (w_time_ts.tv_sec < 60*60*24*2) {
3069 printf("write time=%s", ctime(&w_time_ts.tv_sec));
3070 printf("This system appears to set a initial 0 write time\n");
3075 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
3078 /* check if the server updates the directory modification time
3079 when creating a new file */
3080 if (!NT_STATUS_IS_OK(cli_mkdir(cli, dname))) {
3081 printf("ERROR: mkdir failed (%s)\n", cli_errstr(cli));
3085 status = cli_qpathinfo2(cli, "\\trans2\\", &c_time_ts, &a_time_ts,
3086 &w_time_ts, &m_time_ts, &size, NULL, NULL);
3087 if (!NT_STATUS_IS_OK(status)) {
3088 printf("ERROR: qpathinfo2 failed (%s)\n", nt_errstr(status));
3092 cli_open(cli, fname2,
3093 O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
3094 cli_write(cli, fnum, 0, (char *)&fnum, 0, sizeof(fnum));
3095 cli_close(cli, fnum);
3096 status = cli_qpathinfo2(cli, "\\trans2\\", &c_time_ts, &a_time_ts,
3097 &w_time_ts, &m_time2_ts, &size, NULL, NULL);
3098 if (!NT_STATUS_IS_OK(status)) {
3099 printf("ERROR: qpathinfo2 failed (%s)\n", nt_errstr(status));
3102 if (memcmp(&m_time_ts, &m_time2_ts, sizeof(struct timespec))
3104 printf("This system does not update directory modification times\n");
3108 cli_unlink(cli, fname2, aSYSTEM | aHIDDEN);
3109 cli_rmdir(cli, dname);
3111 if (!torture_close_connection(cli)) {
3115 printf("trans2 test finished\n");
3121 This checks new W2K calls.
3124 static NTSTATUS new_trans(struct cli_state *pcli, int fnum, int level)
3126 uint8_t *buf = NULL;
3130 status = cli_qfileinfo(talloc_tos(), pcli, fnum, level, 0,
3131 pcli->max_xmit, &buf, &len);
3132 if (!NT_STATUS_IS_OK(status)) {
3133 printf("ERROR: qfileinfo (%d) failed (%s)\n", level,
3136 printf("qfileinfo: level %d, len = %u\n", level, len);
3137 dump_data(0, (uint8 *)buf, len);
3144 static bool run_w2ktest(int dummy)
3146 struct cli_state *cli;
3148 const char *fname = "\\w2ktest\\w2k.tst";
3150 bool correct = True;
3152 printf("starting w2k test\n");
3154 if (!torture_open_connection(&cli, 0)) {
3158 cli_open(cli, fname,
3159 O_RDWR | O_CREAT , DENY_NONE, &fnum);
3161 for (level = 1004; level < 1040; level++) {
3162 new_trans(cli, fnum, level);
3165 cli_close(cli, fnum);
3167 if (!torture_close_connection(cli)) {
3171 printf("w2k test finished\n");
3178 this is a harness for some oplock tests
3180 static bool run_oplock1(int dummy)
3182 struct cli_state *cli1;
3183 const char *fname = "\\lockt1.lck";
3185 bool correct = True;
3187 printf("starting oplock test 1\n");
3189 if (!torture_open_connection(&cli1, 0)) {
3193 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3195 cli_sockopt(cli1, sockops);
3197 cli1->use_oplocks = True;
3199 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
3200 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
3204 cli1->use_oplocks = False;
3206 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3207 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3209 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3210 printf("close2 failed (%s)\n", cli_errstr(cli1));
3214 if (!NT_STATUS_IS_OK(cli_unlink(cli1, fname, aSYSTEM | aHIDDEN))) {
3215 printf("unlink failed (%s)\n", cli_errstr(cli1));
3219 if (!torture_close_connection(cli1)) {
3223 printf("finished oplock test 1\n");
3228 static bool run_oplock2(int dummy)
3230 struct cli_state *cli1, *cli2;
3231 const char *fname = "\\lockt2.lck";
3232 uint16_t fnum1, fnum2;
3233 int saved_use_oplocks = use_oplocks;
3235 bool correct = True;
3236 volatile bool *shared_correct;
3238 shared_correct = (volatile bool *)shm_setup(sizeof(bool));
3239 *shared_correct = True;
3241 use_level_II_oplocks = True;
3244 printf("starting oplock test 2\n");
3246 if (!torture_open_connection(&cli1, 0)) {
3247 use_level_II_oplocks = False;
3248 use_oplocks = saved_use_oplocks;
3252 cli1->use_oplocks = True;
3253 cli1->use_level_II_oplocks = True;
3255 if (!torture_open_connection(&cli2, 1)) {
3256 use_level_II_oplocks = False;
3257 use_oplocks = saved_use_oplocks;
3261 cli2->use_oplocks = True;
3262 cli2->use_level_II_oplocks = True;
3264 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3266 cli_sockopt(cli1, sockops);
3267 cli_sockopt(cli2, sockops);
3269 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
3270 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
3274 /* Don't need the globals any more. */
3275 use_level_II_oplocks = False;
3276 use_oplocks = saved_use_oplocks;
3280 if (!NT_STATUS_IS_OK(cli_open(cli2, fname, O_RDWR, DENY_NONE, &fnum2))) {
3281 printf("second open of %s failed (%s)\n", fname, cli_errstr(cli1));
3282 *shared_correct = False;
3288 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
3289 printf("close2 failed (%s)\n", cli_errstr(cli1));
3290 *shared_correct = False;
3298 /* Ensure cli1 processes the break. Empty file should always return 0
3301 if (cli_read(cli1, fnum1, buf, 0, 4) != 0) {
3302 printf("read on fnum1 failed (%s)\n", cli_errstr(cli1));
3306 /* Should now be at level II. */
3307 /* Test if sending a write locks causes a break to none. */
3309 if (!cli_lock(cli1, fnum1, 0, 4, 0, READ_LOCK)) {
3310 printf("lock failed (%s)\n", cli_errstr(cli1));
3314 cli_unlock(cli1, fnum1, 0, 4);
3318 if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {
3319 printf("lock failed (%s)\n", cli_errstr(cli1));
3323 cli_unlock(cli1, fnum1, 0, 4);
3327 cli_read(cli1, fnum1, buf, 0, 4);
3330 if (cli_write(cli1, fnum1, 0, buf, 0, 4) != 4) {
3331 printf("write on fnum1 failed (%s)\n", cli_errstr(cli1));
3336 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3337 printf("close1 failed (%s)\n", cli_errstr(cli1));
3343 if (!NT_STATUS_IS_OK(cli_unlink(cli1, fname, aSYSTEM | aHIDDEN))) {
3344 printf("unlink failed (%s)\n", cli_errstr(cli1));
3348 if (!torture_close_connection(cli1)) {
3352 if (!*shared_correct) {
3356 printf("finished oplock test 2\n");
3361 /* handler for oplock 3 tests */
3362 static NTSTATUS oplock3_handler(struct cli_state *cli, uint16_t fnum, unsigned char level)
3364 printf("got oplock break fnum=%d level=%d\n",
3366 return cli_oplock_ack(cli, fnum, level);
3369 static bool run_oplock3(int dummy)
3371 struct cli_state *cli;
3372 const char *fname = "\\oplockt3.dat";
3374 char buf[4] = "abcd";
3375 bool correct = True;
3376 volatile bool *shared_correct;
3378 shared_correct = (volatile bool *)shm_setup(sizeof(bool));
3379 *shared_correct = True;
3381 printf("starting oplock test 3\n");
3386 use_level_II_oplocks = True;
3387 if (!torture_open_connection(&cli, 0)) {
3388 *shared_correct = False;
3392 /* try to trigger a oplock break in parent */
3393 cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum);
3394 cli_write(cli, fnum, 0, buf, 0, 4);
3400 use_level_II_oplocks = True;
3401 if (!torture_open_connection(&cli, 1)) { /* other is forked */
3404 cli_oplock_handler(cli, oplock3_handler);
3405 cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE, &fnum);
3406 cli_write(cli, fnum, 0, buf, 0, 4);
3407 cli_close(cli, fnum);
3408 cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum);
3409 cli->timeout = 20000;
3410 cli_receive_smb(cli);
3411 printf("finished oplock test 3\n");
3413 return (correct && *shared_correct);
3415 /* What are we looking for here? What's sucess and what's FAILURE? */
3421 Test delete on close semantics.
3423 static bool run_deletetest(int dummy)
3425 struct cli_state *cli1 = NULL;
3426 struct cli_state *cli2 = NULL;
3427 const char *fname = "\\delete.file";
3428 uint16_t fnum1 = (uint16_t)-1;
3429 uint16_t fnum2 = (uint16_t)-1;
3430 bool correct = True;
3432 printf("starting delete test\n");
3434 if (!torture_open_connection(&cli1, 0)) {
3438 cli_sockopt(cli1, sockops);
3440 /* Test 1 - this should delete the file on close. */
3442 cli_setatr(cli1, fname, 0, 0);
3443 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3445 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
3446 0, FILE_OVERWRITE_IF,
3447 FILE_DELETE_ON_CLOSE, 0, &fnum1))) {
3448 printf("[1] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3453 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3454 printf("[1] close failed (%s)\n", cli_errstr(cli1));
3459 if (NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1))) {
3460 printf("[1] open of %s succeeded (should fail)\n", fname);
3465 printf("first delete on close test succeeded.\n");
3467 /* Test 2 - this should delete the file on close. */
3469 cli_setatr(cli1, fname, 0, 0);
3470 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3472 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_ALL_ACCESS,
3473 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE,
3474 FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3475 printf("[2] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3480 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3481 printf("[2] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
3486 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3487 printf("[2] close failed (%s)\n", cli_errstr(cli1));
3492 if (NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum1))) {
3493 printf("[2] open of %s succeeded should have been deleted on close !\n", fname);
3494 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3495 printf("[2] close failed (%s)\n", cli_errstr(cli1));
3499 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3501 printf("second delete on close test succeeded.\n");
3504 cli_setatr(cli1, fname, 0, 0);
3505 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3507 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
3508 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3509 printf("[3] open - 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3514 /* This should fail with a sharing violation - open for delete is only compatible
3515 with SHARE_DELETE. */
3517 if (NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3518 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, 0, &fnum2))) {
3519 printf("[3] open - 2 of %s succeeded - should have failed.\n", fname);
3524 /* This should succeed. */
3526 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3527 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0, &fnum2))) {
3528 printf("[3] open - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
3533 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3534 printf("[3] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
3539 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3540 printf("[3] close 1 failed (%s)\n", cli_errstr(cli1));
3545 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum2))) {
3546 printf("[3] close 2 failed (%s)\n", cli_errstr(cli1));
3551 /* This should fail - file should no longer be there. */
3553 if (NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum1))) {
3554 printf("[3] open of %s succeeded should have been deleted on close !\n", fname);
3555 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3556 printf("[3] close failed (%s)\n", cli_errstr(cli1));
3558 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3562 printf("third delete on close test succeeded.\n");
3565 cli_setatr(cli1, fname, 0, 0);
3566 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3568 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3569 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3570 printf("[4] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3575 /* This should succeed. */
3576 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS,
3577 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, 0, 0, &fnum2))) {
3578 printf("[4] open - 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
3583 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum2))) {
3584 printf("[4] close - 1 failed (%s)\n", cli_errstr(cli1));
3589 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3590 printf("[4] setting delete_on_close failed (%s)\n", cli_errstr(cli1));
3595 /* This should fail - no more opens once delete on close set. */
3596 if (NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS,
3597 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3598 FILE_OPEN, 0, 0, &fnum2))) {
3599 printf("[4] open - 3 of %s succeeded ! Should have failed.\n", fname );
3603 printf("fourth delete on close test succeeded.\n");
3605 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3606 printf("[4] close - 2 failed (%s)\n", cli_errstr(cli1));
3612 cli_setatr(cli1, fname, 0, 0);
3613 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3615 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT, DENY_NONE, &fnum1))) {
3616 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3621 /* This should fail - only allowed on NT opens with DELETE access. */
3623 if (NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3624 printf("[5] setting delete_on_close on OpenX file succeeded - should fail !\n");
3629 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3630 printf("[5] close - 2 failed (%s)\n", cli_errstr(cli1));
3635 printf("fifth delete on close test succeeded.\n");
3638 cli_setatr(cli1, fname, 0, 0);
3639 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3641 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
3642 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3643 FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3644 printf("[6] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3649 /* This should fail - only allowed on NT opens with DELETE access. */
3651 if (NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3652 printf("[6] setting delete_on_close on file with no delete access succeeded - should fail !\n");
3657 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3658 printf("[6] close - 2 failed (%s)\n", cli_errstr(cli1));
3663 printf("sixth delete on close test succeeded.\n");
3666 cli_setatr(cli1, fname, 0, 0);
3667 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3669 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3670 FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3671 printf("[7] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3676 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3677 printf("[7] setting delete_on_close on file failed !\n");
3682 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, false))) {
3683 printf("[7] unsetting delete_on_close on file failed !\n");
3688 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3689 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
3694 /* This next open should succeed - we reset the flag. */
3696 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum1))) {
3697 printf("[5] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3702 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3703 printf("[7] close - 2 failed (%s)\n", cli_errstr(cli1));
3708 printf("seventh delete on close test succeeded.\n");
3711 cli_setatr(cli1, fname, 0, 0);
3712 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3714 if (!torture_open_connection(&cli2, 1)) {
3715 printf("[8] failed to open second connection.\n");
3720 cli_sockopt(cli1, sockops);
3722 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3723 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3724 FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3725 printf("[8] open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
3730 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3731 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3732 FILE_OPEN, 0, 0, &fnum2))) {
3733 printf("[8] open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
3738 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum1, true))) {
3739 printf("[8] setting delete_on_close on file failed !\n");
3744 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3745 printf("[8] close - 1 failed (%s)\n", cli_errstr(cli1));
3750 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
3751 printf("[8] close - 2 failed (%s)\n", cli_errstr(cli2));
3756 /* This should fail.. */
3757 if (NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum1))) {
3758 printf("[8] open of %s succeeded should have been deleted on close !\n", fname);
3762 printf("eighth delete on close test succeeded.\n");
3764 /* This should fail - we need to set DELETE_ACCESS. */
3765 if (NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0,FILE_READ_DATA|FILE_WRITE_DATA,
3766 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0, &fnum1))) {
3767 printf("[9] open of %s succeeded should have failed!\n", fname);
3772 printf("ninth delete on close test succeeded.\n");
3774 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
3775 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_OVERWRITE_IF, FILE_DELETE_ON_CLOSE, 0, &fnum1))) {
3776 printf("[10] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3781 /* This should delete the file. */
3782 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3783 printf("[10] close failed (%s)\n", cli_errstr(cli1));
3788 /* This should fail.. */
3789 if (NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_NONE, &fnum1))) {
3790 printf("[10] open of %s succeeded should have been deleted on close !\n", fname);
3794 printf("tenth delete on close test succeeded.\n");
3796 cli_setatr(cli1, fname, 0, 0);
3797 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3799 /* What error do we get when attempting to open a read-only file with
3802 /* Create a readonly file. */
3803 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA,
3804 FILE_ATTRIBUTE_READONLY, FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3805 printf("[11] open of %s failed (%s)\n", fname, cli_errstr(cli1));
3810 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3811 printf("[11] close failed (%s)\n", cli_errstr(cli1));
3816 /* Now try open for delete access. */
3817 if (NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_ATTRIBUTES|DELETE_ACCESS,
3818 0, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
3819 FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3820 printf("[11] open of %s succeeded should have been denied with ACCESS_DENIED!\n", fname);
3821 cli_close(cli1, fnum1);
3825 NTSTATUS nterr = cli_nt_error(cli1);
3826 if (!NT_STATUS_EQUAL(nterr,NT_STATUS_ACCESS_DENIED)) {
3827 printf("[11] open of %s should have been denied with ACCESS_DENIED! Got error %s\n", fname, nt_errstr(nterr));
3831 printf("eleventh delete on close test succeeded.\n");
3835 printf("finished delete test\n");
3838 /* FIXME: This will crash if we aborted before cli2 got
3839 * intialized, because these functions don't handle
3840 * uninitialized connections. */
3842 if (fnum1 != (uint16_t)-1) cli_close(cli1, fnum1);
3843 if (fnum2 != (uint16_t)-1) cli_close(cli1, fnum2);
3844 cli_setatr(cli1, fname, 0, 0);
3845 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3847 if (cli1 && !torture_close_connection(cli1)) {
3850 if (cli2 && !torture_close_connection(cli2)) {
3858 print out server properties
3860 static bool run_properties(int dummy)
3862 struct cli_state *cli;
3863 bool correct = True;
3865 printf("starting properties test\n");
3869 if (!torture_open_connection(&cli, 0)) {
3873 cli_sockopt(cli, sockops);
3875 d_printf("Capabilities 0x%08x\n", cli->capabilities);
3877 if (!torture_close_connection(cli)) {
3886 /* FIRST_DESIRED_ACCESS 0xf019f */
3887 #define FIRST_DESIRED_ACCESS FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|\
3888 FILE_READ_EA| /* 0xf */ \
3889 FILE_WRITE_EA|FILE_READ_ATTRIBUTES| /* 0x90 */ \
3890 FILE_WRITE_ATTRIBUTES| /* 0x100 */ \
3891 DELETE_ACCESS|READ_CONTROL_ACCESS|\
3892 WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS /* 0xf0000 */
3893 /* SECOND_DESIRED_ACCESS 0xe0080 */
3894 #define SECOND_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
3895 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
3896 WRITE_OWNER_ACCESS /* 0xe0000 */
3899 #define THIRD_DESIRED_ACCESS FILE_READ_ATTRIBUTES| /* 0x80 */ \
3900 READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|\
3902 WRITE_OWNER_ACCESS /* */
3906 Test ntcreate calls made by xcopy
3908 static bool run_xcopy(int dummy)
3910 static struct cli_state *cli1;
3911 const char *fname = "\\test.txt";
3912 bool correct = True;
3913 uint16_t fnum1, fnum2;
3915 printf("starting xcopy test\n");
3917 if (!torture_open_connection(&cli1, 0)) {
3921 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0,
3922 FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
3923 FILE_SHARE_NONE, FILE_OVERWRITE_IF,
3924 0x4044, 0, &fnum1))) {
3925 printf("First open failed - %s\n", cli_errstr(cli1));
3929 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0,
3930 SECOND_DESIRED_ACCESS, 0,
3931 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN,
3932 0x200000, 0, &fnum2))) {
3933 printf("second open failed - %s\n", cli_errstr(cli1));
3937 if (!torture_close_connection(cli1)) {
3945 Test rename on files open with share delete and no share delete.
3947 static bool run_rename(int dummy)
3949 static struct cli_state *cli1;
3950 const char *fname = "\\test.txt";
3951 const char *fname1 = "\\test1.txt";
3952 bool correct = True;
3957 printf("starting rename test\n");
3959 if (!torture_open_connection(&cli1, 0)) {
3963 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3964 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
3965 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3966 FILE_SHARE_READ, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
3967 printf("First open failed - %s\n", cli_errstr(cli1));
3971 if (!NT_STATUS_IS_OK(cli_rename(cli1, fname, fname1))) {
3972 printf("First rename failed (SHARE_READ) (this is correct) - %s\n", cli_errstr(cli1));
3974 printf("First rename succeeded (SHARE_READ) - this should have failed !\n");
3978 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
3979 printf("close - 1 failed (%s)\n", cli_errstr(cli1));
3983 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
3984 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
3985 status = cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
3987 FILE_SHARE_DELETE|FILE_SHARE_NONE,
3989 FILE_SHARE_DELETE|FILE_SHARE_READ,
3991 FILE_OVERWRITE_IF, 0, 0, &fnum1);
3992 if (!NT_STATUS_IS_OK(status)) {
3993 printf("Second open failed - %s\n", cli_errstr(cli1));
3997 if (!NT_STATUS_IS_OK(cli_rename(cli1, fname, fname1))) {
3998 printf("Second rename failed (SHARE_DELETE | SHARE_READ) - this should have succeeded - %s\n", cli_errstr(cli1));
4001 printf("Second rename succeeded (SHARE_DELETE | SHARE_READ)\n");
4004 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4005 printf("close - 2 failed (%s)\n", cli_errstr(cli1));
4009 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4010 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
4012 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, READ_CONTROL_ACCESS, FILE_ATTRIBUTE_NORMAL,
4013 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4014 printf("Third open failed - %s\n", cli_errstr(cli1));
4023 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS, FILE_ATTRIBUTE_NORMAL,
4024 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum2))) {
4025 printf("Fourth open failed - %s\n", cli_errstr(cli1));
4028 if (!NT_STATUS_IS_OK(cli_nt_delete_on_close(cli1, fnum2, true))) {
4029 printf("[8] setting delete_on_close on file failed !\n");
4033 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum2))) {
4034 printf("close - 4 failed (%s)\n", cli_errstr(cli1));
4040 if (!NT_STATUS_IS_OK(cli_rename(cli1, fname, fname1))) {
4041 printf("Third rename failed (SHARE_NONE) - this should have succeeded - %s\n", cli_errstr(cli1));
4044 printf("Third rename succeeded (SHARE_NONE)\n");
4047 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4048 printf("close - 3 failed (%s)\n", cli_errstr(cli1));
4052 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4053 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
4057 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
4058 FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4059 printf("Fourth open failed - %s\n", cli_errstr(cli1));
4063 if (!NT_STATUS_IS_OK(cli_rename(cli1, fname, fname1))) {
4064 printf("Fourth rename failed (SHARE_READ | SHARE_WRITE) (this is correct) - %s\n", cli_errstr(cli1));
4066 printf("Fourth rename succeeded (SHARE_READ | SHARE_WRITE) - this should have failed !\n");
4070 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4071 printf("close - 4 failed (%s)\n", cli_errstr(cli1));
4075 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4076 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
4080 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
4081 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4082 printf("Fifth open failed - %s\n", cli_errstr(cli1));
4086 if (!NT_STATUS_IS_OK(cli_rename(cli1, fname, fname1))) {
4087 printf("Fifth rename failed (SHARE_READ | SHARE_WRITE | SHARE_DELETE) - this should have succeeded - %s ! \n",
4091 printf("Fifth rename succeeded (SHARE_READ | SHARE_WRITE | SHARE_DELETE) (this is correct) - %s\n", cli_errstr(cli1));
4095 * Now check if the first name still exists ...
4098 /* if (!NT_STATUS_OP(cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, FILE_ATTRIBUTE_NORMAL,
4099 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0, &fnum2))) {
4100 printf("Opening original file after rename of open file fails: %s\n",
4104 printf("Opening original file after rename of open file works ...\n");
4105 (void)cli_close(cli1, fnum2);
4109 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4110 printf("close - 5 failed (%s)\n", cli_errstr(cli1));
4114 /* Check that the renamed file has FILE_ATTRIBUTE_ARCHIVE. */
4115 if (!NT_STATUS_IS_OK(cli_getatr(cli1, fname1, &attr, NULL, NULL))) {
4116 printf("getatr on file %s failed - %s ! \n",
4121 if (attr != FILE_ATTRIBUTE_ARCHIVE) {
4122 printf("Renamed file %s has wrong attr 0x%x "
4123 "(should be 0x%x)\n",
4126 (unsigned int)FILE_ATTRIBUTE_ARCHIVE);
4129 printf("Renamed file %s has archive bit set\n", fname1);
4133 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4134 cli_unlink(cli1, fname1, aSYSTEM | aHIDDEN);
4136 if (!torture_close_connection(cli1)) {
4143 static bool run_pipe_number(int dummy)
4145 struct cli_state *cli1;
4146 const char *pipe_name = "\\SPOOLSS";
4150 printf("starting pipenumber test\n");
4151 if (!torture_open_connection(&cli1, 0)) {
4155 cli_sockopt(cli1, sockops);
4157 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, pipe_name, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
4158 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF, 0, 0, &fnum))) {
4159 printf("Open of pipe %s failed with error (%s)\n", pipe_name, cli_errstr(cli1));
4163 printf("\r%6d", num_pipes);
4166 printf("pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
4167 torture_close_connection(cli1);
4172 Test open mode returns on read-only files.
4174 static bool run_opentest(int dummy)
4176 static struct cli_state *cli1;
4177 static struct cli_state *cli2;
4178 const char *fname = "\\readonly.file";
4179 uint16_t fnum1, fnum2;
4182 bool correct = True;
4185 printf("starting open test\n");
4187 if (!torture_open_connection(&cli1, 0)) {
4191 cli_setatr(cli1, fname, 0, 0);
4192 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4194 cli_sockopt(cli1, sockops);
4196 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
4197 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
4201 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4202 printf("close2 failed (%s)\n", cli_errstr(cli1));
4206 if (!NT_STATUS_IS_OK(cli_setatr(cli1, fname, aRONLY, 0))) {
4207 printf("cli_setatr failed (%s)\n", cli_errstr(cli1));
4211 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_WRITE, &fnum1))) {
4212 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
4216 /* This will fail - but the error should be ERRnoaccess, not ERRbadshare. */
4217 cli_open(cli1, fname, O_RDWR, DENY_ALL, &fnum2);
4219 if (check_error(__LINE__, cli1, ERRDOS, ERRnoaccess,
4220 NT_STATUS_ACCESS_DENIED)) {
4221 printf("correct error code ERRDOS/ERRnoaccess returned\n");
4224 printf("finished open test 1\n");
4226 cli_close(cli1, fnum1);
4228 /* Now try not readonly and ensure ERRbadshare is returned. */
4230 cli_setatr(cli1, fname, 0, 0);
4232 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY, DENY_WRITE, &fnum1))) {
4233 printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
4237 /* This will fail - but the error should be ERRshare. */
4238 cli_open(cli1, fname, O_RDWR, DENY_ALL, &fnum2);
4240 if (check_error(__LINE__, cli1, ERRDOS, ERRbadshare,
4241 NT_STATUS_SHARING_VIOLATION)) {
4242 printf("correct error code ERRDOS/ERRbadshare returned\n");
4245 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4246 printf("close2 failed (%s)\n", cli_errstr(cli1));
4250 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4252 printf("finished open test 2\n");
4254 /* Test truncate open disposition on file opened for read. */
4256 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum1))) {
4257 printf("(3) open (1) of %s failed (%s)\n", fname, cli_errstr(cli1));
4261 /* write 20 bytes. */
4263 memset(buf, '\0', 20);
4265 if (cli_write(cli1, fnum1, 0, buf, 0, 20) != 20) {
4266 printf("write failed (%s)\n", cli_errstr(cli1));
4270 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4271 printf("(3) close1 failed (%s)\n", cli_errstr(cli1));
4275 /* Ensure size == 20. */
4276 if (!NT_STATUS_IS_OK(cli_getatr(cli1, fname, NULL, &fsize, NULL))) {
4277 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
4282 printf("(3) file size != 20\n");
4286 /* Now test if we can truncate a file opened for readonly. */
4288 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDONLY|O_TRUNC, DENY_NONE, &fnum1))) {
4289 printf("(3) open (2) of %s failed (%s)\n", fname, cli_errstr(cli1));
4293 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4294 printf("close2 failed (%s)\n", cli_errstr(cli1));
4298 /* Ensure size == 0. */
4299 if (!NT_STATUS_IS_OK(cli_getatr(cli1, fname, NULL, &fsize, NULL))) {
4300 printf("(3) getatr failed (%s)\n", cli_errstr(cli1));
4305 printf("(3) file size != 0\n");
4308 printf("finished open test 3\n");
4310 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4312 printf("Do ctemp tests\n");
4313 if (!NT_STATUS_IS_OK(cli_ctemp(cli1, talloc_tos(), "\\", &fnum1, &tmp_path))) {
4314 printf("ctemp failed (%s)\n", cli_errstr(cli1));
4317 printf("ctemp gave path %s\n", tmp_path);
4318 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4319 printf("close of temp failed (%s)\n", cli_errstr(cli1));
4321 if (!NT_STATUS_IS_OK(cli_unlink(cli1, tmp_path, aSYSTEM | aHIDDEN))) {
4322 printf("unlink of temp failed (%s)\n", cli_errstr(cli1));
4325 /* Test the non-io opens... */
4327 if (!torture_open_connection(&cli2, 1)) {
4331 cli_setatr(cli2, fname, 0, 0);
4332 cli_unlink(cli2, fname, aSYSTEM | aHIDDEN);
4334 cli_sockopt(cli2, sockops);
4336 printf("TEST #1 testing 2 non-io opens (no delete)\n");
4338 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4339 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4340 printf("TEST #1 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4344 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4345 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4346 printf("TEST #1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4350 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4351 printf("TEST #1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4354 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
4355 printf("TEST #1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4359 printf("non-io open test #1 passed.\n");
4361 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4363 printf("TEST #2 testing 2 non-io opens (first with delete)\n");
4365 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4366 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4367 printf("TEST #2 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4371 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4372 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4373 printf("TEST #2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4377 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4378 printf("TEST #2 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4381 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
4382 printf("TEST #2 close 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
4386 printf("non-io open test #2 passed.\n");
4388 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4390 printf("TEST #3 testing 2 non-io opens (second with delete)\n");
4392 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4393 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4394 printf("TEST #3 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4398 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4399 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4400 printf("TEST #3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4404 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4405 printf("TEST #3 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4408 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
4409 printf("TEST #3 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4413 printf("non-io open test #3 passed.\n");
4415 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4417 printf("TEST #4 testing 2 non-io opens (both with delete)\n");
4419 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4420 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4421 printf("TEST #4 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4425 if (NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4426 FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4427 printf("TEST #4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
4431 printf("TEST #4 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
4433 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4434 printf("TEST #4 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4438 printf("non-io open test #4 passed.\n");
4440 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4442 printf("TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n");
4444 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4445 FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4446 printf("TEST #5 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4450 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4451 FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4452 printf("TEST #5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4456 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4457 printf("TEST #5 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4461 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
4462 printf("TEST #5 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4466 printf("non-io open test #5 passed.\n");
4468 printf("TEST #6 testing 1 non-io open, one io open\n");
4470 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4472 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
4473 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4474 printf("TEST #6 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4478 if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4479 FILE_SHARE_READ, FILE_OPEN_IF, 0, 0, &fnum2))) {
4480 printf("TEST #6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4484 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4485 printf("TEST #6 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4489 if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
4490 printf("TEST #6 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
4494 printf("non-io open test #6 passed.\n");
4496 printf("TEST #7 testing 1 non-io open, one io open with delete\n");
4498 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4500 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
4501 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4502 printf("TEST #7 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4506 if (NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
4507 FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0, &fnum2))) {
4508 printf("TEST #7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
4512 printf("TEST #7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
4514 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4515 printf("TEST #7 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
4519 printf("non-io open test #7 passed.\n");
4521 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4523 if (!torture_close_connection(cli1)) {
4526 if (!torture_close_connection(cli2)) {
4533 NTSTATUS torture_setup_unix_extensions(struct cli_state *cli)
4535 uint16 major, minor;
4536 uint32 caplow, caphigh;
4539 if (!SERVER_HAS_UNIX_CIFS(cli)) {
4540 printf("Server doesn't support UNIX CIFS extensions.\n");
4541 return NT_STATUS_NOT_SUPPORTED;
4544 status = cli_unix_extensions_version(cli, &major, &minor, &caplow,
4546 if (!NT_STATUS_IS_OK(status)) {
4547 printf("Server didn't return UNIX CIFS extensions: %s\n",
4552 status = cli_set_unix_extensions_capabilities(cli, major, minor,
4554 if (!NT_STATUS_IS_OK(status)) {
4555 printf("Server doesn't support setting UNIX CIFS extensions: "
4556 "%s.\n", nt_errstr(status));
4560 return NT_STATUS_OK;
4564 Test POSIX open /mkdir calls.
4566 static bool run_simple_posix_open_test(int dummy)
4568 static struct cli_state *cli1;
4569 const char *fname = "posix:file";
4570 const char *hname = "posix:hlink";
4571 const char *sname = "posix:symlink";
4572 const char *dname = "posix:dir";
4575 uint16_t fnum1 = (uint16_t)-1;
4576 SMB_STRUCT_STAT sbuf;
4577 bool correct = false;
4580 printf("Starting simple POSIX open test\n");
4582 if (!torture_open_connection(&cli1, 0)) {
4586 cli_sockopt(cli1, sockops);
4588 status = torture_setup_unix_extensions(cli1);
4589 if (!NT_STATUS_IS_OK(status)) {
4593 cli_setatr(cli1, fname, 0, 0);
4594 cli_posix_unlink(cli1, fname);
4595 cli_setatr(cli1, dname, 0, 0);
4596 cli_posix_rmdir(cli1, dname);
4597 cli_setatr(cli1, hname, 0, 0);
4598 cli_posix_unlink(cli1, hname);
4599 cli_setatr(cli1, sname, 0, 0);
4600 cli_posix_unlink(cli1, sname);
4602 /* Create a directory. */
4603 if (!NT_STATUS_IS_OK(cli_posix_mkdir(cli1, dname, 0777))) {
4604 printf("POSIX mkdir of %s failed (%s)\n", dname, cli_errstr(cli1));
4608 if (!NT_STATUS_IS_OK(cli_posix_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, 0600, &fnum1))) {
4609 printf("POSIX create of %s failed (%s)\n", fname, cli_errstr(cli1));
4613 /* Test ftruncate - set file size. */
4614 if (!NT_STATUS_IS_OK(cli_ftruncate(cli1, fnum1, 1000))) {
4615 printf("ftruncate failed (%s)\n", cli_errstr(cli1));
4619 /* Ensure st_size == 1000 */
4620 if (!NT_STATUS_IS_OK(cli_posix_stat(cli1, fname, &sbuf))) {
4621 printf("stat failed (%s)\n", cli_errstr(cli1));
4625 if (sbuf.st_ex_size != 1000) {
4626 printf("ftruncate - stat size (%u) != 1000\n", (unsigned int)sbuf.st_ex_size);
4630 /* Test ftruncate - set file size back to zero. */
4631 if (!NT_STATUS_IS_OK(cli_ftruncate(cli1, fnum1, 0))) {
4632 printf("ftruncate failed (%s)\n", cli_errstr(cli1));
4636 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4637 printf("close failed (%s)\n", cli_errstr(cli1));
4641 /* Now open the file again for read only. */
4642 if (!NT_STATUS_IS_OK(cli_posix_open(cli1, fname, O_RDONLY, 0, &fnum1))) {
4643 printf("POSIX open of %s failed (%s)\n", fname, cli_errstr(cli1));
4647 /* Now unlink while open. */
4648 if (!NT_STATUS_IS_OK(cli_posix_unlink(cli1, fname))) {
4649 printf("POSIX unlink of %s failed (%s)\n", fname, cli_errstr(cli1));
4653 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4654 printf("close(2) failed (%s)\n", cli_errstr(cli1));
4658 /* Ensure the file has gone. */
4659 if (NT_STATUS_IS_OK(cli_posix_open(cli1, fname, O_RDONLY, 0, &fnum1))) {
4660 printf("POSIX open of %s succeeded, should have been deleted.\n", fname);
4664 /* What happens when we try and POSIX open a directory ? */
4665 if (NT_STATUS_IS_OK(cli_posix_open(cli1, dname, O_RDONLY, 0, &fnum1))) {
4666 printf("POSIX open of directory %s succeeded, should have failed.\n", fname);
4669 if (!check_error(__LINE__, cli1, ERRDOS, EISDIR,
4670 NT_STATUS_FILE_IS_A_DIRECTORY)) {
4675 /* Create the file. */
4676 if (!NT_STATUS_IS_OK(cli_posix_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, 0600, &fnum1))) {
4677 printf("POSIX create of %s failed (%s)\n", fname, cli_errstr(cli1));
4681 /* Write some data into it. */
4682 if (cli_write(cli1, fnum1, 0, "TEST DATA\n", 0, 10) != 10) {
4683 printf("cli_write failed: %s\n", cli_errstr(cli1));
4687 cli_close(cli1, fnum1);
4689 /* Now create a hardlink. */
4690 if (!NT_STATUS_IS_OK(cli_posix_hardlink(cli1, fname, hname))) {
4691 printf("POSIX hardlink of %s failed (%s)\n", hname, cli_errstr(cli1));
4695 /* Now create a symlink. */
4696 if (!NT_STATUS_IS_OK(cli_posix_symlink(cli1, fname, sname))) {
4697 printf("POSIX symlink of %s failed (%s)\n", sname, cli_errstr(cli1));
4701 /* Open the hardlink for read. */
4702 if (!NT_STATUS_IS_OK(cli_posix_open(cli1, hname, O_RDONLY, 0, &fnum1))) {
4703 printf("POSIX open of %s failed (%s)\n", hname, cli_errstr(cli1));
4707 if (cli_read(cli1, fnum1, buf, 0, 10) != 10) {
4708 printf("POSIX read of %s failed (%s)\n", hname, cli_errstr(cli1));
4712 if (memcmp(buf, "TEST DATA\n", 10)) {
4713 printf("invalid data read from hardlink\n");
4717 /* Do a POSIX lock/unlock. */
4718 if (!NT_STATUS_IS_OK(cli_posix_lock(cli1, fnum1, 0, 100, true, READ_LOCK))) {
4719 printf("POSIX lock failed %s\n", cli_errstr(cli1));
4723 /* Punch a hole in the locked area. */
4724 if (!NT_STATUS_IS_OK(cli_posix_unlock(cli1, fnum1, 10, 80))) {
4725 printf("POSIX unlock failed %s\n", cli_errstr(cli1));
4729 cli_close(cli1, fnum1);
4731 /* Open the symlink for read - this should fail. A POSIX
4732 client should not be doing opens on a symlink. */
4733 if (NT_STATUS_IS_OK(cli_posix_open(cli1, sname, O_RDONLY, 0, &fnum1))) {
4734 printf("POSIX open of %s succeeded (should have failed)\n", sname);
4737 if (!check_error(__LINE__, cli1, ERRDOS, ERRbadpath,
4738 NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
4739 printf("POSIX open of %s should have failed "
4740 "with NT_STATUS_OBJECT_PATH_NOT_FOUND, "
4741 "failed with %s instead.\n",
4742 sname, cli_errstr(cli1));
4747 if (!NT_STATUS_IS_OK(cli_posix_readlink(cli1, sname, namebuf, sizeof(namebuf)))) {
4748 printf("POSIX readlink on %s failed (%s)\n", sname, cli_errstr(cli1));
4752 if (strcmp(namebuf, fname) != 0) {
4753 printf("POSIX readlink on %s failed to match name %s (read %s)\n",
4754 sname, fname, namebuf);
4758 if (!NT_STATUS_IS_OK(cli_posix_rmdir(cli1, dname))) {
4759 printf("POSIX rmdir failed (%s)\n", cli_errstr(cli1));
4763 printf("Simple POSIX open test passed\n");
4768 if (fnum1 != (uint16_t)-1) {
4769 cli_close(cli1, fnum1);
4770 fnum1 = (uint16_t)-1;
4773 cli_setatr(cli1, sname, 0, 0);
4774 cli_posix_unlink(cli1, sname);
4775 cli_setatr(cli1, hname, 0, 0);
4776 cli_posix_unlink(cli1, hname);
4777 cli_setatr(cli1, fname, 0, 0);
4778 cli_posix_unlink(cli1, fname);
4779 cli_setatr(cli1, dname, 0, 0);
4780 cli_posix_rmdir(cli1, dname);
4782 if (!torture_close_connection(cli1)) {
4790 static uint32 open_attrs_table[] = {
4791 FILE_ATTRIBUTE_NORMAL,
4792 FILE_ATTRIBUTE_ARCHIVE,
4793 FILE_ATTRIBUTE_READONLY,
4794 FILE_ATTRIBUTE_HIDDEN,
4795 FILE_ATTRIBUTE_SYSTEM,
4797 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY,
4798 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN,
4799 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,
4800 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
4801 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
4802 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
4804 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
4805 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
4806 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
4807 FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_SYSTEM,
4810 struct trunc_open_results {
4817 static struct trunc_open_results attr_results[] = {
4818 { 0, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
4819 { 1, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
4820 { 2, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
4821 { 16, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
4822 { 17, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
4823 { 18, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
4824 { 51, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4825 { 54, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4826 { 56, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
4827 { 68, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4828 { 71, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4829 { 73, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
4830 { 99, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4831 { 102, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4832 { 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 },
4833 { 116, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4834 { 119, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4835 { 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 },
4836 { 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 },
4837 { 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 },
4838 { 227, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4839 { 230, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
4840 { 232, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
4841 { 244, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4842 { 247, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
4843 { 249, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM }
4846 static bool run_openattrtest(int dummy)
4848 static struct cli_state *cli1;
4849 const char *fname = "\\openattr.file";
4851 bool correct = True;
4853 unsigned int i, j, k, l;
4855 printf("starting open attr test\n");
4857 if (!torture_open_connection(&cli1, 0)) {
4861 cli_sockopt(cli1, sockops);
4863 for (k = 0, i = 0; i < sizeof(open_attrs_table)/sizeof(uint32); i++) {
4864 cli_setatr(cli1, fname, 0, 0);
4865 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4866 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_WRITE_DATA, open_attrs_table[i],
4867 FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
4868 printf("open %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
4872 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4873 printf("close %d (1) of %s failed (%s)\n", i, fname, cli_errstr(cli1));
4877 for (j = 0; j < sizeof(open_attrs_table)/sizeof(uint32); j++) {
4878 if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA|FILE_WRITE_DATA, open_attrs_table[j],
4879 FILE_SHARE_NONE, FILE_OVERWRITE, 0, 0, &fnum1))) {
4880 for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
4881 if (attr_results[l].num == k) {
4882 printf("[%d] trunc open 0x%x -> 0x%x of %s failed - should have succeeded !(0x%x:%s)\n",
4883 k, open_attrs_table[i],
4884 open_attrs_table[j],
4885 fname, NT_STATUS_V(cli_nt_error(cli1)), cli_errstr(cli1));
4889 if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_ACCESS_DENIED)) {
4890 printf("[%d] trunc open 0x%x -> 0x%x failed with wrong error code %s\n",
4891 k, open_attrs_table[i], open_attrs_table[j],
4896 printf("[%d] trunc open 0x%x -> 0x%x failed\n", k, open_attrs_table[i], open_attrs_table[j]);
4902 if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
4903 printf("close %d (2) of %s failed (%s)\n", j, fname, cli_errstr(cli1));
4907 if (!NT_STATUS_IS_OK(cli_getatr(cli1, fname, &attr, NULL, NULL))) {
4908 printf("getatr(2) failed (%s)\n", cli_errstr(cli1));
4913 printf("[%d] getatr check [0x%x] trunc [0x%x] got attr 0x%x\n",
4914 k, open_attrs_table[i], open_attrs_table[j], attr );
4917 for (l = 0; l < sizeof(attr_results)/sizeof(struct trunc_open_results); l++) {
4918 if (attr_results[l].num == k) {
4919 if (attr != attr_results[l].result_attr ||
4920 open_attrs_table[i] != attr_results[l].init_attr ||
4921 open_attrs_table[j] != attr_results[l].trunc_attr) {
4922 printf("getatr check failed. [0x%x] trunc [0x%x] got attr 0x%x, should be 0x%x\n",
4923 open_attrs_table[i],
4924 open_attrs_table[j],
4926 attr_results[l].result_attr);
4936 cli_setatr(cli1, fname, 0, 0);
4937 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
4939 printf("open attr test %s.\n", correct ? "passed" : "failed");
4941 if (!torture_close_connection(cli1)) {
4947 static NTSTATUS list_fn(const char *mnt, struct file_info *finfo,
4948 const char *name, void *state)
4950 int *matched = (int *)state;
4951 if (matched != NULL) {
4954 return NT_STATUS_OK;
4958 test directory listing speed
4960 static bool run_dirtest(int dummy)
4963 static struct cli_state *cli;
4965 struct timeval core_start;
4966 bool correct = True;
4969 printf("starting directory test\n");
4971 if (!torture_open_connection(&cli, 0)) {
4975 cli_sockopt(cli, sockops);
4978 for (i=0;i<torture_numops;i++) {
4980 slprintf(fname, sizeof(fname), "\\%x", (int)random());
4981 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE, &fnum))) {
4982 fprintf(stderr,"Failed to open %s\n", fname);
4985 cli_close(cli, fnum);
4988 core_start = timeval_current();
4991 cli_list(cli, "a*.*", 0, list_fn, &matched);
4992 printf("Matched %d\n", matched);
4995 cli_list(cli, "b*.*", 0, list_fn, &matched);
4996 printf("Matched %d\n", matched);
4999 cli_list(cli, "xyzabc", 0, list_fn, &matched);
5000 printf("Matched %d\n", matched);
5002 printf("dirtest core %g seconds\n", timeval_elapsed(&core_start));
5005 for (i=0;i<torture_numops;i++) {
5007 slprintf(fname, sizeof(fname), "\\%x", (int)random());
5008 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
5011 if (!torture_close_connection(cli)) {
5015 printf("finished dirtest\n");
5020 static NTSTATUS del_fn(const char *mnt, struct file_info *finfo, const char *mask,
5023 struct cli_state *pcli = (struct cli_state *)state;
5025 slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
5027 if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
5028 return NT_STATUS_OK;
5030 if (finfo->mode & aDIR) {
5031 if (!NT_STATUS_IS_OK(cli_rmdir(pcli, fname)))
5032 printf("del_fn: failed to rmdir %s\n,", fname );
5034 if (!NT_STATUS_IS_OK(cli_unlink(pcli, fname, aSYSTEM | aHIDDEN)))
5035 printf("del_fn: failed to unlink %s\n,", fname );
5037 return NT_STATUS_OK;
5042 sees what IOCTLs are supported
5044 bool torture_ioctl_test(int dummy)
5046 static struct cli_state *cli;
5047 uint16_t device, function;
5049 const char *fname = "\\ioctl.dat";
5053 if (!torture_open_connection(&cli, 0)) {
5057 printf("starting ioctl test\n");
5059 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
5061 if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum))) {
5062 printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
5066 status = cli_raw_ioctl(cli, fnum, 0x2d0000 | (0x0420<<2), &blob);
5067 printf("ioctl device info: %s\n", nt_errstr(status));
5069 status = cli_raw_ioctl(cli, fnum, IOCTL_QUERY_JOB_INFO, &blob);
5070 printf("ioctl job info: %s\n", nt_errstr(status));
5072 for (device=0;device<0x100;device++) {
5073 printf("ioctl test with device = 0x%x\n", device);
5074 for (function=0;function<0x100;function++) {
5075 uint32 code = (device<<16) | function;
5077 status = cli_raw_ioctl(cli, fnum, code, &blob);
5079 if (NT_STATUS_IS_OK(status)) {
5080 printf("ioctl 0x%x OK : %d bytes\n", (int)code,
5082 data_blob_free(&blob);
5087 if (!torture_close_connection(cli)) {
5096 tries varients of chkpath
5098 bool torture_chkpath_test(int dummy)
5100 static struct cli_state *cli;
5104 if (!torture_open_connection(&cli, 0)) {
5108 printf("starting chkpath test\n");
5110 /* cleanup from an old run */
5111 cli_rmdir(cli, "\\chkpath.dir\\dir2");
5112 cli_unlink(cli, "\\chkpath.dir\\*", aSYSTEM | aHIDDEN);
5113 cli_rmdir(cli, "\\chkpath.dir");
5115 if (!NT_STATUS_IS_OK(cli_mkdir(cli, "\\chkpath.dir"))) {
5116 printf("mkdir1 failed : %s\n", cli_errstr(cli));
5120 if (!NT_STATUS_IS_OK(cli_mkdir(cli, "\\chkpath.dir\\dir2"))) {
5121 printf("mkdir2 failed : %s\n", cli_errstr(cli));
5125 if (!NT_STATUS_IS_OK(cli_open(cli, "\\chkpath.dir\\foo.txt", O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum))) {
5126 printf("open1 failed (%s)\n", cli_errstr(cli));
5129 cli_close(cli, fnum);
5131 if (!NT_STATUS_IS_OK(cli_chkpath(cli, "\\chkpath.dir"))) {
5132 printf("chkpath1 failed: %s\n", cli_errstr(cli));
5136 if (!NT_STATUS_IS_OK(cli_chkpath(cli, "\\chkpath.dir\\dir2"))) {
5137 printf("chkpath2 failed: %s\n", cli_errstr(cli));
5141 if (!NT_STATUS_IS_OK(cli_chkpath(cli, "\\chkpath.dir\\foo.txt"))) {
5142 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath,
5143 NT_STATUS_NOT_A_DIRECTORY);
5145 printf("* chkpath on a file should fail\n");
5149 if (!NT_STATUS_IS_OK(cli_chkpath(cli, "\\chkpath.dir\\bar.txt"))) {
5150 ret = check_error(__LINE__, cli, ERRDOS, ERRbadfile,
5151 NT_STATUS_OBJECT_NAME_NOT_FOUND);
5153 printf("* chkpath on a non existant file should fail\n");
5157 if (!NT_STATUS_IS_OK(cli_chkpath(cli, "\\chkpath.dir\\dirxx\\bar.txt"))) {
5158 ret = check_error(__LINE__, cli, ERRDOS, ERRbadpath,
5159 NT_STATUS_OBJECT_PATH_NOT_FOUND);
5161 printf("* chkpath on a non existent component should fail\n");
5165 cli_rmdir(cli, "\\chkpath.dir\\dir2");
5166 cli_unlink(cli, "\\chkpath.dir\\*", aSYSTEM | aHIDDEN);
5167 cli_rmdir(cli, "\\chkpath.dir");
5169 if (!torture_close_connection(cli)) {
5176 static bool run_eatest(int dummy)
5178 static struct cli_state *cli;
5179 const char *fname = "\\eatest.txt";
5180 bool correct = True;
5184 struct ea_struct *ea_list = NULL;
5185 TALLOC_CTX *mem_ctx = talloc_init("eatest");
5188 printf("starting eatest\n");
5190 if (!torture_open_connection(&cli, 0)) {
5191 talloc_destroy(mem_ctx);
5195 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
5196 if (!NT_STATUS_IS_OK(cli_ntcreate(cli, fname, 0,
5197 FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
5198 FILE_SHARE_NONE, FILE_OVERWRITE_IF,
5199 0x4044, 0, &fnum))) {
5200 printf("open failed - %s\n", cli_errstr(cli));
5201 talloc_destroy(mem_ctx);
5205 for (i = 0; i < 10; i++) {
5206 fstring ea_name, ea_val;
5208 slprintf(ea_name, sizeof(ea_name), "EA_%d", i);
5209 memset(ea_val, (char)i+1, i+1);
5210 status = cli_set_ea_fnum(cli, fnum, ea_name, ea_val, i+1);
5211 if (!NT_STATUS_IS_OK(status)) {
5212 printf("ea_set of name %s failed - %s\n", ea_name,
5214 talloc_destroy(mem_ctx);
5219 cli_close(cli, fnum);
5220 for (i = 0; i < 10; i++) {
5221 fstring ea_name, ea_val;
5223 slprintf(ea_name, sizeof(ea_name), "EA_%d", i+10);
5224 memset(ea_val, (char)i+1, i+1);
5225 status = cli_set_ea_path(cli, fname, ea_name, ea_val, i+1);
5226 if (!NT_STATUS_IS_OK(status)) {
5227 printf("ea_set of name %s failed - %s\n", ea_name,
5229 talloc_destroy(mem_ctx);
5234 status = cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list);
5235 if (!NT_STATUS_IS_OK(status)) {
5236 printf("ea_get list failed - %s\n", nt_errstr(status));
5240 printf("num_eas = %d\n", (int)num_eas);
5242 if (num_eas != 20) {
5243 printf("Should be 20 EA's stored... failing.\n");
5247 for (i = 0; i < num_eas; i++) {
5248 printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
5249 dump_data(0, ea_list[i].value.data,
5250 ea_list[i].value.length);
5253 /* Setting EA's to zero length deletes them. Test this */
5254 printf("Now deleting all EA's - case indepenent....\n");
5257 cli_set_ea_path(cli, fname, "", "", 0);
5259 for (i = 0; i < 20; i++) {
5261 slprintf(ea_name, sizeof(ea_name), "ea_%d", i);
5262 status = cli_set_ea_path(cli, fname, ea_name, "", 0);
5263 if (!NT_STATUS_IS_OK(status)) {
5264 printf("ea_set of name %s failed - %s\n", ea_name,
5266 talloc_destroy(mem_ctx);
5272 status = cli_get_ea_list_path(cli, fname, mem_ctx, &num_eas, &ea_list);
5273 if (!NT_STATUS_IS_OK(status)) {
5274 printf("ea_get list failed - %s\n", nt_errstr(status));
5278 printf("num_eas = %d\n", (int)num_eas);
5279 for (i = 0; i < num_eas; i++) {
5280 printf("%d: ea_name = %s. Val = ", i, ea_list[i].name);
5281 dump_data(0, ea_list[i].value.data,
5282 ea_list[i].value.length);
5286 printf("deleting EA's failed.\n");
5290 /* Try and delete a non existant EA. */
5291 status = cli_set_ea_path(cli, fname, "foo", "", 0);
5292 if (!NT_STATUS_IS_OK(status)) {
5293 printf("deleting non-existant EA 'foo' should succeed. %s\n",
5298 talloc_destroy(mem_ctx);
5299 if (!torture_close_connection(cli)) {
5306 static bool run_dirtest1(int dummy)
5309 static struct cli_state *cli;
5312 bool correct = True;
5314 printf("starting directory test\n");
5316 if (!torture_open_connection(&cli, 0)) {
5320 cli_sockopt(cli, sockops);
5322 cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
5323 cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
5324 cli_rmdir(cli, "\\LISTDIR");
5325 cli_mkdir(cli, "\\LISTDIR");
5327 /* Create 1000 files and 1000 directories. */
5328 for (i=0;i<1000;i++) {
5330 slprintf(fname, sizeof(fname), "\\LISTDIR\\f%d", i);
5331 if (!NT_STATUS_IS_OK(cli_ntcreate(cli, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_ARCHIVE,
5332 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0, &fnum))) {
5333 fprintf(stderr,"Failed to open %s\n", fname);
5336 cli_close(cli, fnum);
5338 for (i=0;i<1000;i++) {
5340 slprintf(fname, sizeof(fname), "\\LISTDIR\\d%d", i);
5341 if (!NT_STATUS_IS_OK(cli_mkdir(cli, fname))) {
5342 fprintf(stderr,"Failed to open %s\n", fname);
5347 /* Now ensure that doing an old list sees both files and directories. */
5349 cli_list_old(cli, "\\LISTDIR\\*", aDIR, list_fn, &num_seen);
5350 printf("num_seen = %d\n", num_seen );
5351 /* We should see 100 files + 1000 directories + . and .. */
5352 if (num_seen != 2002)
5355 /* Ensure if we have the "must have" bits we only see the
5359 cli_list_old(cli, "\\LISTDIR\\*", (aDIR<<8)|aDIR, list_fn, &num_seen);
5360 printf("num_seen = %d\n", num_seen );
5361 if (num_seen != 1002)
5365 cli_list_old(cli, "\\LISTDIR\\*", (aARCH<<8)|aDIR, list_fn, &num_seen);
5366 printf("num_seen = %d\n", num_seen );
5367 if (num_seen != 1000)
5370 /* Delete everything. */
5371 cli_list(cli, "\\LISTDIR\\*", 0, del_fn, cli);
5372 cli_list(cli, "\\LISTDIR\\*", aDIR, del_fn, cli);
5373 cli_rmdir(cli, "\\LISTDIR");
5376 printf("Matched %d\n", cli_list(cli, "a*.*", 0, list_fn, NULL));
5377 printf("Matched %d\n", cli_list(cli, "b*.*", 0, list_fn, NULL));
5378 printf("Matched %d\n", cli_list(cli, "xyzabc", 0, list_fn, NULL));
5381 if (!torture_close_connection(cli)) {
5385 printf("finished dirtest1\n");
5390 static bool run_error_map_extract(int dummy) {
5392 static struct cli_state *c_dos;
5393 static struct cli_state *c_nt;
5398 uint32 flgs2, errnum;
5405 /* NT-Error connection */
5407 if (!(c_nt = open_nbt_connection())) {
5411 c_nt->use_spnego = False;
5413 status = cli_negprot(c_nt);
5415 if (!NT_STATUS_IS_OK(status)) {
5416 printf("%s rejected the NT-error negprot (%s)\n", host,
5422 if (!NT_STATUS_IS_OK(cli_session_setup(c_nt, "", "", 0, "", 0,
5424 printf("%s rejected the NT-error initial session setup (%s)\n",host, cli_errstr(c_nt));
5428 /* DOS-Error connection */
5430 if (!(c_dos = open_nbt_connection())) {
5434 c_dos->use_spnego = False;
5435 c_dos->force_dos_errors = True;
5437 status = cli_negprot(c_dos);
5438 if (!NT_STATUS_IS_OK(status)) {
5439 printf("%s rejected the DOS-error negprot (%s)\n", host,
5441 cli_shutdown(c_dos);
5445 if (!NT_STATUS_IS_OK(cli_session_setup(c_dos, "", "", 0, "", 0,
5447 printf("%s rejected the DOS-error initial session setup (%s)\n",host, cli_errstr(c_dos));
5451 for (error=(0xc0000000 | 0x1); error < (0xc0000000| 0xFFF); error++) {
5452 fstr_sprintf(user, "%X", error);
5454 if (NT_STATUS_IS_OK(cli_session_setup(c_nt, user,
5455 password, strlen(password),
5456 password, strlen(password),
5458 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
5461 flgs2 = SVAL(c_nt->inbuf,smb_flg2);
5463 /* Case #1: 32-bit NT errors */
5464 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
5465 nt_status = NT_STATUS(IVAL(c_nt->inbuf,smb_rcls));
5467 printf("/** Dos error on NT connection! (%s) */\n",
5469 nt_status = NT_STATUS(0xc0000000);
5472 if (NT_STATUS_IS_OK(cli_session_setup(c_dos, user,
5473 password, strlen(password),
5474 password, strlen(password),
5476 printf("/** Session setup succeeded. This shouldn't happen...*/\n");
5478 flgs2 = SVAL(c_dos->inbuf,smb_flg2), errnum;
5480 /* Case #1: 32-bit NT errors */
5481 if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
5482 printf("/** NT error on DOS connection! (%s) */\n",
5484 errnum = errclass = 0;
5486 cli_dos_error(c_dos, &errclass, &errnum);
5489 if (NT_STATUS_V(nt_status) != error) {
5490 printf("/*\t{ This NT error code was 'sqashed'\n\t from %s to %s \n\t during the session setup }\n*/\n",
5491 get_nt_error_c_code(NT_STATUS(error)),
5492 get_nt_error_c_code(nt_status));
5495 printf("\t{%s,\t%s,\t%s},\n",
5496 smb_dos_err_class(errclass),
5497 smb_dos_err_name(errclass, errnum),
5498 get_nt_error_c_code(NT_STATUS(error)));
5503 static bool run_sesssetup_bench(int dummy)
5505 static struct cli_state *c;
5506 const char *fname = "\\file.dat";
5511 if (!torture_open_connection(&c, 0)) {
5515 if (!NT_STATUS_IS_OK(cli_ntcreate(
5516 c, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS,
5517 FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF,
5518 FILE_DELETE_ON_CLOSE, 0, &fnum))) {
5519 d_printf("open %s failed: %s\n", fname, cli_errstr(c));
5523 for (i=0; i<torture_numops; i++) {
5524 status = cli_session_setup(
5526 password, strlen(password),
5527 password, strlen(password),
5529 if (!NT_STATUS_IS_OK(status)) {
5530 d_printf("(%s) cli_session_setup failed: %s\n",
5531 __location__, nt_errstr(status));
5535 d_printf("\r%d ", (int)c->vuid);
5537 status = cli_ulogoff(c);
5538 if (!NT_STATUS_IS_OK(status)) {
5539 d_printf("(%s) cli_ulogoff failed: %s\n",
5540 __location__, nt_errstr(status));
5549 static bool subst_test(const char *str, const char *user, const char *domain,
5550 uid_t uid, gid_t gid, const char *expected)
5555 subst = talloc_sub_specified(talloc_tos(), str, user, domain, uid, gid);
5557 if (strcmp(subst, expected) != 0) {
5558 printf("sub_specified(%s, %s, %s, %d, %d) returned [%s], expected "
5559 "[%s]\n", str, user, domain, (int)uid, (int)gid, subst,
5568 static void chain1_open_completion(struct tevent_req *req)
5572 status = cli_open_recv(req, &fnum);
5575 d_printf("cli_open_recv returned %s: %d\n",
5577 NT_STATUS_IS_OK(status) ? fnum : -1);
5580 static void chain1_write_completion(struct tevent_req *req)
5584 status = cli_write_andx_recv(req, &written);
5587 d_printf("cli_write_andx_recv returned %s: %d\n",
5589 NT_STATUS_IS_OK(status) ? (int)written : -1);
5592 static void chain1_close_completion(struct tevent_req *req)
5595 bool *done = (bool *)tevent_req_callback_data_void(req);
5597 status = cli_close_recv(req);
5602 d_printf("cli_close returned %s\n", nt_errstr(status));
5605 static bool run_chain1(int dummy)
5607 struct cli_state *cli1;
5608 struct event_context *evt = event_context_init(NULL);
5609 struct tevent_req *reqs[3], *smbreqs[3];
5611 const char *str = "foobar";
5614 printf("starting chain1 test\n");
5615 if (!torture_open_connection(&cli1, 0)) {
5619 cli_sockopt(cli1, sockops);
5621 reqs[0] = cli_open_create(talloc_tos(), evt, cli1, "\\test",
5622 O_CREAT|O_RDWR, 0, &smbreqs[0]);
5623 if (reqs[0] == NULL) return false;
5624 tevent_req_set_callback(reqs[0], chain1_open_completion, NULL);
5627 reqs[1] = cli_write_andx_create(talloc_tos(), evt, cli1, 0, 0,
5628 (uint8_t *)str, 0, strlen(str)+1,
5629 smbreqs, 1, &smbreqs[1]);
5630 if (reqs[1] == NULL) return false;
5631 tevent_req_set_callback(reqs[1], chain1_write_completion, NULL);
5633 reqs[2] = cli_close_create(talloc_tos(), evt, cli1, 0, &smbreqs[2]);
5634 if (reqs[2] == NULL) return false;
5635 tevent_req_set_callback(reqs[2], chain1_close_completion, &done);
5637 status = cli_smb_chain_send(smbreqs, ARRAY_SIZE(smbreqs));
5638 if (!NT_STATUS_IS_OK(status)) {
5643 event_loop_once(evt);
5646 torture_close_connection(cli1);
5650 static void chain2_sesssetup_completion(struct tevent_req *req)
5653 status = cli_session_setup_guest_recv(req);
5654 d_printf("sesssetup returned %s\n", nt_errstr(status));
5657 static void chain2_tcon_completion(struct tevent_req *req)
5659 bool *done = (bool *)tevent_req_callback_data_void(req);
5661 status = cli_tcon_andx_recv(req);
5662 d_printf("tcon_and_x returned %s\n", nt_errstr(status));
5666 static bool run_chain2(int dummy)
5668 struct cli_state *cli1;
5669 struct event_context *evt = event_context_init(NULL);
5670 struct tevent_req *reqs[2], *smbreqs[2];
5674 printf("starting chain2 test\n");
5675 status = cli_start_connection(&cli1, global_myname(), host, NULL,
5676 port_to_use, Undefined, 0);
5677 if (!NT_STATUS_IS_OK(status)) {
5681 cli_sockopt(cli1, sockops);
5683 reqs[0] = cli_session_setup_guest_create(talloc_tos(), evt, cli1,
5685 if (reqs[0] == NULL) return false;
5686 tevent_req_set_callback(reqs[0], chain2_sesssetup_completion, NULL);
5688 reqs[1] = cli_tcon_andx_create(talloc_tos(), evt, cli1, "IPC$",
5689 "?????", NULL, 0, &smbreqs[1]);
5690 if (reqs[1] == NULL) return false;
5691 tevent_req_set_callback(reqs[1], chain2_tcon_completion, &done);
5693 status = cli_smb_chain_send(smbreqs, ARRAY_SIZE(smbreqs));
5694 if (!NT_STATUS_IS_OK(status)) {
5699 event_loop_once(evt);
5702 torture_close_connection(cli1);
5707 struct torture_createdel_state {
5708 struct tevent_context *ev;
5709 struct cli_state *cli;
5712 static void torture_createdel_created(struct tevent_req *subreq);
5713 static void torture_createdel_closed(struct tevent_req *subreq);
5715 static struct tevent_req *torture_createdel_send(TALLOC_CTX *mem_ctx,
5716 struct tevent_context *ev,
5717 struct cli_state *cli,
5720 struct tevent_req *req, *subreq;
5721 struct torture_createdel_state *state;
5723 req = tevent_req_create(mem_ctx, &state,
5724 struct torture_createdel_state);
5731 subreq = cli_ntcreate_send(
5732 state, ev, cli, name, 0,
5733 FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS,
5734 FILE_ATTRIBUTE_NORMAL,
5735 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
5736 FILE_OPEN_IF, FILE_DELETE_ON_CLOSE, 0);
5738 if (tevent_req_nomem(subreq, req)) {
5739 return tevent_req_post(req, ev);
5741 tevent_req_set_callback(subreq, torture_createdel_created, req);
5745 static void torture_createdel_created(struct tevent_req *subreq)
5747 struct tevent_req *req = tevent_req_callback_data(
5748 subreq, struct tevent_req);
5749 struct torture_createdel_state *state = tevent_req_data(
5750 req, struct torture_createdel_state);
5754 status = cli_ntcreate_recv(subreq, &fnum);
5755 TALLOC_FREE(subreq);
5756 if (!NT_STATUS_IS_OK(status)) {
5757 DEBUG(10, ("cli_ntcreate_recv returned %s\n",
5758 nt_errstr(status)));
5759 tevent_req_nterror(req, status);
5763 subreq = cli_close_send(state, state->ev, state->cli, fnum);
5764 if (tevent_req_nomem(subreq, req)) {
5767 tevent_req_set_callback(subreq, torture_createdel_closed, req);
5770 static void torture_createdel_closed(struct tevent_req *subreq)
5772 struct tevent_req *req = tevent_req_callback_data(
5773 subreq, struct tevent_req);
5776 status = cli_close_recv(subreq);
5777 if (!NT_STATUS_IS_OK(status)) {
5778 DEBUG(10, ("cli_close_recv returned %s\n", nt_errstr(status)));
5779 tevent_req_nterror(req, status);
5782 tevent_req_done(req);
5785 static NTSTATUS torture_createdel_recv(struct tevent_req *req)
5787 return tevent_req_simple_recv_ntstatus(req);
5790 struct torture_createdels_state {
5791 struct tevent_context *ev;
5792 struct cli_state *cli;
5793 const char *base_name;
5797 struct tevent_req **reqs;
5800 static void torture_createdels_done(struct tevent_req *subreq);
5802 static struct tevent_req *torture_createdels_send(TALLOC_CTX *mem_ctx,
5803 struct tevent_context *ev,
5804 struct cli_state *cli,
5805 const char *base_name,
5809 struct tevent_req *req;
5810 struct torture_createdels_state *state;
5813 req = tevent_req_create(mem_ctx, &state,
5814 struct torture_createdels_state);
5820 state->base_name = talloc_strdup(state, base_name);
5821 if (tevent_req_nomem(state->base_name, req)) {
5822 return tevent_req_post(req, ev);
5824 state->num_files = MAX(num_parallel, num_files);
5826 state->received = 0;
5828 state->reqs = talloc_array(state, struct tevent_req *, num_parallel);
5829 if (tevent_req_nomem(state->reqs, req)) {
5830 return tevent_req_post(req, ev);
5833 for (i=0; i<num_parallel; i++) {
5836 name = talloc_asprintf(state, "%s%8.8d", state->base_name,
5838 if (tevent_req_nomem(name, req)) {
5839 return tevent_req_post(req, ev);
5841 state->reqs[i] = torture_createdel_send(
5842 state->reqs, state->ev, state->cli, name);
5843 if (tevent_req_nomem(state->reqs[i], req)) {
5844 return tevent_req_post(req, ev);
5846 name = talloc_move(state->reqs[i], &name);
5847 tevent_req_set_callback(state->reqs[i],
5848 torture_createdels_done, req);
5854 static void torture_createdels_done(struct tevent_req *subreq)
5856 struct tevent_req *req = tevent_req_callback_data(
5857 subreq, struct tevent_req);
5858 struct torture_createdels_state *state = tevent_req_data(
5859 req, struct torture_createdels_state);
5860 size_t num_parallel = talloc_array_length(state->reqs);
5865 status = torture_createdel_recv(subreq);
5866 if (!NT_STATUS_IS_OK(status)){
5867 DEBUG(10, ("torture_createdel_recv returned %s\n",
5868 nt_errstr(status)));
5869 TALLOC_FREE(subreq);
5870 tevent_req_nterror(req, status);
5874 for (i=0; i<num_parallel; i++) {
5875 if (subreq == state->reqs[i]) {
5879 if (i == num_parallel) {
5880 DEBUG(10, ("received something we did not send\n"));
5881 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
5884 TALLOC_FREE(state->reqs[i]);
5886 if (state->sent >= state->num_files) {
5887 tevent_req_done(req);
5891 name = talloc_asprintf(state, "%s%8.8d", state->base_name,
5893 if (tevent_req_nomem(name, req)) {
5896 state->reqs[i] = torture_createdel_send(state->reqs, state->ev,
5898 if (tevent_req_nomem(state->reqs[i], req)) {
5901 name = talloc_move(state->reqs[i], &name);
5902 tevent_req_set_callback(state->reqs[i], torture_createdels_done, req);
5906 static NTSTATUS torture_createdels_recv(struct tevent_req *req)
5908 return tevent_req_simple_recv_ntstatus(req);
5911 struct swallow_notify_state {
5912 struct tevent_context *ev;
5913 struct cli_state *cli;
5915 uint32_t completion_filter;
5917 bool (*fn)(uint32_t action, const char *name, void *priv);
5921 static void swallow_notify_done(struct tevent_req *subreq);
5923 static struct tevent_req *swallow_notify_send(TALLOC_CTX *mem_ctx,
5924 struct tevent_context *ev,
5925 struct cli_state *cli,
5927 uint32_t completion_filter,
5929 bool (*fn)(uint32_t action,
5934 struct tevent_req *req, *subreq;
5935 struct swallow_notify_state *state;
5937 req = tevent_req_create(mem_ctx, &state,
5938 struct swallow_notify_state);
5945 state->completion_filter = completion_filter;
5946 state->recursive = recursive;
5950 subreq = cli_notify_send(state, state->ev, state->cli, state->fnum,
5951 0xffff, state->completion_filter,
5953 if (tevent_req_nomem(subreq, req)) {
5954 return tevent_req_post(req, ev);
5956 tevent_req_set_callback(subreq, swallow_notify_done, req);
5960 static void swallow_notify_done(struct tevent_req *subreq)
5962 struct tevent_req *req = tevent_req_callback_data(
5963 subreq, struct tevent_req);
5964 struct swallow_notify_state *state = tevent_req_data(
5965 req, struct swallow_notify_state);
5967 uint32_t i, num_changes;
5968 struct notify_change *changes;
5970 status = cli_notify_recv(subreq, state, &num_changes, &changes);
5971 TALLOC_FREE(subreq);
5972 if (!NT_STATUS_IS_OK(status)) {
5973 DEBUG(10, ("cli_notify_recv returned %s\n",
5974 nt_errstr(status)));
5975 tevent_req_nterror(req, status);
5979 for (i=0; i<num_changes; i++) {
5980 state->fn(changes[i].action, changes[i].name, state->priv);
5982 TALLOC_FREE(changes);
5984 subreq = cli_notify_send(state, state->ev, state->cli, state->fnum,
5985 0xffff, state->completion_filter,
5987 if (tevent_req_nomem(subreq, req)) {
5990 tevent_req_set_callback(subreq, swallow_notify_done, req);
5993 static bool print_notifies(uint32_t action, const char *name, void *priv)
5995 if (DEBUGLEVEL > 5) {
5996 d_printf("%d %s\n", (int)action, name);
6001 static void notify_bench_done(struct tevent_req *req)
6003 int *num_finished = (int *)tevent_req_callback_data_void(req);
6007 static bool run_notify_bench(int dummy)
6009 const char *dname = "\\notify-bench";
6010 struct tevent_context *ev;
6013 struct tevent_req *req1;
6014 struct tevent_req *req2 = NULL;
6015 int i, num_unc_names;
6016 int num_finished = 0;
6018 printf("starting notify-bench test\n");
6020 if (use_multishare_conn) {
6022 unc_list = file_lines_load(multishare_conn_fname,
6023 &num_unc_names, 0, NULL);
6024 if (!unc_list || num_unc_names <= 0) {
6025 d_printf("Failed to load unc names list from '%s'\n",
6026 multishare_conn_fname);
6029 TALLOC_FREE(unc_list);
6034 ev = tevent_context_init(talloc_tos());
6036 d_printf("tevent_context_init failed\n");
6040 for (i=0; i<num_unc_names; i++) {
6041 struct cli_state *cli;
6044 base_fname = talloc_asprintf(talloc_tos(), "%s\\file%3.3d.",
6046 if (base_fname == NULL) {
6050 if (!torture_open_connection(&cli, i)) {
6054 status = cli_ntcreate(cli, dname, 0,
6055 MAXIMUM_ALLOWED_ACCESS,
6056 0, FILE_SHARE_READ|FILE_SHARE_WRITE|
6058 FILE_OPEN_IF, FILE_DIRECTORY_FILE, 0,
6061 if (!NT_STATUS_IS_OK(status)) {
6062 d_printf("Could not create %s: %s\n", dname,
6067 req1 = swallow_notify_send(talloc_tos(), ev, cli, dnum,
6068 FILE_NOTIFY_CHANGE_FILE_NAME |
6069 FILE_NOTIFY_CHANGE_DIR_NAME |
6070 FILE_NOTIFY_CHANGE_ATTRIBUTES |
6071 FILE_NOTIFY_CHANGE_LAST_WRITE,
6072 false, print_notifies, NULL);
6074 d_printf("Could not create notify request\n");
6078 req2 = torture_createdels_send(talloc_tos(), ev, cli,
6079 base_fname, 10, torture_numops);
6081 d_printf("Could not create createdels request\n");
6084 TALLOC_FREE(base_fname);
6086 tevent_req_set_callback(req2, notify_bench_done,
6090 while (num_finished < num_unc_names) {
6092 ret = tevent_loop_once(ev);
6094 d_printf("tevent_loop_once failed\n");
6099 if (!tevent_req_poll(req2, ev)) {
6100 d_printf("tevent_req_poll failed\n");
6103 status = torture_createdels_recv(req2);
6104 d_printf("torture_createdels_recv returned %s\n", nt_errstr(status));
6109 static bool run_mangle1(int dummy)
6111 struct cli_state *cli;
6112 const char *fname = "this_is_a_long_fname_to_be_mangled.txt";
6116 time_t change_time, access_time, write_time;
6120 printf("starting mangle1 test\n");
6121 if (!torture_open_connection(&cli, 0)) {
6125 cli_sockopt(cli, sockops);
6127 if (!NT_STATUS_IS_OK(cli_ntcreate(
6128 cli, fname, 0, GENERIC_ALL_ACCESS|DELETE_ACCESS,
6129 FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, 0, 0, &fnum))) {
6130 d_printf("open %s failed: %s\n", fname, cli_errstr(cli));
6133 cli_close(cli, fnum);
6135 status = cli_qpathinfo_alt_name(cli, fname, alt_name);
6136 if (!NT_STATUS_IS_OK(status)) {
6137 d_printf("cli_qpathinfo_alt_name failed: %s\n",
6141 d_printf("alt_name: %s\n", alt_name);
6143 if (!NT_STATUS_IS_OK(cli_open(cli, alt_name, O_RDONLY, DENY_NONE, &fnum))) {
6144 d_printf("cli_open(%s) failed: %s\n", alt_name,
6148 cli_close(cli, fnum);
6150 status = cli_qpathinfo1(cli, alt_name, &change_time, &access_time,
6151 &write_time, &size, &mode);
6152 if (!NT_STATUS_IS_OK(status)) {
6153 d_printf("cli_qpathinfo1(%s) failed: %s\n", alt_name,
6161 static size_t null_source(uint8_t *buf, size_t n, void *priv)
6163 size_t *to_pull = (size_t *)priv;
6164 size_t thistime = *to_pull;
6166 thistime = MIN(thistime, n);
6167 if (thistime == 0) {
6171 memset(buf, 0, thistime);
6172 *to_pull -= thistime;
6176 static bool run_windows_write(int dummy)
6178 struct cli_state *cli1;
6182 const char *fname = "\\writetest.txt";
6183 struct timeval start_time;
6187 printf("starting windows_write test\n");
6188 if (!torture_open_connection(&cli1, 0)) {
6192 if (!NT_STATUS_IS_OK(cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum))) {
6193 printf("open failed (%s)\n", cli_errstr(cli1));
6197 cli_sockopt(cli1, sockops);
6199 start_time = timeval_current();
6201 for (i=0; i<torture_numops; i++) {
6203 off_t start = i * torture_blocksize;
6205 size_t to_pull = torture_blocksize - 1;
6207 if (cli_write(cli1, fnum, 0, &c,
6208 start + torture_blocksize - 1, 1) != 1) {
6209 printf("cli_write failed: %s\n", cli_errstr(cli1));
6213 status = cli_push(cli1, fnum, 0, i * torture_blocksize, torture_blocksize,
6214 null_source, &to_pull);
6215 if (!NT_STATUS_IS_OK(status)) {
6216 printf("cli_push returned: %s\n", nt_errstr(status));
6221 seconds = timeval_elapsed(&start_time);
6222 kbytes = (double)torture_blocksize * torture_numops;
6225 printf("Wrote %d kbytes in %.2f seconds: %d kb/sec\n", (int)kbytes,
6226 (double)seconds, (int)(kbytes/seconds));
6230 cli_close(cli1, fnum);
6231 cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
6232 torture_close_connection(cli1);
6236 static bool run_cli_echo(int dummy)
6238 struct cli_state *cli;
6241 printf("starting cli_echo test\n");
6242 if (!torture_open_connection(&cli, 0)) {
6245 cli_sockopt(cli, sockops);
6247 status = cli_echo(cli, 5, data_blob_const("hello", 5));
6249 d_printf("cli_echo returned %s\n", nt_errstr(status));
6251 torture_close_connection(cli);
6252 return NT_STATUS_IS_OK(status);
6255 static bool run_uid_regression_test(int dummy)
6257 static struct cli_state *cli;
6260 bool correct = True;
6263 printf("starting uid regression test\n");
6265 if (!torture_open_connection(&cli, 0)) {
6269 cli_sockopt(cli, sockops);
6271 /* Ok - now save then logoff our current user. */
6272 old_vuid = cli->vuid;
6274 status = cli_ulogoff(cli);
6275 if (!NT_STATUS_IS_OK(status)) {
6276 d_printf("(%s) cli_ulogoff failed: %s\n",
6277 __location__, nt_errstr(status));
6282 cli->vuid = old_vuid;
6284 /* Try an operation. */
6285 status = cli_mkdir(cli, "\\uid_reg_test");
6286 if (NT_STATUS_IS_OK(status)) {
6287 d_printf("(%s) cli_mkdir succeeded\n",
6292 /* Should be bad uid. */
6293 if (!check_error(__LINE__, cli, ERRSRV, ERRbaduid,
6294 NT_STATUS_USER_SESSION_DELETED)) {
6300 old_cnum = cli->cnum;
6302 /* Now try a SMBtdis with the invald vuid set to zero. */
6305 /* This should succeed. */
6306 status = cli_tdis(cli);
6308 if (NT_STATUS_IS_OK(status)) {
6309 d_printf("First tdis with invalid vuid should succeed.\n");
6311 d_printf("First tdis failed (%s)\n", nt_errstr(status));
6316 cli->vuid = old_vuid;
6317 cli->cnum = old_cnum;
6319 /* This should fail. */
6320 status = cli_tdis(cli);
6321 if (NT_STATUS_IS_OK(status)) {
6322 d_printf("Second tdis with invalid vuid should fail - succeeded instead !.\n");
6326 /* Should be bad tid. */
6327 if (!check_error(__LINE__, cli, ERRSRV, ERRinvnid,
6328 NT_STATUS_NETWORK_NAME_DELETED)) {
6334 cli_rmdir(cli, "\\uid_reg_test");
6343 static const char *illegal_chars = "*\\/?<>|\":";
6344 static char force_shortname_chars[] = " +,.[];=\177";
6346 static NTSTATUS shortname_del_fn(const char *mnt, struct file_info *finfo,
6347 const char *mask, void *state)
6349 struct cli_state *pcli = (struct cli_state *)state;
6351 NTSTATUS status = NT_STATUS_OK;
6353 slprintf(fname, sizeof(fname), "\\shortname\\%s", finfo->name);
6355 if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
6356 return NT_STATUS_OK;
6358 if (finfo->mode & aDIR) {
6359 status = cli_rmdir(pcli, fname);
6360 if (!NT_STATUS_IS_OK(status)) {
6361 printf("del_fn: failed to rmdir %s\n,", fname );
6364 status = cli_unlink(pcli, fname, aSYSTEM | aHIDDEN);
6365 if (!NT_STATUS_IS_OK(status)) {
6366 printf("del_fn: failed to unlink %s\n,", fname );
6378 static NTSTATUS shortname_list_fn(const char *mnt, struct file_info *finfo,
6379 const char *name, void *state)
6381 struct sn_state *s = (struct sn_state *)state;
6385 printf("shortname list: i = %d, name = |%s|, shortname = |%s|\n",
6386 i, finfo->name, finfo->short_name);
6389 if (strchr(force_shortname_chars, i)) {
6390 if (!finfo->short_name[0]) {
6391 /* Shortname not created when it should be. */
6392 d_printf("(%s) ERROR: Shortname was not created for file %s containing %d\n",
6393 __location__, finfo->name, i);
6396 } else if (finfo->short_name[0]){
6397 /* Shortname created when it should not be. */
6398 d_printf("(%s) ERROR: Shortname %s was created for file %s\n",
6399 __location__, finfo->short_name, finfo->name);
6403 return NT_STATUS_OK;
6406 static bool run_shortname_test(int dummy)
6408 static struct cli_state *cli;
6409 bool correct = True;
6414 printf("starting shortname test\n");
6416 if (!torture_open_connection(&cli, 0)) {
6420 cli_sockopt(cli, sockops);
6422 cli_list(cli, "\\shortname\\*", 0, shortname_del_fn, cli);
6423 cli_list(cli, "\\shortname\\*", aDIR, shortname_del_fn, cli);
6424 cli_rmdir(cli, "\\shortname");
6426 if (!NT_STATUS_IS_OK(cli_mkdir(cli, "\\shortname"))) {
6427 d_printf("(%s) cli_mkdir of \\shortname failed: %s\n",
6428 __location__, cli_errstr(cli));
6433 strlcpy(fname, "\\shortname\\", sizeof(fname));
6434 strlcat(fname, "test .txt", sizeof(fname));
6438 for (i = 32; i < 128; i++) {
6440 uint16_t fnum = (uint16_t)-1;
6444 if (strchr(illegal_chars, i)) {
6449 status = cli_ntcreate(cli, fname, 0, GENERIC_ALL_ACCESS, FILE_ATTRIBUTE_NORMAL,
6450 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OVERWRITE_IF, 0, 0, &fnum);
6451 if (!NT_STATUS_IS_OK(status)) {
6452 d_printf("(%s) cli_nt_create of %s failed: %s\n",
6453 __location__, fname, cli_errstr(cli));
6457 cli_close(cli, fnum);
6460 cli_list(cli, "\\shortname\\test*.*", 0, shortname_list_fn,
6462 if (s.matched != 1) {
6463 d_printf("(%s) failed to list %s: %s\n",
6464 __location__, fname, cli_errstr(cli));
6468 if (!NT_STATUS_IS_OK(cli_unlink(cli, fname, aSYSTEM | aHIDDEN))) {
6469 d_printf("(%s) failed to delete %s: %s\n",
6470 __location__, fname, cli_errstr(cli));
6483 cli_list(cli, "\\shortname\\*", 0, shortname_del_fn, cli);
6484 cli_list(cli, "\\shortname\\*", aDIR, shortname_del_fn, cli);
6485 cli_rmdir(cli, "\\shortname");
6486 torture_close_connection(cli);
6490 static void pagedsearch_cb(struct tevent_req *req)
6493 struct tldap_message *msg;
6496 rc = tldap_search_paged_recv(req, talloc_tos(), &msg);
6497 if (rc != TLDAP_SUCCESS) {
6498 d_printf("tldap_search_paged_recv failed: %s\n",
6499 tldap_err2string(rc));
6502 if (tldap_msg_type(msg) != TLDAP_RES_SEARCH_ENTRY) {
6506 if (!tldap_entry_dn(msg, &dn)) {
6507 d_printf("tldap_entry_dn failed\n");
6510 d_printf("%s\n", dn);
6514 static bool run_tldap(int dummy)
6516 struct tldap_context *ld;
6519 struct sockaddr_storage addr;
6520 struct tevent_context *ev;
6521 struct tevent_req *req;
6525 if (!resolve_name(host, &addr, 0, false)) {
6526 d_printf("could not find host %s\n", host);
6529 status = open_socket_out(&addr, 389, 9999, &fd);
6530 if (!NT_STATUS_IS_OK(status)) {
6531 d_printf("open_socket_out failed: %s\n", nt_errstr(status));
6535 ld = tldap_context_create(talloc_tos(), fd);
6538 d_printf("tldap_context_create failed\n");
6542 rc = tldap_fetch_rootdse(ld);
6543 if (rc != TLDAP_SUCCESS) {
6544 d_printf("tldap_fetch_rootdse failed: %s\n",
6545 tldap_errstr(talloc_tos(), ld, rc));
6549 basedn = tldap_talloc_single_attribute(
6550 tldap_rootdse(ld), "defaultNamingContext", talloc_tos());
6551 if (basedn == NULL) {
6552 d_printf("no defaultNamingContext\n");
6555 d_printf("defaultNamingContext: %s\n", basedn);
6557 ev = tevent_context_init(talloc_tos());
6559 d_printf("tevent_context_init failed\n");
6563 req = tldap_search_paged_send(talloc_tos(), ev, ld, basedn,
6564 TLDAP_SCOPE_SUB, "(objectclass=*)",
6566 NULL, 0, NULL, 0, 0, 0, 0, 5);
6568 d_printf("tldap_search_paged_send failed\n");
6571 tevent_req_set_callback(req, pagedsearch_cb, NULL);
6573 tevent_req_poll(req, ev);
6577 /* test search filters against rootDSE */
6578 filter = "(&(|(name=samba)(nextRid<=10000000)(usnChanged>=10)(samba~=ambas)(!(name=s*m*a)))"
6579 "(|(name:=samba)(name:dn:2.5.13.5:=samba)(:dn:2.5.13.5:=samba)(!(name=*samba))))";
6581 rc = tldap_search(ld, "", TLDAP_SCOPE_BASE, filter,
6582 NULL, 0, 0, NULL, 0, NULL, 0, 0, 0, 0,
6583 talloc_tos(), NULL, NULL);
6584 if (rc != TLDAP_SUCCESS) {
6585 d_printf("tldap_search with complex filter failed: %s\n",
6586 tldap_errstr(talloc_tos(), ld, rc));
6594 /* Torture test to ensure no regression of :
6595 https://bugzilla.samba.org/show_bug.cgi?id=7084
6598 static bool run_dir_createtime(int dummy)
6600 struct cli_state *cli;
6601 const char *dname = "\\testdir";
6602 const char *fname = "\\testdir\\testfile";
6604 struct timespec create_time;
6605 struct timespec create_time1;
6609 if (!torture_open_connection(&cli, 0)) {
6613 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
6614 cli_rmdir(cli, dname);
6616 status = cli_mkdir(cli, dname);
6617 if (!NT_STATUS_IS_OK(status)) {
6618 printf("mkdir failed: %s\n", nt_errstr(status));
6622 status = cli_qpathinfo2(cli, dname, &create_time, NULL, NULL, NULL,
6624 if (!NT_STATUS_IS_OK(status)) {
6625 printf("cli_qpathinfo2 returned %s\n",
6630 /* Sleep 3 seconds, then create a file. */
6633 status = cli_open(cli, fname, O_RDWR | O_CREAT | O_EXCL,
6635 if (!NT_STATUS_IS_OK(status)) {
6636 printf("cli_open failed: %s\n", nt_errstr(status));
6640 status = cli_qpathinfo2(cli, dname, &create_time1, NULL, NULL, NULL,
6642 if (!NT_STATUS_IS_OK(status)) {
6643 printf("cli_qpathinfo2 (2) returned %s\n",
6648 if (timespec_compare(&create_time1, &create_time)) {
6649 printf("run_dir_createtime: create time was updated (error)\n");
6651 printf("run_dir_createtime: create time was not updated (correct)\n");
6657 cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
6658 cli_rmdir(cli, dname);
6659 if (!torture_close_connection(cli)) {
6666 static bool run_streamerror(int dummy)
6668 struct cli_state *cli;
6669 const char *dname = "\\testdir";
6670 const char *streamname =
6671 "testdir:{4c8cc155-6c1e-11d1-8e41-00c04fb9386d}:$DATA";
6673 time_t change_time, access_time, write_time;
6675 uint16_t mode, fnum;
6678 if (!torture_open_connection(&cli, 0)) {
6682 cli_unlink(cli, "\\testdir\\*", aSYSTEM | aHIDDEN);
6683 cli_rmdir(cli, dname);
6685 status = cli_mkdir(cli, dname);
6686 if (!NT_STATUS_IS_OK(status)) {
6687 printf("mkdir failed: %s\n", nt_errstr(status));
6691 cli_qpathinfo1(cli, streamname, &change_time, &access_time, &write_time,
6693 status = cli_nt_error(cli);
6695 if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
6696 printf("pathinfo returned %s, expected "
6697 "NT_STATUS_OBJECT_NAME_NOT_FOUND\n",
6702 status = cli_ntcreate(cli, streamname, 0x16,
6703 FILE_READ_DATA|FILE_READ_EA|
6704 FILE_READ_ATTRIBUTES|READ_CONTROL_ACCESS,
6705 FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,
6706 FILE_OPEN, 0, 0, &fnum);
6708 if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
6709 printf("ntcreate returned %s, expected "
6710 "NT_STATUS_OBJECT_NAME_NOT_FOUND\n",
6716 cli_rmdir(cli, dname);
6720 static bool run_local_substitute(int dummy)
6724 ok &= subst_test("%U", "bla", "", -1, -1, "bla");
6725 ok &= subst_test("%u%U", "bla", "", -1, -1, "blabla");
6726 ok &= subst_test("%g", "", "", -1, -1, "NO_GROUP");
6727 ok &= subst_test("%G", "", "", -1, -1, "NO_GROUP");
6728 ok &= subst_test("%g", "", "", -1, 0, gidtoname(0));
6729 ok &= subst_test("%G", "", "", -1, 0, gidtoname(0));
6730 ok &= subst_test("%D%u", "u", "dom", -1, 0, "domu");
6731 ok &= subst_test("%i %I", "", "", -1, -1, "0.0.0.0 0.0.0.0");
6733 /* Different captialization rules in sub_basic... */
6735 ok &= (strcmp(talloc_sub_basic(talloc_tos(), "BLA", "dom", "%U%D"),
6741 static bool run_local_base64(int dummy)
6746 for (i=1; i<2000; i++) {
6747 DATA_BLOB blob1, blob2;
6750 blob1.data = talloc_array(talloc_tos(), uint8_t, i);
6752 generate_random_buffer(blob1.data, blob1.length);
6754 b64 = base64_encode_data_blob(talloc_tos(), blob1);
6756 d_fprintf(stderr, "base64_encode_data_blob failed "
6757 "for %d bytes\n", i);
6760 blob2 = base64_decode_data_blob(b64);
6763 if (data_blob_cmp(&blob1, &blob2)) {
6764 d_fprintf(stderr, "data_blob_cmp failed for %d "
6768 TALLOC_FREE(blob1.data);
6769 data_blob_free(&blob2);
6774 static bool run_local_gencache(int dummy)
6780 if (!gencache_set("foo", "bar", time(NULL) + 1000)) {
6781 d_printf("%s: gencache_set() failed\n", __location__);
6785 if (!gencache_get("foo", NULL, NULL)) {
6786 d_printf("%s: gencache_get() failed\n", __location__);
6790 if (!gencache_get("foo", &val, &tm)) {
6791 d_printf("%s: gencache_get() failed\n", __location__);
6795 if (strcmp(val, "bar") != 0) {
6796 d_printf("%s: gencache_get() returned %s, expected %s\n",
6797 __location__, val, "bar");
6804 if (!gencache_del("foo")) {
6805 d_printf("%s: gencache_del() failed\n", __location__);
6808 if (gencache_del("foo")) {
6809 d_printf("%s: second gencache_del() succeeded\n",
6814 if (gencache_get("foo", &val, &tm)) {
6815 d_printf("%s: gencache_get() on deleted entry "
6816 "succeeded\n", __location__);
6820 blob = data_blob_string_const_null("bar");
6821 tm = time(NULL) + 60;
6823 if (!gencache_set_data_blob("foo", &blob, tm)) {
6824 d_printf("%s: gencache_set_data_blob() failed\n", __location__);
6828 if (!gencache_get_data_blob("foo", &blob, NULL, NULL)) {
6829 d_printf("%s: gencache_get_data_blob() failed\n", __location__);
6833 if (strcmp((const char *)blob.data, "bar") != 0) {
6834 d_printf("%s: gencache_get_data_blob() returned %s, expected %s\n",
6835 __location__, (const char *)blob.data, "bar");
6836 data_blob_free(&blob);
6840 data_blob_free(&blob);
6842 if (!gencache_del("foo")) {
6843 d_printf("%s: gencache_del() failed\n", __location__);
6846 if (gencache_del("foo")) {
6847 d_printf("%s: second gencache_del() succeeded\n",
6852 if (gencache_get_data_blob("foo", &blob, NULL, NULL)) {
6853 d_printf("%s: gencache_get_data_blob() on deleted entry "
6854 "succeeded\n", __location__);
6861 static bool rbt_testval(struct db_context *db, const char *key,
6864 struct db_record *rec;
6865 TDB_DATA data = string_tdb_data(value);
6869 rec = db->fetch_locked(db, db, string_tdb_data(key));
6871 d_fprintf(stderr, "fetch_locked failed\n");
6874 status = rec->store(rec, data, 0);
6875 if (!NT_STATUS_IS_OK(status)) {
6876 d_fprintf(stderr, "store failed: %s\n", nt_errstr(status));
6881 rec = db->fetch_locked(db, db, string_tdb_data(key));
6883 d_fprintf(stderr, "second fetch_locked failed\n");
6886 if ((rec->value.dsize != data.dsize)
6887 || (memcmp(rec->value.dptr, data.dptr, data.dsize) != 0)) {
6888 d_fprintf(stderr, "Got wrong data back\n");
6898 static bool run_local_rbtree(int dummy)
6900 struct db_context *db;
6904 db = db_open_rbt(NULL);
6907 d_fprintf(stderr, "db_open_rbt failed\n");
6911 for (i=0; i<1000; i++) {
6914 if (asprintf(&key, "key%ld", random()) == -1) {
6917 if (asprintf(&value, "value%ld", random()) == -1) {
6922 if (!rbt_testval(db, key, value)) {
6929 if (asprintf(&value, "value%ld", random()) == -1) {
6934 if (!rbt_testval(db, key, value)) {
6951 struct talloc_dict_test {
6955 static int talloc_dict_traverse_fn(DATA_BLOB key, void *data, void *priv)
6957 int *count = (int *)priv;
6962 static bool run_local_talloc_dict(int dummy)
6964 struct talloc_dict *dict;
6965 struct talloc_dict_test *t;
6968 dict = talloc_dict_init(talloc_tos());
6973 t = talloc(talloc_tos(), struct talloc_dict_test);
6980 if (!talloc_dict_set(dict, data_blob_const(&key, sizeof(key)), t)) {
6985 if (talloc_dict_traverse(dict, talloc_dict_traverse_fn, &count) != 0) {
6998 static bool run_local_string_to_sid(int dummy) {
7001 if (string_to_sid(&sid, "S--1-5-32-545")) {
7002 printf("allowing S--1-5-32-545\n");
7005 if (string_to_sid(&sid, "S-1-5-32-+545")) {
7006 printf("allowing S-1-5-32-+545\n");
7009 if (string_to_sid(&sid, "S-1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-7-8-9-0")) {
7010 printf("allowing S-1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-7-8-9-0\n");
7013 if (string_to_sid(&sid, "S-1-5-32-545-abc")) {
7014 printf("allowing S-1-5-32-545-abc\n");
7017 if (!string_to_sid(&sid, "S-1-5-32-545")) {
7018 printf("could not parse S-1-5-32-545\n");
7021 if (!dom_sid_equal(&sid, &global_sid_Builtin_Users)) {
7022 printf("mis-parsed S-1-5-32-545 as %s\n",
7023 sid_string_tos(&sid));
7029 static bool run_local_binary_to_sid(int dummy) {
7030 struct dom_sid *sid = talloc(NULL, struct dom_sid);
7031 static const char good_binary_sid[] = {
7032 0x1, /* revision number */
7034 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
7035 0x1, 0x1, 0x1, 0x1, /* auth[0] */
7036 0x1, 0x1, 0x1, 0x1, /* auth[1] */
7037 0x1, 0x1, 0x1, 0x1, /* auth[2] */
7038 0x1, 0x1, 0x1, 0x1, /* auth[3] */
7039 0x1, 0x1, 0x1, 0x1, /* auth[4] */
7040 0x1, 0x1, 0x1, 0x1, /* auth[5] */
7041 0x1, 0x1, 0x1, 0x1, /* auth[6] */
7042 0x1, 0x1, 0x1, 0x1, /* auth[7] */
7043 0x1, 0x1, 0x1, 0x1, /* auth[8] */
7044 0x1, 0x1, 0x1, 0x1, /* auth[9] */
7045 0x1, 0x1, 0x1, 0x1, /* auth[10] */
7046 0x1, 0x1, 0x1, 0x1, /* auth[11] */
7047 0x1, 0x1, 0x1, 0x1, /* auth[12] */
7048 0x1, 0x1, 0x1, 0x1, /* auth[13] */
7049 0x1, 0x1, 0x1, 0x1, /* auth[14] */
7052 static const char long_binary_sid[] = {
7053 0x1, /* revision number */
7055 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
7056 0x1, 0x1, 0x1, 0x1, /* auth[0] */
7057 0x1, 0x1, 0x1, 0x1, /* auth[1] */
7058 0x1, 0x1, 0x1, 0x1, /* auth[2] */
7059 0x1, 0x1, 0x1, 0x1, /* auth[3] */
7060 0x1, 0x1, 0x1, 0x1, /* auth[4] */
7061 0x1, 0x1, 0x1, 0x1, /* auth[5] */
7062 0x1, 0x1, 0x1, 0x1, /* auth[6] */
7063 0x1, 0x1, 0x1, 0x1, /* auth[7] */
7064 0x1, 0x1, 0x1, 0x1, /* auth[8] */
7065 0x1, 0x1, 0x1, 0x1, /* auth[9] */
7066 0x1, 0x1, 0x1, 0x1, /* auth[10] */
7067 0x1, 0x1, 0x1, 0x1, /* auth[11] */
7068 0x1, 0x1, 0x1, 0x1, /* auth[12] */
7069 0x1, 0x1, 0x1, 0x1, /* auth[13] */
7070 0x1, 0x1, 0x1, 0x1, /* auth[14] */
7071 0x1, 0x1, 0x1, 0x1, /* auth[15] */
7072 0x1, 0x1, 0x1, 0x1, /* auth[16] */
7073 0x1, 0x1, 0x1, 0x1, /* auth[17] */
7076 static const char long_binary_sid2[] = {
7077 0x1, /* revision number */
7079 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
7080 0x1, 0x1, 0x1, 0x1, /* auth[0] */
7081 0x1, 0x1, 0x1, 0x1, /* auth[1] */
7082 0x1, 0x1, 0x1, 0x1, /* auth[2] */
7083 0x1, 0x1, 0x1, 0x1, /* auth[3] */
7084 0x1, 0x1, 0x1, 0x1, /* auth[4] */
7085 0x1, 0x1, 0x1, 0x1, /* auth[5] */
7086 0x1, 0x1, 0x1, 0x1, /* auth[6] */
7087 0x1, 0x1, 0x1, 0x1, /* auth[7] */
7088 0x1, 0x1, 0x1, 0x1, /* auth[8] */
7089 0x1, 0x1, 0x1, 0x1, /* auth[9] */
7090 0x1, 0x1, 0x1, 0x1, /* auth[10] */
7091 0x1, 0x1, 0x1, 0x1, /* auth[11] */
7092 0x1, 0x1, 0x1, 0x1, /* auth[12] */
7093 0x1, 0x1, 0x1, 0x1, /* auth[13] */
7094 0x1, 0x1, 0x1, 0x1, /* auth[14] */
7095 0x1, 0x1, 0x1, 0x1, /* auth[15] */
7096 0x1, 0x1, 0x1, 0x1, /* auth[16] */
7097 0x1, 0x1, 0x1, 0x1, /* auth[17] */
7098 0x1, 0x1, 0x1, 0x1, /* auth[18] */
7099 0x1, 0x1, 0x1, 0x1, /* auth[19] */
7100 0x1, 0x1, 0x1, 0x1, /* auth[20] */
7101 0x1, 0x1, 0x1, 0x1, /* auth[21] */
7102 0x1, 0x1, 0x1, 0x1, /* auth[22] */
7103 0x1, 0x1, 0x1, 0x1, /* auth[23] */
7104 0x1, 0x1, 0x1, 0x1, /* auth[24] */
7105 0x1, 0x1, 0x1, 0x1, /* auth[25] */
7106 0x1, 0x1, 0x1, 0x1, /* auth[26] */
7107 0x1, 0x1, 0x1, 0x1, /* auth[27] */
7108 0x1, 0x1, 0x1, 0x1, /* auth[28] */
7109 0x1, 0x1, 0x1, 0x1, /* auth[29] */
7110 0x1, 0x1, 0x1, 0x1, /* auth[30] */
7111 0x1, 0x1, 0x1, 0x1, /* auth[31] */
7114 if (!sid_parse(good_binary_sid, sizeof(good_binary_sid), sid)) {
7117 if (sid_parse(long_binary_sid2, sizeof(long_binary_sid2), sid)) {
7120 if (sid_parse(long_binary_sid, sizeof(long_binary_sid), sid)) {
7126 /* Split a path name into filename and stream name components. Canonicalise
7127 * such that an implicit $DATA token is always explicit.
7129 * The "specification" of this function can be found in the
7130 * run_local_stream_name() function in torture.c, I've tried those
7131 * combinations against a W2k3 server.
7134 static NTSTATUS split_ntfs_stream_name(TALLOC_CTX *mem_ctx, const char *fname,
7135 char **pbase, char **pstream)
7138 char *stream = NULL;
7139 char *sname; /* stream name */
7140 const char *stype; /* stream type */
7142 DEBUG(10, ("split_ntfs_stream_name called for [%s]\n", fname));
7144 sname = strchr_m(fname, ':');
7146 if (lp_posix_pathnames() || (sname == NULL)) {
7147 if (pbase != NULL) {
7148 base = talloc_strdup(mem_ctx, fname);
7149 NT_STATUS_HAVE_NO_MEMORY(base);
7154 if (pbase != NULL) {
7155 base = talloc_strndup(mem_ctx, fname, PTR_DIFF(sname, fname));
7156 NT_STATUS_HAVE_NO_MEMORY(base);
7161 stype = strchr_m(sname, ':');
7163 if (stype == NULL) {
7164 sname = talloc_strdup(mem_ctx, sname);
7168 if (StrCaseCmp(stype, ":$DATA") != 0) {
7170 * If there is an explicit stream type, so far we only
7171 * allow $DATA. Is there anything else allowed? -- vl
7173 DEBUG(10, ("[%s] is an invalid stream type\n", stype));
7175 return NT_STATUS_OBJECT_NAME_INVALID;
7177 sname = talloc_strndup(mem_ctx, sname, PTR_DIFF(stype, sname));
7181 if (sname == NULL) {
7183 return NT_STATUS_NO_MEMORY;
7186 if (sname[0] == '\0') {
7188 * no stream name, so no stream
7193 if (pstream != NULL) {
7194 stream = talloc_asprintf(mem_ctx, "%s:%s", sname, stype);
7195 if (stream == NULL) {
7198 return NT_STATUS_NO_MEMORY;
7201 * upper-case the type field
7203 strupper_m(strchr_m(stream, ':')+1);
7207 if (pbase != NULL) {
7210 if (pstream != NULL) {
7213 return NT_STATUS_OK;
7216 static bool test_stream_name(const char *fname, const char *expected_base,
7217 const char *expected_stream,
7218 NTSTATUS expected_status)
7222 char *stream = NULL;
7224 status = split_ntfs_stream_name(talloc_tos(), fname, &base, &stream);
7225 if (!NT_STATUS_EQUAL(status, expected_status)) {
7229 if (!NT_STATUS_IS_OK(status)) {
7233 if (base == NULL) goto error;
7235 if (strcmp(expected_base, base) != 0) goto error;
7237 if ((expected_stream != NULL) && (stream == NULL)) goto error;
7238 if ((expected_stream == NULL) && (stream != NULL)) goto error;
7240 if ((stream != NULL) && (strcmp(expected_stream, stream) != 0))
7244 TALLOC_FREE(stream);
7248 d_fprintf(stderr, "Do test_stream(%s, %s, %s, %s)\n",
7249 fname, expected_base ? expected_base : "<NULL>",
7250 expected_stream ? expected_stream : "<NULL>",
7251 nt_errstr(expected_status));
7252 d_fprintf(stderr, "-> base=%s, stream=%s, status=%s\n",
7253 base ? base : "<NULL>", stream ? stream : "<NULL>",
7256 TALLOC_FREE(stream);
7260 static bool run_local_stream_name(int dummy)
7264 ret &= test_stream_name(
7265 "bla", "bla", NULL, NT_STATUS_OK);
7266 ret &= test_stream_name(
7267 "bla::$DATA", "bla", NULL, NT_STATUS_OK);
7268 ret &= test_stream_name(
7269 "bla:blub:", "bla", NULL, NT_STATUS_OBJECT_NAME_INVALID);
7270 ret &= test_stream_name(
7271 "bla::", NULL, NULL, NT_STATUS_OBJECT_NAME_INVALID);
7272 ret &= test_stream_name(
7273 "bla::123", "bla", NULL, NT_STATUS_OBJECT_NAME_INVALID);
7274 ret &= test_stream_name(
7275 "bla:$DATA", "bla", "$DATA:$DATA", NT_STATUS_OK);
7276 ret &= test_stream_name(
7277 "bla:x:$DATA", "bla", "x:$DATA", NT_STATUS_OK);
7278 ret &= test_stream_name(
7279 "bla:x", "bla", "x:$DATA", NT_STATUS_OK);
7284 static bool data_blob_equal(DATA_BLOB a, DATA_BLOB b)
7286 if (a.length != b.length) {
7287 printf("a.length=%d != b.length=%d\n",
7288 (int)a.length, (int)b.length);
7291 if (memcmp(a.data, b.data, a.length) != 0) {
7292 printf("a.data and b.data differ\n");
7298 static bool run_local_memcache(int dummy)
7300 struct memcache *cache;
7302 DATA_BLOB d1, d2, d3;
7303 DATA_BLOB v1, v2, v3;
7305 TALLOC_CTX *mem_ctx;
7307 size_t size1, size2;
7310 cache = memcache_init(NULL, 100);
7312 if (cache == NULL) {
7313 printf("memcache_init failed\n");
7317 d1 = data_blob_const("d1", 2);
7318 d2 = data_blob_const("d2", 2);
7319 d3 = data_blob_const("d3", 2);
7321 k1 = data_blob_const("d1", 2);
7322 k2 = data_blob_const("d2", 2);
7324 memcache_add(cache, STAT_CACHE, k1, d1);
7325 memcache_add(cache, GETWD_CACHE, k2, d2);
7327 if (!memcache_lookup(cache, STAT_CACHE, k1, &v1)) {
7328 printf("could not find k1\n");
7331 if (!data_blob_equal(d1, v1)) {
7335 if (!memcache_lookup(cache, GETWD_CACHE, k2, &v2)) {
7336 printf("could not find k2\n");
7339 if (!data_blob_equal(d2, v2)) {
7343 memcache_add(cache, STAT_CACHE, k1, d3);
7345 if (!memcache_lookup(cache, STAT_CACHE, k1, &v3)) {
7346 printf("could not find replaced k1\n");
7349 if (!data_blob_equal(d3, v3)) {
7353 memcache_add(cache, GETWD_CACHE, k1, d1);
7355 if (memcache_lookup(cache, GETWD_CACHE, k2, &v2)) {
7356 printf("Did find k2, should have been purged\n");
7362 cache = memcache_init(NULL, 0);
7364 mem_ctx = talloc_init("foo");
7366 str1 = talloc_strdup(mem_ctx, "string1");
7367 str2 = talloc_strdup(mem_ctx, "string2");
7369 memcache_add_talloc(cache, SINGLETON_CACHE_TALLOC,
7370 data_blob_string_const("torture"), &str1);
7371 size1 = talloc_total_size(cache);
7373 memcache_add_talloc(cache, SINGLETON_CACHE_TALLOC,
7374 data_blob_string_const("torture"), &str2);
7375 size2 = talloc_total_size(cache);
7377 printf("size1=%d, size2=%d\n", (int)size1, (int)size2);
7379 if (size2 > size1) {
7380 printf("memcache leaks memory!\n");
7390 static void wbclient_done(struct tevent_req *req)
7393 struct winbindd_response *wb_resp;
7394 int *i = (int *)tevent_req_callback_data_void(req);
7396 wbc_err = wb_trans_recv(req, req, &wb_resp);
7399 d_printf("wb_trans_recv %d returned %s\n", *i, wbcErrorString(wbc_err));
7402 static bool run_local_wbclient(int dummy)
7404 struct event_context *ev;
7405 struct wb_context **wb_ctx;
7406 struct winbindd_request wb_req;
7407 bool result = false;
7410 BlockSignals(True, SIGPIPE);
7412 ev = tevent_context_init_byname(talloc_tos(), "epoll");
7417 wb_ctx = TALLOC_ARRAY(ev, struct wb_context *, nprocs);
7418 if (wb_ctx == NULL) {
7422 ZERO_STRUCT(wb_req);
7423 wb_req.cmd = WINBINDD_PING;
7425 d_printf("nprocs=%d, numops=%d\n", (int)nprocs, (int)torture_numops);
7427 for (i=0; i<nprocs; i++) {
7428 wb_ctx[i] = wb_context_init(ev, NULL);
7429 if (wb_ctx[i] == NULL) {
7432 for (j=0; j<torture_numops; j++) {
7433 struct tevent_req *req;
7434 req = wb_trans_send(ev, ev, wb_ctx[i],
7435 (j % 2) == 0, &wb_req);
7439 tevent_req_set_callback(req, wbclient_done, &i);
7445 while (i < nprocs * torture_numops) {
7446 event_loop_once(ev);
7455 static void getaddrinfo_finished(struct tevent_req *req)
7457 char *name = (char *)tevent_req_callback_data_void(req);
7458 struct addrinfo *ainfo;
7461 res = getaddrinfo_recv(req, &ainfo);
7463 d_printf("gai(%s) returned %s\n", name, gai_strerror(res));
7466 d_printf("gai(%s) succeeded\n", name);
7467 freeaddrinfo(ainfo);
7470 static bool run_getaddrinfo_send(int dummy)
7472 TALLOC_CTX *frame = talloc_stackframe();
7473 struct fncall_context *ctx;
7474 struct tevent_context *ev;
7475 bool result = false;
7476 const char *names[4] = { "www.samba.org", "notfound.samba.org",
7477 "www.slashdot.org", "heise.de" };
7478 struct tevent_req *reqs[4];
7481 ev = event_context_init(frame);
7486 ctx = fncall_context_init(frame, 4);
7488 for (i=0; i<ARRAY_SIZE(names); i++) {
7489 reqs[i] = getaddrinfo_send(frame, ev, ctx, names[i], NULL,
7491 if (reqs[i] == NULL) {
7494 tevent_req_set_callback(reqs[i], getaddrinfo_finished,
7498 for (i=0; i<ARRAY_SIZE(reqs); i++) {
7499 tevent_loop_once(ev);
7508 static bool dbtrans_inc(struct db_context *db)
7510 struct db_record *rec;
7515 rec = db->fetch_locked(db, db, string_term_tdb_data("transtest"));
7517 printf(__location__ "fetch_lock failed\n");
7521 if (rec->value.dsize != sizeof(uint32_t)) {
7522 printf(__location__ "value.dsize = %d\n",
7523 (int)rec->value.dsize);
7527 val = (uint32_t *)rec->value.dptr;
7530 status = rec->store(rec, make_tdb_data((uint8_t *)val,
7533 if (!NT_STATUS_IS_OK(status)) {
7534 printf(__location__ "store failed: %s\n",
7545 static bool run_local_dbtrans(int dummy)
7547 struct db_context *db;
7548 struct db_record *rec;
7553 db = db_open(talloc_tos(), "transtest.tdb", 0, TDB_DEFAULT,
7554 O_RDWR|O_CREAT, 0600);
7556 printf("Could not open transtest.db\n");
7560 res = db->transaction_start(db);
7562 printf(__location__ "transaction_start failed\n");
7566 rec = db->fetch_locked(db, db, string_term_tdb_data("transtest"));
7568 printf(__location__ "fetch_lock failed\n");
7572 if (rec->value.dptr == NULL) {
7574 status = rec->store(
7575 rec, make_tdb_data((uint8_t *)&initial,
7578 if (!NT_STATUS_IS_OK(status)) {
7579 printf(__location__ "store returned %s\n",
7587 res = db->transaction_commit(db);
7589 printf(__location__ "transaction_commit failed\n");
7597 res = db->transaction_start(db);
7599 printf(__location__ "transaction_start failed\n");
7603 if (!dbwrap_fetch_uint32(db, "transtest", &val)) {
7604 printf(__location__ "dbwrap_fetch_uint32 failed\n");
7608 for (i=0; i<10; i++) {
7609 if (!dbtrans_inc(db)) {
7614 if (!dbwrap_fetch_uint32(db, "transtest", &val2)) {
7615 printf(__location__ "dbwrap_fetch_uint32 failed\n");
7619 if (val2 != val + 10) {
7620 printf(__location__ "val=%d, val2=%d\n",
7621 (int)val, (int)val2);
7625 printf("val2=%d\r", val2);
7627 res = db->transaction_commit(db);
7629 printf(__location__ "transaction_commit failed\n");
7639 * Just a dummy test to be run under a debugger. There's no real way
7640 * to inspect the tevent_select specific function from outside of
7644 static bool run_local_tevent_select(int dummy)
7646 struct tevent_context *ev;
7647 struct tevent_fd *fd1, *fd2;
7648 bool result = false;
7650 ev = tevent_context_init_byname(NULL, "select");
7652 d_fprintf(stderr, "tevent_context_init_byname failed\n");
7656 fd1 = tevent_add_fd(ev, ev, 2, 0, NULL, NULL);
7658 d_fprintf(stderr, "tevent_add_fd failed\n");
7661 fd2 = tevent_add_fd(ev, ev, 3, 0, NULL, NULL);
7663 d_fprintf(stderr, "tevent_add_fd failed\n");
7668 fd2 = tevent_add_fd(ev, ev, 1, 0, NULL, NULL);
7670 d_fprintf(stderr, "tevent_add_fd failed\n");
7680 static double create_procs(bool (*fn)(int), bool *result)
7683 volatile pid_t *child_status;
7684 volatile bool *child_status_out;
7687 struct timeval start;
7691 child_status = (volatile pid_t *)shm_setup(sizeof(pid_t)*nprocs);
7692 if (!child_status) {
7693 printf("Failed to setup shared memory\n");
7697 child_status_out = (volatile bool *)shm_setup(sizeof(bool)*nprocs);
7698 if (!child_status_out) {
7699 printf("Failed to setup result status shared memory\n");
7703 for (i = 0; i < nprocs; i++) {
7704 child_status[i] = 0;
7705 child_status_out[i] = True;
7708 start = timeval_current();
7710 for (i=0;i<nprocs;i++) {
7713 pid_t mypid = getpid();
7714 sys_srandom(((int)mypid) ^ ((int)time(NULL)));
7716 slprintf(myname,sizeof(myname),"CLIENT%d", i);
7719 if (torture_open_connection(¤t_cli, i)) break;
7721 printf("pid %d failed to start\n", (int)getpid());
7727 child_status[i] = getpid();
7729 while (child_status[i] && timeval_elapsed(&start) < 5) smb_msleep(2);
7731 child_status_out[i] = fn(i);
7738 for (i=0;i<nprocs;i++) {
7739 if (child_status[i]) synccount++;
7741 if (synccount == nprocs) break;
7743 } while (timeval_elapsed(&start) < 30);
7745 if (synccount != nprocs) {
7746 printf("FAILED TO START %d CLIENTS (started %d)\n", nprocs, synccount);
7748 return timeval_elapsed(&start);
7751 /* start the client load */
7752 start = timeval_current();
7754 for (i=0;i<nprocs;i++) {
7755 child_status[i] = 0;
7758 printf("%d clients started\n", nprocs);
7760 for (i=0;i<nprocs;i++) {
7761 while (waitpid(0, &status, 0) == -1 && errno == EINTR) /* noop */ ;
7766 for (i=0;i<nprocs;i++) {
7767 if (!child_status_out[i]) {
7771 return timeval_elapsed(&start);
7774 #define FLAG_MULTIPROC 1
7781 {"FDPASS", run_fdpasstest, 0},
7782 {"LOCK1", run_locktest1, 0},
7783 {"LOCK2", run_locktest2, 0},
7784 {"LOCK3", run_locktest3, 0},
7785 {"LOCK4", run_locktest4, 0},
7786 {"LOCK5", run_locktest5, 0},
7787 {"LOCK6", run_locktest6, 0},
7788 {"LOCK7", run_locktest7, 0},
7789 {"LOCK8", run_locktest8, 0},
7790 {"LOCK9", run_locktest9, 0},
7791 {"UNLINK", run_unlinktest, 0},
7792 {"BROWSE", run_browsetest, 0},
7793 {"ATTR", run_attrtest, 0},
7794 {"TRANS2", run_trans2test, 0},
7795 {"MAXFID", run_maxfidtest, FLAG_MULTIPROC},
7796 {"TORTURE",run_torture, FLAG_MULTIPROC},
7797 {"RANDOMIPC", run_randomipc, 0},
7798 {"NEGNOWAIT", run_negprot_nowait, 0},
7799 {"NBENCH", run_nbench, 0},
7800 {"NBENCH2", run_nbench2, 0},
7801 {"OPLOCK1", run_oplock1, 0},
7802 {"OPLOCK2", run_oplock2, 0},
7803 {"OPLOCK3", run_oplock3, 0},
7804 {"DIR", run_dirtest, 0},
7805 {"DIR1", run_dirtest1, 0},
7806 {"DIR-CREATETIME", run_dir_createtime, 0},
7807 {"DENY1", torture_denytest1, 0},
7808 {"DENY2", torture_denytest2, 0},
7809 {"TCON", run_tcon_test, 0},
7810 {"TCONDEV", run_tcon_devtype_test, 0},
7811 {"RW1", run_readwritetest, 0},
7812 {"RW2", run_readwritemulti, FLAG_MULTIPROC},
7813 {"RW3", run_readwritelarge, 0},
7814 {"RW-SIGNING", run_readwritelarge_signtest, 0},
7815 {"OPEN", run_opentest, 0},
7816 {"POSIX", run_simple_posix_open_test, 0},
7817 {"POSIX-APPEND", run_posix_append, 0},
7818 {"ASYNC-ECHO", run_async_echo, 0},
7819 { "UID-REGRESSION-TEST", run_uid_regression_test, 0},
7820 { "SHORTNAME-TEST", run_shortname_test, 0},
7822 {"OPENATTR", run_openattrtest, 0},
7824 {"XCOPY", run_xcopy, 0},
7825 {"RENAME", run_rename, 0},
7826 {"DELETE", run_deletetest, 0},
7827 {"PROPERTIES", run_properties, 0},
7828 {"MANGLE", torture_mangle, 0},
7829 {"MANGLE1", run_mangle1, 0},
7830 {"W2K", run_w2ktest, 0},
7831 {"TRANS2SCAN", torture_trans2_scan, 0},
7832 {"NTTRANSSCAN", torture_nttrans_scan, 0},
7833 {"UTABLE", torture_utable, 0},
7834 {"CASETABLE", torture_casetable, 0},
7835 {"ERRMAPEXTRACT", run_error_map_extract, 0},
7836 {"PIPE_NUMBER", run_pipe_number, 0},
7837 {"TCON2", run_tcon2_test, 0},
7838 {"IOCTL", torture_ioctl_test, 0},
7839 {"CHKPATH", torture_chkpath_test, 0},
7840 {"FDSESS", run_fdsesstest, 0},
7841 { "EATEST", run_eatest, 0},
7842 { "SESSSETUP_BENCH", run_sesssetup_bench, 0},
7843 { "CHAIN1", run_chain1, 0},
7844 { "CHAIN2", run_chain2, 0},
7845 { "WINDOWS-WRITE", run_windows_write, 0},
7846 { "CLI_ECHO", run_cli_echo, 0},
7847 { "GETADDRINFO", run_getaddrinfo_send, 0},
7848 { "TLDAP", run_tldap },
7849 { "STREAMERROR", run_streamerror },
7850 { "NOTIFY-BENCH", run_notify_bench },
7851 { "BAD-NBT-SESSION", run_bad_nbt_session },
7852 { "SMB-ANY-CONNECT", run_smb_any_connect },
7853 { "LOCAL-SUBSTITUTE", run_local_substitute, 0},
7854 { "LOCAL-GENCACHE", run_local_gencache, 0},
7855 { "LOCAL-TALLOC-DICT", run_local_talloc_dict, 0},
7856 { "LOCAL-BASE64", run_local_base64, 0},
7857 { "LOCAL-RBTREE", run_local_rbtree, 0},
7858 { "LOCAL-MEMCACHE", run_local_memcache, 0},
7859 { "LOCAL-STREAM-NAME", run_local_stream_name, 0},
7860 { "LOCAL-WBCLIENT", run_local_wbclient, 0},
7861 { "LOCAL-string_to_sid", run_local_string_to_sid, 0},
7862 { "LOCAL-binary_to_sid", run_local_binary_to_sid, 0},
7863 { "LOCAL-DBTRANS", run_local_dbtrans, 0},
7864 { "LOCAL-TEVENT-SELECT", run_local_tevent_select, 0},
7869 /****************************************************************************
7870 run a specified test or "ALL"
7871 ****************************************************************************/
7872 static bool run_test(const char *name)
7879 if (strequal(name,"ALL")) {
7880 for (i=0;torture_ops[i].name;i++) {
7881 run_test(torture_ops[i].name);
7886 for (i=0;torture_ops[i].name;i++) {
7887 fstr_sprintf(randomfname, "\\XX%x",
7888 (unsigned)random());
7890 if (strequal(name, torture_ops[i].name)) {
7892 printf("Running %s\n", name);
7893 if (torture_ops[i].flags & FLAG_MULTIPROC) {
7894 t = create_procs(torture_ops[i].fn, &result);
7897 printf("TEST %s FAILED!\n", name);
7900 struct timeval start;
7901 start = timeval_current();
7902 if (!torture_ops[i].fn(0)) {
7904 printf("TEST %s FAILED!\n", name);
7906 t = timeval_elapsed(&start);
7908 printf("%s took %g secs\n\n", name, t);
7913 printf("Did not find a test named %s\n", name);
7921 static void usage(void)
7925 printf("WARNING samba4 test suite is much more complete nowadays.\n");
7926 printf("Please use samba4 torture.\n\n");
7928 printf("Usage: smbtorture //server/share <options> TEST1 TEST2 ...\n");
7930 printf("\t-d debuglevel\n");
7931 printf("\t-U user%%pass\n");
7932 printf("\t-k use kerberos\n");
7933 printf("\t-N numprocs\n");
7934 printf("\t-n my_netbios_name\n");
7935 printf("\t-W workgroup\n");
7936 printf("\t-o num_operations\n");
7937 printf("\t-O socket_options\n");
7938 printf("\t-m maximum protocol\n");
7939 printf("\t-L use oplocks\n");
7940 printf("\t-c CLIENT.TXT specify client load file for NBENCH\n");
7941 printf("\t-A showall\n");
7942 printf("\t-p port\n");
7943 printf("\t-s seed\n");
7944 printf("\t-b unclist_filename specify multiple shares for multiple connections\n");
7947 printf("tests are:");
7948 for (i=0;torture_ops[i].name;i++) {
7949 printf(" %s", torture_ops[i].name);
7953 printf("default test is ALL\n");
7958 /****************************************************************************
7960 ****************************************************************************/
7961 int main(int argc,char *argv[])
7967 bool correct = True;
7968 TALLOC_CTX *frame = talloc_stackframe();
7969 int seed = time(NULL);
7971 #ifdef HAVE_SETBUFFER
7972 setbuffer(stdout, NULL, 0);
7975 setup_logging("smbtorture", DEBUG_STDOUT);
7979 if (is_default_dyn_CONFIGFILE()) {
7980 if(getenv("SMB_CONF_PATH")) {
7981 set_dyn_CONFIGFILE(getenv("SMB_CONF_PATH"));
7984 lp_load(get_dyn_CONFIGFILE(),True,False,False,True);
7991 for(p = argv[1]; *p; p++)
7995 if (strncmp(argv[1], "//", 2)) {
7999 fstrcpy(host, &argv[1][2]);
8000 p = strchr_m(&host[2],'/');
8005 fstrcpy(share, p+1);
8007 fstrcpy(myname, get_myname(talloc_tos()));
8009 fprintf(stderr, "Failed to get my hostname.\n");
8013 if (*username == 0 && getenv("LOGNAME")) {
8014 fstrcpy(username,getenv("LOGNAME"));
8020 fstrcpy(workgroup, lp_workgroup());
8022 while ((opt = getopt(argc, argv, "p:hW:U:n:N:O:o:m:Ll:d:Aec:ks:b:B:")) != EOF) {
8025 port_to_use = atoi(optarg);
8028 seed = atoi(optarg);
8031 fstrcpy(workgroup,optarg);
8034 max_protocol = interpret_protocol(optarg, max_protocol);
8037 nprocs = atoi(optarg);
8040 torture_numops = atoi(optarg);
8043 lp_set_cmdline("log level", optarg);
8052 local_path = optarg;
8055 torture_showall = True;
8058 fstrcpy(myname, optarg);
8061 client_txt = optarg;
8068 use_kerberos = True;
8070 d_printf("No kerberos support compiled in\n");
8076 fstrcpy(username,optarg);
8077 p = strchr_m(username,'%');
8080 fstrcpy(password, p+1);
8085 fstrcpy(multishare_conn_fname, optarg);
8086 use_multishare_conn = True;
8089 torture_blocksize = atoi(optarg);
8092 printf("Unknown option %c (%d)\n", (char)opt, opt);
8097 d_printf("using seed %d\n", seed);
8101 if(use_kerberos && !gotuser) gotpass = True;
8104 p = getpass("Password:");
8106 fstrcpy(password, p);
8111 printf("host=%s share=%s user=%s myname=%s\n",
8112 host, share, username, myname);
8114 if (argc == optind) {
8115 correct = run_test("ALL");
8117 for (i=optind;i<argc;i++) {
8118 if (!run_test(argv[i])) {