2 Unix SMB/CIFS implementation.
4 delete on close testing
6 Copyright (C) Andrew Tridgell 2003
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "libcli/libcli.h"
25 #include "torture/torture.h"
26 #include "system/filesys.h"
27 #include "libcli/raw/libcliraw.h"
29 #include "torture/raw/proto.h"
31 static BOOL check_delete_on_close(struct smbcli_state *cli, int fnum,
32 const char *fname, BOOL expect_it)
34 TALLOC_CTX *mem_ctx = talloc_init("single_search");
35 union smb_search_data data;
38 time_t c_time, a_time, m_time;
44 status = torture_single_search(cli, mem_ctx,
45 fname, RAW_SEARCH_FULL_DIRECTORY_INFO,
46 FILE_ATTRIBUTE_DIRECTORY,
48 if (!NT_STATUS_IS_OK(status)) {
49 printf("(%s) single_search failed (%s)\n",
50 __location__, nt_errstr(status));
56 union smb_fileinfo io;
57 int nlink = expect_it ? 0 : 1;
59 io.all_info.level = RAW_FILEINFO_ALL_INFO;
60 io.all_info.in.fnum = fnum;
62 status = smb_raw_fileinfo(cli->tree, mem_ctx, &io);
63 if (!NT_STATUS_IS_OK(status)) {
64 printf("(%s) qpathinfo failed (%s)\n", __location__,
70 if (expect_it != io.all_info.out.delete_pending) {
71 printf("Expected del_on_close flag %d, qfileinfo gave %d\n",
72 expect_it, io.all_info.out.delete_pending);
77 if (nlink != io.all_info.out.nlink) {
78 printf("Expected nlink %d, qfileinfo gave %d\n",
79 nlink, io.all_info.out.nlink);
84 io.standard_info.level = RAW_FILEINFO_STANDARD_INFO;
85 io.standard_info.in.fnum = fnum;
87 status = smb_raw_fileinfo(cli->tree, mem_ctx, &io);
88 if (!NT_STATUS_IS_OK(status)) {
89 printf("(%s) qpathinfo failed (%s)\n", __location__,
95 if (expect_it != io.standard_info.out.delete_pending) {
96 printf("Expected del_on_close flag %d, qfileinfo gave %d\n",
97 expect_it, io.standard_info.out.delete_pending);
102 if (nlink != io.standard_info.out.nlink) {
103 printf("Expected nlink %d, qfileinfo gave %d\n",
104 nlink, io.all_info.out.nlink);
111 status = smbcli_qpathinfo(cli->tree, fname,
112 &c_time, &a_time, &m_time,
116 if (!NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
117 printf("(%s) qpathinfo did not give correct error "
118 "code (%s) -- NT_STATUS_DELETE_PENDING "
119 "expected\n", __location__,
125 if (!NT_STATUS_IS_OK(status)) {
126 printf("(%s) qpathinfo failed (%s)\n", __location__,
134 talloc_free(mem_ctx);
138 #define CHECK_STATUS(_cli, _expected) do { \
139 if (!NT_STATUS_EQUAL(_cli->tree->session->transport->error.e.nt_status, _expected)) { \
140 printf("(%d) Incorrect status %s - should be %s\n", \
141 __LINE__, nt_errstr(_cli->tree->session->transport->error.e.nt_status), nt_errstr(_expected)); \
146 const char *fname = "\\delete.file";
147 const char *fname_new = "\\delete.new";
148 const char *dirname = "\\delete.dir";
150 static void del_clean_area(struct smbcli_state *cli1, struct smbcli_state *cli2)
152 smbcli_deltree(cli1->tree, dirname);
153 smbcli_setatr(cli1->tree, fname, 0, 0);
154 smbcli_unlink(cli1->tree, fname);
155 smbcli_setatr(cli1->tree, fname_new, 0, 0);
156 smbcli_unlink(cli1->tree, fname_new);
158 smb_raw_exit(cli1->session);
159 smb_raw_exit(cli2->session);
162 /* Test 1 - this should delete the file on close. */
164 static BOOL deltest1(struct smbcli_state *cli1, struct smbcli_state *cli2)
168 del_clean_area(cli1, cli2);
170 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
172 FILE_ATTRIBUTE_NORMAL,
173 NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OVERWRITE_IF,
174 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
177 printf("(%s) open of %s failed (%s)\n",
178 __location__, fname, smbcli_errstr(cli1->tree));
182 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
183 printf("(%s) close failed (%s)\n",
184 __location__, smbcli_errstr(cli1->tree));
188 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
190 printf("(%s) open of %s succeeded (should fail)\n",
191 __location__, fname);
195 printf("first delete on close test succeeded.\n");
199 /* Test 2 - this should delete the file on close. */
200 static BOOL deltest2(struct smbcli_state *cli1, struct smbcli_state *cli2)
204 del_clean_area(cli1, cli2);
206 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
208 FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE,
209 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
212 printf("(%s) open of %s failed (%s)\n",
213 __location__, fname, smbcli_errstr(cli1->tree));
217 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
218 printf("(%s) setting delete_on_close failed (%s)\n",
219 __location__, smbcli_errstr(cli1->tree));
223 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
224 printf("(%s) close failed (%s)\n",
225 __location__, smbcli_errstr(cli1->tree));
229 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
231 printf("(%s) open of %s succeeded should have been deleted on close !\n",
232 __location__, fname);
233 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
234 printf("(%s) close failed (%s)\n",
235 __location__, smbcli_errstr(cli1->tree));
238 smbcli_unlink(cli1->tree, fname);
240 printf("second delete on close test succeeded.\n");
246 static BOOL deltest3(struct smbcli_state *cli1, struct smbcli_state *cli2)
251 del_clean_area(cli1, cli2);
253 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
255 FILE_ATTRIBUTE_NORMAL,
256 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
257 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
260 printf("(%s) open - 1 of %s failed (%s)\n",
261 __location__, fname, smbcli_errstr(cli1->tree));
265 /* This should fail with a sharing violation - open for delete is only compatible
266 with SHARE_DELETE. */
268 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
269 SEC_RIGHTS_FILE_READ,
270 FILE_ATTRIBUTE_NORMAL,
271 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
272 NTCREATEX_DISP_OPEN, 0, 0);
275 printf("(%s) open - 2 of %s succeeded - should have failed.\n",
276 __location__, fname);
280 /* This should succeed. */
282 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
283 SEC_RIGHTS_FILE_READ,
284 FILE_ATTRIBUTE_NORMAL,
285 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
286 NTCREATEX_DISP_OPEN, 0, 0);
289 printf("(%s) open - 2 of %s failed (%s)\n",
290 __location__, fname, smbcli_errstr(cli1->tree));
294 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
295 printf("(%s) setting delete_on_close failed (%s)\n",
296 __location__, smbcli_errstr(cli1->tree));
300 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
301 printf("(%s) close 1 failed (%s)\n",
302 __location__, smbcli_errstr(cli1->tree));
306 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum2))) {
307 printf("(%s) close 2 failed (%s)\n",
308 __location__, smbcli_errstr(cli1->tree));
312 /* This should fail - file should no longer be there. */
314 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
316 printf("(%s) open of %s succeeded should have been deleted on close !\n",
317 __location__, fname);
318 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
319 printf("(%s) close failed (%s)\n",
320 __location__, smbcli_errstr(cli1->tree));
322 smbcli_unlink(cli1->tree, fname);
325 printf("third delete on close test succeeded.\n");
331 static BOOL deltest4(struct smbcli_state *cli1, struct smbcli_state *cli2)
337 del_clean_area(cli1, cli2);
339 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
341 SEC_FILE_WRITE_DATA |
343 FILE_ATTRIBUTE_NORMAL,
344 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
345 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
348 printf("(%s) open of %s failed (%s)\n",
349 __location__, fname, smbcli_errstr(cli1->tree));
353 /* This should succeed. */
354 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
355 SEC_RIGHTS_FILE_READ,
356 FILE_ATTRIBUTE_NORMAL,
357 NTCREATEX_SHARE_ACCESS_READ |
358 NTCREATEX_SHARE_ACCESS_WRITE |
359 NTCREATEX_SHARE_ACCESS_DELETE,
360 NTCREATEX_DISP_OPEN, 0, 0);
362 printf("(%s) open - 2 of %s failed (%s)\n",
363 __location__, fname, smbcli_errstr(cli1->tree));
367 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum2))) {
368 printf("(%s) close - 1 failed (%s)\n",
369 __location__, smbcli_errstr(cli1->tree));
373 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
374 printf("(%s) setting delete_on_close failed (%s)\n",
375 __location__, smbcli_errstr(cli1->tree));
379 /* This should fail - no more opens once delete on close set. */
380 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
381 SEC_RIGHTS_FILE_READ,
382 FILE_ATTRIBUTE_NORMAL,
383 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
384 NTCREATEX_DISP_OPEN, 0, 0);
386 printf("(%s) open - 3 of %s succeeded ! Should have failed.\n",
387 __location__, fname );
390 CHECK_STATUS(cli1, NT_STATUS_DELETE_PENDING);
392 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
393 printf("(%s) close - 2 failed (%s)\n",
394 __location__, smbcli_errstr(cli1->tree));
398 printf("fourth delete on close test succeeded.\n");
406 static BOOL deltest5(struct smbcli_state *cli1, struct smbcli_state *cli2)
410 del_clean_area(cli1, cli2);
412 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
414 printf("(%s) open of %s failed (%s)\n",
415 __location__, fname, smbcli_errstr(cli1->tree));
419 /* This should fail - only allowed on NT opens with DELETE access. */
421 if (NT_STATUS_IS_OK(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
422 printf("(%s) setting delete_on_close on OpenX file succeeded - should fail !\n",
427 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
428 printf("(%s) close - 2 failed (%s)\n",
429 __location__, smbcli_errstr(cli1->tree));
433 printf("fifth delete on close test succeeded.\n");
438 static BOOL deltest6(struct smbcli_state *cli1, struct smbcli_state *cli2)
442 del_clean_area(cli1, cli2);
444 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
445 SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
446 FILE_ATTRIBUTE_NORMAL,
447 NTCREATEX_SHARE_ACCESS_READ |
448 NTCREATEX_SHARE_ACCESS_WRITE |
449 NTCREATEX_SHARE_ACCESS_DELETE,
450 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
453 printf("(%s) open of %s failed (%s)\n",
454 __location__, fname, smbcli_errstr(cli1->tree));
458 /* This should fail - only allowed on NT opens with DELETE access. */
460 if (NT_STATUS_IS_OK(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
461 printf("(%s) setting delete_on_close on file with no delete access succeeded - should fail !\n",
466 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
467 printf("(%s) close - 2 failed (%s)\n",
468 __location__, smbcli_errstr(cli1->tree));
472 printf("sixth delete on close test succeeded.\n");
477 static BOOL deltest7(struct smbcli_state *cli1, struct smbcli_state *cli2)
482 del_clean_area(cli1, cli2);
484 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
486 SEC_FILE_WRITE_DATA |
488 FILE_ATTRIBUTE_NORMAL, 0,
489 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
492 printf("(%s) open of %s failed (%s)\n",
493 __location__, fname, smbcli_errstr(cli1->tree));
498 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
499 printf("(%s) setting delete_on_close on file failed !\n",
505 correct &= check_delete_on_close(cli1, fnum1, fname, True);
507 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, False))) {
508 printf("(%s) unsetting delete_on_close on file failed !\n",
514 correct &= check_delete_on_close(cli1, fnum1, fname, False);
516 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
517 printf("(%s) close - 2 failed (%s)\n",
518 __location__, smbcli_errstr(cli1->tree));
523 /* This next open should succeed - we reset the flag. */
525 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
527 printf("(%s) open of %s failed (%s)\n",
528 __location__, fname, smbcli_errstr(cli1->tree));
533 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
534 printf("(%s) close - 2 failed (%s)\n",
535 __location__, smbcli_errstr(cli1->tree));
540 printf("seventh delete on close test succeeded.\n");
548 static BOOL deltest8(struct smbcli_state *cli1, struct smbcli_state *cli2)
554 del_clean_area(cli1, cli2);
556 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
560 FILE_ATTRIBUTE_NORMAL,
561 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
562 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
565 printf("(%s) open of %s failed (%s)\n",
566 __location__, fname, smbcli_errstr(cli1->tree));
571 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
575 FILE_ATTRIBUTE_NORMAL,
576 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
577 NTCREATEX_DISP_OPEN, 0, 0);
580 printf("(%s) open of %s failed (%s)\n",
581 __location__, fname, smbcli_errstr(cli1->tree));
586 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
587 printf("(%s) setting delete_on_close on file failed !\n",
593 correct &= check_delete_on_close(cli1, fnum1, fname, True);
594 correct &= check_delete_on_close(cli2, fnum2, fname, True);
596 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
597 printf("(%s) close - 1 failed (%s)\n",
598 __location__, smbcli_errstr(cli1->tree));
603 correct &= check_delete_on_close(cli1, -1, fname, True);
604 correct &= check_delete_on_close(cli2, fnum2, fname, True);
606 if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) {
607 printf("(%s) close - 2 failed (%s)\n",
608 __location__, smbcli_errstr(cli2->tree));
613 /* This should fail.. */
614 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
616 printf("(%s) open of %s succeeded should have been deleted on close !\n",
617 __location__, fname);
620 printf("eighth delete on close test succeeded.\n");
629 static BOOL deltest9(struct smbcli_state *cli1, struct smbcli_state *cli2)
633 del_clean_area(cli1, cli2);
635 /* This should fail - we need to set DELETE_ACCESS. */
636 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
637 SEC_FILE_READ_DATA|SEC_FILE_WRITE_DATA,
638 FILE_ATTRIBUTE_NORMAL,
639 NTCREATEX_SHARE_ACCESS_NONE,
640 NTCREATEX_DISP_OVERWRITE_IF,
641 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
644 printf("(%s) open of %s succeeded should have failed!\n",
645 __location__, fname);
649 printf("ninth delete on close test succeeded.\n");
654 static BOOL deltest10(struct smbcli_state *cli1, struct smbcli_state *cli2)
659 del_clean_area(cli1, cli2);
661 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
665 FILE_ATTRIBUTE_NORMAL,
666 NTCREATEX_SHARE_ACCESS_NONE,
667 NTCREATEX_DISP_OVERWRITE_IF,
668 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
670 printf("(%s) open of %s failed (%s)\n",
671 __location__, fname, smbcli_errstr(cli1->tree));
676 /* This should delete the file. */
677 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
678 printf("(%s) close failed (%s)\n",
679 __location__, smbcli_errstr(cli1->tree));
684 /* This should fail.. */
685 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
687 printf("(%s) open of %s succeeded should have been deleted on close !\n",
688 __location__, fname);
692 printf("tenth delete on close test succeeded.\n");
701 static BOOL deltest11(struct smbcli_state *cli1, struct smbcli_state *cli2)
706 del_clean_area(cli1, cli2);
708 /* test 11 - does having read only attribute still allow delete on close. */
710 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
712 FILE_ATTRIBUTE_READONLY,
713 NTCREATEX_SHARE_ACCESS_NONE,
714 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
717 printf("(%s) open of %s failed (%s)\n",
718 __location__, fname, smbcli_errstr(cli1->tree));
722 status = smbcli_nt_delete_on_close(cli1->tree, fnum1, True);
724 if (!NT_STATUS_EQUAL(status, NT_STATUS_CANNOT_DELETE)) {
725 printf("(%s) setting delete_on_close should fail with NT_STATUS_CANNOT_DELETE. Got %s instead)\n",
726 __location__, smbcli_errstr(cli1->tree));
730 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
731 printf("(%s) close failed (%s)\n",
732 __location__, smbcli_errstr(cli1->tree));
736 printf("eleventh delete on close test succeeded.\n");
741 static BOOL deltest12(struct smbcli_state *cli1, struct smbcli_state *cli2)
746 del_clean_area(cli1, cli2);
748 /* test 12 - does having read only attribute still allow delete on
749 * close at time of open. */
751 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
753 FILE_ATTRIBUTE_READONLY,
754 NTCREATEX_SHARE_ACCESS_DELETE,
755 NTCREATEX_DISP_OVERWRITE_IF,
756 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
759 printf("(%s) open of %s succeeded. Should fail with "
760 "NT_STATUS_CANNOT_DELETE.\n", __location__, fname);
761 smbcli_close(cli1->tree, fnum1);
764 status = smbcli_nt_error(cli1->tree);
765 if (!NT_STATUS_EQUAL(status, NT_STATUS_CANNOT_DELETE)) {
766 printf("(%s) setting delete_on_close on open should "
767 "fail with NT_STATUS_CANNOT_DELETE. Got %s "
769 __location__, smbcli_errstr(cli1->tree));
774 printf("twelvth delete on close test succeeded.\n");
779 static BOOL deltest13(struct smbcli_state *cli1, struct smbcli_state *cli2)
785 del_clean_area(cli1, cli2);
787 /* Test 13: Does resetting the delete on close flag affect a second
790 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
794 FILE_ATTRIBUTE_NORMAL,
795 NTCREATEX_SHARE_ACCESS_READ|
796 NTCREATEX_SHARE_ACCESS_WRITE|
797 NTCREATEX_SHARE_ACCESS_DELETE,
798 NTCREATEX_DISP_OVERWRITE_IF,
802 printf("(%s) open of %s failed (%s)\n",
803 __location__, fname, smbcli_errstr(cli1->tree));
808 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
812 FILE_ATTRIBUTE_NORMAL,
813 NTCREATEX_SHARE_ACCESS_READ|
814 NTCREATEX_SHARE_ACCESS_WRITE|
815 NTCREATEX_SHARE_ACCESS_DELETE,
816 NTCREATEX_DISP_OPEN, 0, 0);
819 printf("(%s) open of %s failed (%s)\n",
820 __location__, fname, smbcli_errstr(cli2->tree));
825 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1,
827 printf("(%s) setting delete_on_close on file failed !\n",
833 correct &= check_delete_on_close(cli1, fnum1, fname, True);
834 correct &= check_delete_on_close(cli2, fnum2, fname, True);
836 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli2->tree, fnum2,
838 printf("(%s) setting delete_on_close on file failed !\n",
844 correct &= check_delete_on_close(cli1, fnum1, fname, False);
845 correct &= check_delete_on_close(cli2, fnum2, fname, False);
847 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
848 printf("(%s) close - 1 failed (%s)\n",
849 __location__, smbcli_errstr(cli1->tree));
854 if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) {
855 printf("(%s) close - 2 failed (%s)\n",
856 __location__, smbcli_errstr(cli2->tree));
861 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
864 printf("(%s) open of %s failed!\n",
865 __location__, fname);
870 printf("thirteenth delete on close test succeeded.\n");
878 static BOOL deltest14(struct smbcli_state *cli1, struct smbcli_state *cli2)
883 del_clean_area(cli1, cli2);
885 /* Test 14 -- directory */
887 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
891 FILE_ATTRIBUTE_DIRECTORY,
892 NTCREATEX_SHARE_ACCESS_READ|
893 NTCREATEX_SHARE_ACCESS_WRITE|
894 NTCREATEX_SHARE_ACCESS_DELETE,
895 NTCREATEX_DISP_CREATE, 0, 0);
897 printf("(%s) open of %s failed: %s!\n",
898 __location__, dirname, smbcli_errstr(cli1->tree));
903 check_delete_on_close(cli1, dnum1, dirname, False);
904 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, dnum1, True))) {
905 printf("(%s) setting delete_on_close on file failed !\n",
910 check_delete_on_close(cli1, dnum1, dirname, True);
911 smbcli_close(cli1->tree, dnum1);
913 /* Now it should be gone... */
915 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
919 FILE_ATTRIBUTE_DIRECTORY,
920 NTCREATEX_SHARE_ACCESS_READ|
921 NTCREATEX_SHARE_ACCESS_WRITE|
922 NTCREATEX_SHARE_ACCESS_DELETE,
923 NTCREATEX_DISP_OPEN, 0, 0);
925 printf("(%s) setting delete_on_close on file succeeded !\n",
931 printf("fourteenth delete on close test succeeded.\n");
939 static BOOL deltest15(struct smbcli_state *cli1, struct smbcli_state *cli2)
946 del_clean_area(cli1, cli2);
948 /* Test 15: delete on close under rename */
950 smbcli_setatr(cli1->tree, fname, 0, 0);
951 smbcli_unlink(cli1->tree, fname);
952 smbcli_unlink(cli1->tree, fname_new);
954 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
956 FILE_ATTRIBUTE_NORMAL,
957 NTCREATEX_SHARE_ACCESS_READ|
958 NTCREATEX_SHARE_ACCESS_WRITE|
959 NTCREATEX_SHARE_ACCESS_DELETE,
960 NTCREATEX_DISP_OVERWRITE_IF,
964 printf("(%s) open - 1 of %s failed (%s)\n",
965 __location__, fname, smbcli_errstr(cli1->tree));
970 status = smbcli_rename(cli2->tree, fname, fname_new);
972 if (!NT_STATUS_IS_OK(status)) {
973 printf("(%s) renaming failed: %s !\n",
974 __location__, nt_errstr(status));
979 fnum2 = smbcli_nt_create_full(cli2->tree, fname_new, 0,
981 FILE_ATTRIBUTE_NORMAL,
982 NTCREATEX_SHARE_ACCESS_READ|
983 NTCREATEX_SHARE_ACCESS_WRITE|
984 NTCREATEX_SHARE_ACCESS_DELETE,
985 NTCREATEX_DISP_OVERWRITE_IF,
989 printf("(%s) open - 1 of %s failed (%s)\n",
990 __location__, fname_new, smbcli_errstr(cli1->tree));
995 status = smbcli_nt_delete_on_close(cli2->tree, fnum2, True);
997 if (!NT_STATUS_IS_OK(status)) {
998 printf("(%s) setting delete_on_close on file failed !\n",
1004 smbcli_close(cli2->tree, fnum2);
1006 /* The file should be around under the new name, there's a second
1009 if (!check_delete_on_close(cli1, fnum1, fname_new, True)) {
1010 printf("(%s) checking delete on close on file %s failed!\n",
1011 __location__, fname_new);
1016 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
1018 FILE_ATTRIBUTE_NORMAL,
1019 NTCREATEX_SHARE_ACCESS_READ|
1020 NTCREATEX_SHARE_ACCESS_WRITE|
1021 NTCREATEX_SHARE_ACCESS_DELETE,
1022 NTCREATEX_DISP_OVERWRITE_IF,
1026 printf("(%s) open - 1 of %s failed (%s)\n",
1027 __location__, fname, smbcli_errstr(cli1->tree));
1032 smbcli_close(cli2->tree, fnum2);
1033 smbcli_close(cli1->tree, fnum1);
1035 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1037 FILE_ATTRIBUTE_NORMAL,
1038 NTCREATEX_SHARE_ACCESS_READ|
1039 NTCREATEX_SHARE_ACCESS_WRITE|
1040 NTCREATEX_SHARE_ACCESS_DELETE,
1041 NTCREATEX_DISP_OPEN,
1045 printf("(%s) open - 1 of %s failed (%s)\n",
1046 __location__, fname, smbcli_errstr(cli1->tree));
1051 smbcli_close(cli1->tree, fnum1);
1053 fnum1 = smbcli_nt_create_full(cli1->tree, fname_new, 0,
1055 FILE_ATTRIBUTE_NORMAL,
1056 NTCREATEX_SHARE_ACCESS_READ|
1057 NTCREATEX_SHARE_ACCESS_WRITE|
1058 NTCREATEX_SHARE_ACCESS_DELETE,
1059 NTCREATEX_DISP_OPEN,
1063 printf("(%s) smbcli_open succeeded, should have "
1064 "failed\n", __location__);
1065 smbcli_close(cli1->tree, fnum1);
1070 printf("fifteenth delete on close test succeeded.\n");
1078 static BOOL deltest16(struct smbcli_state *cli1, struct smbcli_state *cli2)
1082 BOOL correct = True;
1084 del_clean_area(cli1, cli2);
1088 /* Ensure the file doesn't already exist. */
1089 smbcli_close(cli1->tree, fnum1);
1090 smbcli_close(cli1->tree, fnum2);
1091 smbcli_setatr(cli1->tree, fname, 0, 0);
1092 smbcli_unlink(cli1->tree, fname);
1094 /* Firstly create with all access, but delete on close. */
1095 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1096 SEC_RIGHTS_FILE_ALL,
1097 FILE_ATTRIBUTE_NORMAL,
1098 NTCREATEX_SHARE_ACCESS_READ|
1099 NTCREATEX_SHARE_ACCESS_WRITE|
1100 NTCREATEX_SHARE_ACCESS_DELETE,
1101 NTCREATEX_DISP_CREATE,
1102 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1105 printf("(%s) open - 1 of %s failed (%s)\n",
1106 __location__, fname, smbcli_errstr(cli1->tree));
1111 /* The delete on close bit is *not* reported as being set. */
1112 check_delete_on_close(cli1, fnum1, fname, False);
1114 /* Now try opening again for read-only. */
1115 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
1116 SEC_RIGHTS_FILE_READ,
1117 FILE_ATTRIBUTE_NORMAL,
1118 NTCREATEX_SHARE_ACCESS_READ|
1119 NTCREATEX_SHARE_ACCESS_WRITE|
1120 NTCREATEX_SHARE_ACCESS_DELETE,
1121 NTCREATEX_DISP_OPEN,
1127 printf("(%s) open - 1 of %s failed (%s)\n",
1128 __location__, fname, smbcli_errstr(cli1->tree));
1133 /* Now close both.... */
1134 smbcli_close(cli1->tree, fnum1);
1135 smbcli_close(cli1->tree, fnum2);
1137 /* And the file should be deleted ! */
1138 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
1140 printf("(%s) open of %s succeeded (should fail)\n",
1141 __location__, fname);
1146 printf("sixteenth delete on close test succeeded.\n");
1154 static BOOL deltest17(struct smbcli_state *cli1, struct smbcli_state *cli2)
1158 BOOL correct = True;
1160 del_clean_area(cli1, cli2);
1164 /* Ensure the file doesn't already exist. */
1165 smbcli_close(cli1->tree, fnum1);
1166 smbcli_close(cli1->tree, fnum2);
1167 smbcli_setatr(cli1->tree, fname, 0, 0);
1168 smbcli_unlink(cli1->tree, fname);
1170 /* Firstly open and create with all access */
1171 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1172 SEC_RIGHTS_FILE_ALL,
1173 FILE_ATTRIBUTE_NORMAL,
1174 NTCREATEX_SHARE_ACCESS_READ|
1175 NTCREATEX_SHARE_ACCESS_WRITE|
1176 NTCREATEX_SHARE_ACCESS_DELETE,
1177 NTCREATEX_DISP_CREATE,
1180 printf("(%s) open - 1 of %s failed (%s)\n",
1181 __location__, fname, smbcli_errstr(cli1->tree));
1186 /* And close - just to create the file. */
1187 smbcli_close(cli1->tree, fnum1);
1189 /* Next open with all access, but add delete on close. */
1190 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1191 SEC_RIGHTS_FILE_ALL,
1192 FILE_ATTRIBUTE_NORMAL,
1193 NTCREATEX_SHARE_ACCESS_READ|
1194 NTCREATEX_SHARE_ACCESS_WRITE|
1195 NTCREATEX_SHARE_ACCESS_DELETE,
1196 NTCREATEX_DISP_OPEN,
1197 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1200 printf("(%s) open - 1 of %s failed (%s)\n",
1201 __location__, fname, smbcli_errstr(cli1->tree));
1206 /* The delete on close bit is *not* reported as being set. */
1207 check_delete_on_close(cli1, fnum1, fname, False);
1209 /* Now try opening again for read-only. */
1210 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
1211 SEC_RIGHTS_FILE_READ|
1213 FILE_ATTRIBUTE_NORMAL,
1214 NTCREATEX_SHARE_ACCESS_READ|
1215 NTCREATEX_SHARE_ACCESS_WRITE|
1216 NTCREATEX_SHARE_ACCESS_DELETE,
1217 NTCREATEX_DISP_OPEN,
1222 printf("(%s) open - 1 of %s failed (%s)\n",
1223 __location__, fname, smbcli_errstr(cli1->tree));
1228 /* Now close both.... */
1229 smbcli_close(cli1->tree, fnum1);
1230 smbcli_close(cli1->tree, fnum2);
1232 /* See if the file is deleted - shouldn't be.... */
1233 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
1235 printf("(%s) open of %s failed (should succeed) - %s\n",
1236 __location__, fname, smbcli_errstr(cli1->tree));
1241 printf("seventeenth delete on close test succeeded.\n");
1249 static BOOL deltest18(struct smbcli_state *cli1, struct smbcli_state *cli2)
1253 BOOL correct = True;
1255 del_clean_area(cli1, cli2);
1257 /* Test 18. With directories. */
1259 /* Ensure the file doesn't already exist. */
1260 smbcli_close(cli1->tree, fnum1);
1261 smbcli_close(cli1->tree, fnum2);
1263 smbcli_deltree(cli1->tree, dirname);
1265 /* Firstly create with all access, but delete on close. */
1266 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1268 SEC_FILE_WRITE_DATA|
1270 FILE_ATTRIBUTE_DIRECTORY,
1271 NTCREATEX_SHARE_ACCESS_READ|
1272 NTCREATEX_SHARE_ACCESS_WRITE|
1273 NTCREATEX_SHARE_ACCESS_DELETE,
1274 NTCREATEX_DISP_CREATE,
1275 NTCREATEX_OPTIONS_DIRECTORY|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1278 printf("(%s) open - 1 of %s failed (%s)\n",
1279 __location__, dirname, smbcli_errstr(cli1->tree));
1284 /* The delete on close bit is *not* reported as being set. */
1285 check_delete_on_close(cli1, fnum1, dirname, False);
1287 /* Now try opening again for read-only. */
1288 fnum2 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1289 SEC_RIGHTS_FILE_READ,
1290 FILE_ATTRIBUTE_DIRECTORY,
1291 NTCREATEX_SHARE_ACCESS_READ|
1292 NTCREATEX_SHARE_ACCESS_WRITE|
1293 NTCREATEX_SHARE_ACCESS_DELETE,
1294 NTCREATEX_DISP_OPEN,
1295 NTCREATEX_OPTIONS_DIRECTORY, 0);
1300 printf("(%s) open - 1 of %s failed (%s)\n",
1301 __location__, dirname, smbcli_errstr(cli1->tree));
1306 /* Now close both.... */
1307 smbcli_close(cli1->tree, fnum1);
1308 smbcli_close(cli1->tree, fnum2);
1310 /* And the directory should be deleted ! */
1311 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1312 SEC_RIGHTS_FILE_READ,
1313 FILE_ATTRIBUTE_DIRECTORY,
1314 NTCREATEX_SHARE_ACCESS_READ|
1315 NTCREATEX_SHARE_ACCESS_WRITE|
1316 NTCREATEX_SHARE_ACCESS_DELETE,
1317 NTCREATEX_DISP_OPEN,
1318 NTCREATEX_OPTIONS_DIRECTORY, 0);
1320 printf("(%s) open of %s succeeded (should fail)\n",
1321 __location__, dirname);
1326 printf("eighteenth delete on close test succeeded.\n");
1334 static BOOL deltest19(struct smbcli_state *cli1, struct smbcli_state *cli2)
1338 BOOL correct = True;
1340 del_clean_area(cli1, cli2);
1344 smbcli_deltree(cli1->tree, dirname);
1346 /* Firstly open and create with all access */
1347 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1349 SEC_FILE_WRITE_DATA|
1351 FILE_ATTRIBUTE_DIRECTORY,
1352 NTCREATEX_SHARE_ACCESS_READ|
1353 NTCREATEX_SHARE_ACCESS_WRITE|
1354 NTCREATEX_SHARE_ACCESS_DELETE,
1355 NTCREATEX_DISP_CREATE,
1356 NTCREATEX_OPTIONS_DIRECTORY, 0);
1359 printf("(%s) open - 1 of %s failed (%s)\n",
1360 __location__, dirname, smbcli_errstr(cli1->tree));
1365 /* And close - just to create the directory. */
1366 smbcli_close(cli1->tree, fnum1);
1368 /* Next open with all access, but add delete on close. */
1369 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1371 SEC_FILE_WRITE_DATA|
1373 FILE_ATTRIBUTE_DIRECTORY,
1374 NTCREATEX_SHARE_ACCESS_READ|
1375 NTCREATEX_SHARE_ACCESS_WRITE|
1376 NTCREATEX_SHARE_ACCESS_DELETE,
1377 NTCREATEX_DISP_OPEN,
1378 NTCREATEX_OPTIONS_DIRECTORY|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1381 printf("(%s) open - 1 of %s failed (%s)\n",
1382 __location__, fname, smbcli_errstr(cli1->tree));
1387 /* The delete on close bit is *not* reported as being set. */
1388 check_delete_on_close(cli1, fnum1, dirname, False);
1390 /* Now try opening again for read-only. */
1391 fnum2 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1392 SEC_RIGHTS_FILE_READ,
1393 FILE_ATTRIBUTE_DIRECTORY,
1394 NTCREATEX_SHARE_ACCESS_READ|
1395 NTCREATEX_SHARE_ACCESS_WRITE|
1396 NTCREATEX_SHARE_ACCESS_DELETE,
1397 NTCREATEX_DISP_OPEN,
1398 NTCREATEX_OPTIONS_DIRECTORY, 0);
1402 printf("(%s) open - 1 of %s failed (%s)\n",
1403 __location__, dirname, smbcli_errstr(cli1->tree));
1408 /* Now close both.... */
1409 smbcli_close(cli1->tree, fnum1);
1410 smbcli_close(cli1->tree, fnum2);
1412 /* See if the file is deleted - for a directory this seems to be true ! */
1413 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1414 SEC_RIGHTS_FILE_READ,
1415 FILE_ATTRIBUTE_DIRECTORY,
1416 NTCREATEX_SHARE_ACCESS_READ|
1417 NTCREATEX_SHARE_ACCESS_WRITE|
1418 NTCREATEX_SHARE_ACCESS_DELETE,
1419 NTCREATEX_DISP_OPEN,
1420 NTCREATEX_OPTIONS_DIRECTORY, 0);
1422 CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND);
1425 printf("(%s) open of %s succeeded (should fail)\n",
1426 __location__, dirname);
1431 printf("nineteenth delete on close test succeeded.\n");
1439 static BOOL deltest20(struct smbcli_state *cli1, struct smbcli_state *cli2)
1443 BOOL correct = True;
1446 del_clean_area(cli1, cli2);
1448 /* Test 20 -- non-empty directory hardest to get right... */
1450 smbcli_deltree(cli1->tree, dirname);
1452 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1454 SEC_FILE_WRITE_DATA|
1456 FILE_ATTRIBUTE_DIRECTORY,
1457 NTCREATEX_SHARE_ACCESS_READ|
1458 NTCREATEX_SHARE_ACCESS_WRITE|
1459 NTCREATEX_SHARE_ACCESS_DELETE,
1460 NTCREATEX_DISP_CREATE,
1461 NTCREATEX_OPTIONS_DIRECTORY, 0);
1463 printf("(%s) open of %s failed: %s!\n",
1464 __location__, dirname, smbcli_errstr(cli1->tree));
1469 check_delete_on_close(cli1, dnum1, dirname, False);
1470 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True);
1474 asprintf(&fullname, "\\%s%s", dirname, fname);
1475 fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,
1478 printf("(%s) smbcli_open succeeded, should have "
1480 __location__, smbcli_errstr(cli1->tree));
1485 if (!NT_STATUS_EQUAL(smbcli_nt_error(cli1->tree),
1486 NT_STATUS_DELETE_PENDING)) {
1487 printf("(%s) smbcli_open returned %s, expected "
1488 "NT_STATUS_DELETE_PENDING\n",
1489 __location__, smbcli_errstr(cli1->tree));
1495 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, False);
1496 if (!NT_STATUS_IS_OK(status)) {
1497 printf("(%s) setting delete_on_close on file failed !\n",
1505 asprintf(&fullname, "\\%s%s", dirname, fname);
1506 fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,
1509 printf("(%s) smbcli_open failed: %s\n",
1510 __location__, smbcli_errstr(cli1->tree));
1514 smbcli_close(cli1->tree, fnum1);
1517 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True);
1519 if (!NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) {
1520 printf("(%s) setting delete_on_close returned %s, expected "
1521 "NT_STATUS_DIRECTORY_NOT_EMPTY\n", __location__,
1522 smbcli_errstr(cli1->tree));
1527 smbcli_close(cli1->tree, dnum1);
1529 printf("twentieth delete on close test succeeded.\n");
1537 static BOOL deltest21(struct smbcli_state **ppcli1, struct smbcli_state **ppcli2)
1540 struct smbcli_state *cli1 = *ppcli1;
1541 struct smbcli_state *cli2 = *ppcli2;
1542 BOOL correct = True;
1544 del_clean_area(cli1, cli2);
1546 /* Test 21 -- Test removal of file after socket close. */
1548 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1549 SEC_RIGHTS_FILE_ALL,
1550 FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE,
1551 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
1554 printf("(%s) open of %s failed (%s)\n",
1555 __location__, fname, smbcli_errstr(cli1->tree));
1559 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
1560 printf("(%s) setting delete_on_close failed (%s)\n",
1561 __location__, smbcli_errstr(cli1->tree));
1565 /* Ensure delete on close is set. */
1566 check_delete_on_close(cli1, fnum1, fname, True);
1568 /* Now yank the rug from under cli1. */
1569 smbcli_transport_dead(cli1->transport);
1573 if (!torture_open_connection(ppcli1)) {
1579 /* File should not be there. */
1580 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1581 SEC_RIGHTS_FILE_READ,
1582 FILE_ATTRIBUTE_NORMAL,
1583 NTCREATEX_SHARE_ACCESS_READ|
1584 NTCREATEX_SHARE_ACCESS_WRITE|
1585 NTCREATEX_SHARE_ACCESS_DELETE,
1586 NTCREATEX_DISP_OPEN,
1589 CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND);
1591 printf("twenty-first delete on close test succeeded.\n");
1599 Test delete on close semantics.
1601 BOOL torture_test_delete(void)
1603 struct smbcli_state *cli1 = NULL;
1604 struct smbcli_state *cli2 = NULL;
1605 BOOL correct = True;
1607 printf("starting delete test\n");
1609 if (!torture_open_connection(&cli1)) {
1613 if (!torture_open_connection(&cli2)) {
1614 printf("(%s) failed to open second connection.\n",
1620 correct &= deltest1(cli1, cli2);
1621 correct &= deltest2(cli1, cli2);
1622 correct &= deltest3(cli1, cli2);
1623 correct &= deltest4(cli1, cli2);
1624 correct &= deltest5(cli1, cli2);
1625 correct &= deltest6(cli1, cli2);
1626 correct &= deltest7(cli1, cli2);
1627 correct &= deltest8(cli1, cli2);
1628 correct &= deltest9(cli1, cli2);
1629 correct &= deltest10(cli1, cli2);
1630 correct &= deltest11(cli1, cli2);
1631 correct &= deltest12(cli1, cli2);
1632 correct &= deltest13(cli1, cli2);
1633 correct &= deltest14(cli1, cli2);
1634 correct &= deltest15(cli1, cli2);
1635 correct &= deltest16(cli1, cli2);
1636 correct &= deltest17(cli1, cli2);
1637 correct &= deltest18(cli1, cli2);
1638 correct &= deltest19(cli1, cli2);
1639 correct &= deltest20(cli1, cli2);
1640 correct &= deltest21(&cli1, &cli2);
1643 printf("Failed delete test\n");
1645 printf("delete test ok !\n");
1649 del_clean_area(cli1, cli2);
1651 if (!torture_close_connection(cli1)) {
1654 if (!torture_close_connection(cli2)) {