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,
35 TALLOC_CTX *mem_ctx = talloc_init("single_search");
36 union smb_search_data data;
39 time_t c_time, a_time, m_time;
45 status = torture_single_search(cli, mem_ctx,
46 fname, RAW_SEARCH_FULL_DIRECTORY_INFO,
47 FILE_ATTRIBUTE_DIRECTORY,
49 if (!NT_STATUS_IS_OK(status)) {
50 printf("(%s) single_search failed (%s)\n",
51 where, nt_errstr(status));
57 union smb_fileinfo io;
58 int nlink = expect_it ? 0 : 1;
60 io.all_info.level = RAW_FILEINFO_ALL_INFO;
61 io.all_info.in.fnum = fnum;
63 status = smb_raw_fileinfo(cli->tree, mem_ctx, &io);
64 if (!NT_STATUS_IS_OK(status)) {
65 printf("(%s) qfileinfo failed (%s)\n", where,
71 if (expect_it != io.all_info.out.delete_pending) {
72 printf("%s - Expected del_on_close flag %d, qfileinfo/all_info gave %d\n",
73 where, expect_it, io.all_info.out.delete_pending);
78 if (nlink != io.all_info.out.nlink) {
79 printf("%s - Expected nlink %d, qfileinfo/all_info gave %d\n",
80 where, nlink, io.all_info.out.nlink);
85 io.standard_info.level = RAW_FILEINFO_STANDARD_INFO;
86 io.standard_info.in.fnum = fnum;
88 status = smb_raw_fileinfo(cli->tree, mem_ctx, &io);
89 if (!NT_STATUS_IS_OK(status)) {
90 printf("(%s) qpathinfo failed (%s)\n", where,
96 if (expect_it != io.standard_info.out.delete_pending) {
97 printf("%s - Expected del_on_close flag %d, qfileinfo/standard_info gave %d\n",
98 where, expect_it, io.standard_info.out.delete_pending);
103 if (nlink != io.standard_info.out.nlink) {
104 printf("%s - Expected nlink %d, qfileinfo/standard_info gave %d\n",
105 where, nlink, io.all_info.out.nlink);
112 status = smbcli_qpathinfo(cli->tree, fname,
113 &c_time, &a_time, &m_time,
117 if (!NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
118 printf("(%s) qpathinfo did not give correct error "
119 "code (%s) -- NT_STATUS_DELETE_PENDING "
126 if (!NT_STATUS_IS_OK(status)) {
127 printf("(%s) qpathinfo failed (%s)\n", where,
135 talloc_free(mem_ctx);
139 #define CHECK_STATUS(_cli, _expected) do { \
140 if (!NT_STATUS_EQUAL(_cli->tree->session->transport->error.e.nt_status, _expected)) { \
141 printf("(%d) Incorrect status %s - should be %s\n", \
142 __LINE__, nt_errstr(_cli->tree->session->transport->error.e.nt_status), nt_errstr(_expected)); \
147 const char *fname = "\\delete.file";
148 const char *fname_new = "\\delete.new";
149 const char *dirname = "\\delete.dir";
151 static void del_clean_area(struct smbcli_state *cli1, struct smbcli_state *cli2)
153 smbcli_deltree(cli1->tree, dirname);
154 smbcli_setatr(cli1->tree, fname, 0, 0);
155 smbcli_unlink(cli1->tree, fname);
156 smbcli_setatr(cli1->tree, fname_new, 0, 0);
157 smbcli_unlink(cli1->tree, fname_new);
159 smb_raw_exit(cli1->session);
160 smb_raw_exit(cli2->session);
163 /* Test 1 - this should delete the file on close. */
165 static BOOL deltest1(struct smbcli_state *cli1, struct smbcli_state *cli2)
169 del_clean_area(cli1, cli2);
171 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
173 FILE_ATTRIBUTE_NORMAL,
174 NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OVERWRITE_IF,
175 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
178 printf("(%s) open of %s failed (%s)\n",
179 __location__, fname, smbcli_errstr(cli1->tree));
183 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
184 printf("(%s) close failed (%s)\n",
185 __location__, smbcli_errstr(cli1->tree));
189 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
191 printf("(%s) open of %s succeeded (should fail)\n",
192 __location__, fname);
196 printf("first delete on close test succeeded.\n");
200 /* Test 2 - this should delete the file on close. */
201 static BOOL deltest2(struct smbcli_state *cli1, struct smbcli_state *cli2)
205 del_clean_area(cli1, cli2);
207 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
209 FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE,
210 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
213 printf("(%s) open of %s failed (%s)\n",
214 __location__, fname, smbcli_errstr(cli1->tree));
218 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
219 printf("(%s) setting delete_on_close failed (%s)\n",
220 __location__, smbcli_errstr(cli1->tree));
224 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
225 printf("(%s) close failed (%s)\n",
226 __location__, smbcli_errstr(cli1->tree));
230 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
232 printf("(%s) open of %s succeeded should have been deleted on close !\n",
233 __location__, fname);
234 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
235 printf("(%s) close failed (%s)\n",
236 __location__, smbcli_errstr(cli1->tree));
239 smbcli_unlink(cli1->tree, fname);
241 printf("second delete on close test succeeded.\n");
247 static BOOL deltest3(struct smbcli_state *cli1, struct smbcli_state *cli2)
252 del_clean_area(cli1, cli2);
254 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
256 FILE_ATTRIBUTE_NORMAL,
257 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
258 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
261 printf("(%s) open - 1 of %s failed (%s)\n",
262 __location__, fname, smbcli_errstr(cli1->tree));
266 /* This should fail with a sharing violation - open for delete is only compatible
267 with SHARE_DELETE. */
269 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
270 SEC_RIGHTS_FILE_READ,
271 FILE_ATTRIBUTE_NORMAL,
272 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
273 NTCREATEX_DISP_OPEN, 0, 0);
276 printf("(%s) open - 2 of %s succeeded - should have failed.\n",
277 __location__, fname);
281 /* This should succeed. */
283 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
284 SEC_RIGHTS_FILE_READ,
285 FILE_ATTRIBUTE_NORMAL,
286 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
287 NTCREATEX_DISP_OPEN, 0, 0);
290 printf("(%s) open - 2 of %s failed (%s)\n",
291 __location__, fname, smbcli_errstr(cli1->tree));
295 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
296 printf("(%s) setting delete_on_close failed (%s)\n",
297 __location__, smbcli_errstr(cli1->tree));
301 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
302 printf("(%s) close 1 failed (%s)\n",
303 __location__, smbcli_errstr(cli1->tree));
307 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum2))) {
308 printf("(%s) close 2 failed (%s)\n",
309 __location__, smbcli_errstr(cli1->tree));
313 /* This should fail - file should no longer be there. */
315 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
317 printf("(%s) open of %s succeeded should have been deleted on close !\n",
318 __location__, fname);
319 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
320 printf("(%s) close failed (%s)\n",
321 __location__, smbcli_errstr(cli1->tree));
323 smbcli_unlink(cli1->tree, fname);
326 printf("third delete on close test succeeded.\n");
332 static BOOL deltest4(struct smbcli_state *cli1, struct smbcli_state *cli2)
338 del_clean_area(cli1, cli2);
340 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
342 SEC_FILE_WRITE_DATA |
344 FILE_ATTRIBUTE_NORMAL,
345 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
346 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
349 printf("(%s) open of %s failed (%s)\n",
350 __location__, fname, smbcli_errstr(cli1->tree));
354 /* This should succeed. */
355 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
356 SEC_RIGHTS_FILE_READ,
357 FILE_ATTRIBUTE_NORMAL,
358 NTCREATEX_SHARE_ACCESS_READ |
359 NTCREATEX_SHARE_ACCESS_WRITE |
360 NTCREATEX_SHARE_ACCESS_DELETE,
361 NTCREATEX_DISP_OPEN, 0, 0);
363 printf("(%s) open - 2 of %s failed (%s)\n",
364 __location__, fname, smbcli_errstr(cli1->tree));
368 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum2))) {
369 printf("(%s) close - 1 failed (%s)\n",
370 __location__, smbcli_errstr(cli1->tree));
374 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
375 printf("(%s) setting delete_on_close failed (%s)\n",
376 __location__, smbcli_errstr(cli1->tree));
380 /* This should fail - no more opens once delete on close set. */
381 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
382 SEC_RIGHTS_FILE_READ,
383 FILE_ATTRIBUTE_NORMAL,
384 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
385 NTCREATEX_DISP_OPEN, 0, 0);
387 printf("(%s) open - 3 of %s succeeded ! Should have failed.\n",
388 __location__, fname );
391 CHECK_STATUS(cli1, NT_STATUS_DELETE_PENDING);
393 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
394 printf("(%s) close - 2 failed (%s)\n",
395 __location__, smbcli_errstr(cli1->tree));
399 printf("fourth delete on close test succeeded.\n");
407 static BOOL deltest5(struct smbcli_state *cli1, struct smbcli_state *cli2)
411 del_clean_area(cli1, cli2);
413 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
415 printf("(%s) open of %s failed (%s)\n",
416 __location__, fname, smbcli_errstr(cli1->tree));
420 /* This should fail - only allowed on NT opens with DELETE access. */
422 if (NT_STATUS_IS_OK(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
423 printf("(%s) setting delete_on_close on OpenX file succeeded - should fail !\n",
428 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
429 printf("(%s) close - 2 failed (%s)\n",
430 __location__, smbcli_errstr(cli1->tree));
434 printf("fifth delete on close test succeeded.\n");
439 static BOOL deltest6(struct smbcli_state *cli1, struct smbcli_state *cli2)
443 del_clean_area(cli1, cli2);
445 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
446 SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
447 FILE_ATTRIBUTE_NORMAL,
448 NTCREATEX_SHARE_ACCESS_READ |
449 NTCREATEX_SHARE_ACCESS_WRITE |
450 NTCREATEX_SHARE_ACCESS_DELETE,
451 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
454 printf("(%s) open of %s failed (%s)\n",
455 __location__, fname, smbcli_errstr(cli1->tree));
459 /* This should fail - only allowed on NT opens with DELETE access. */
461 if (NT_STATUS_IS_OK(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
462 printf("(%s) setting delete_on_close on file with no delete access succeeded - should fail !\n",
467 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
468 printf("(%s) close - 2 failed (%s)\n",
469 __location__, smbcli_errstr(cli1->tree));
473 printf("sixth delete on close test succeeded.\n");
478 static BOOL deltest7(struct smbcli_state *cli1, struct smbcli_state *cli2)
483 del_clean_area(cli1, cli2);
485 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
487 SEC_FILE_WRITE_DATA |
489 FILE_ATTRIBUTE_NORMAL, 0,
490 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
493 printf("(%s) open of %s failed (%s)\n",
494 __location__, fname, smbcli_errstr(cli1->tree));
499 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
500 printf("(%s) setting delete_on_close on file failed !\n",
506 correct &= check_delete_on_close(cli1, fnum1, fname, True, __location__);
508 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, False))) {
509 printf("(%s) unsetting delete_on_close on file failed !\n",
515 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
517 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
518 printf("(%s) close - 2 failed (%s)\n",
519 __location__, smbcli_errstr(cli1->tree));
524 /* This next open should succeed - we reset the flag. */
526 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
528 printf("(%s) open of %s failed (%s)\n",
529 __location__, fname, smbcli_errstr(cli1->tree));
534 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
535 printf("(%s) close - 2 failed (%s)\n",
536 __location__, smbcli_errstr(cli1->tree));
541 printf("seventh delete on close test succeeded.\n");
549 static BOOL deltest8(struct smbcli_state *cli1, struct smbcli_state *cli2)
555 del_clean_area(cli1, cli2);
557 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
561 FILE_ATTRIBUTE_NORMAL,
562 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
563 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
566 printf("(%s) open of %s failed (%s)\n",
567 __location__, fname, smbcli_errstr(cli1->tree));
572 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
576 FILE_ATTRIBUTE_NORMAL,
577 NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE,
578 NTCREATEX_DISP_OPEN, 0, 0);
581 printf("(%s) open of %s failed (%s)\n",
582 __location__, fname, smbcli_errstr(cli1->tree));
587 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
588 printf("(%s) setting delete_on_close on file failed !\n",
594 correct &= check_delete_on_close(cli1, fnum1, fname, True, __location__);
595 correct &= check_delete_on_close(cli2, fnum2, fname, True, __location__);
597 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
598 printf("(%s) close - 1 failed (%s)\n",
599 __location__, smbcli_errstr(cli1->tree));
604 correct &= check_delete_on_close(cli1, -1, fname, True, __location__);
605 correct &= check_delete_on_close(cli2, fnum2, fname, True, __location__);
607 if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) {
608 printf("(%s) close - 2 failed (%s)\n",
609 __location__, smbcli_errstr(cli2->tree));
614 /* This should fail.. */
615 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
617 printf("(%s) open of %s succeeded should have been deleted on close !\n",
618 __location__, fname);
621 printf("eighth delete on close test succeeded.\n");
630 static BOOL deltest9(struct smbcli_state *cli1, struct smbcli_state *cli2)
634 del_clean_area(cli1, cli2);
636 /* This should fail - we need to set DELETE_ACCESS. */
637 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
638 SEC_FILE_READ_DATA|SEC_FILE_WRITE_DATA,
639 FILE_ATTRIBUTE_NORMAL,
640 NTCREATEX_SHARE_ACCESS_NONE,
641 NTCREATEX_DISP_OVERWRITE_IF,
642 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
645 printf("(%s) open of %s succeeded should have failed!\n",
646 __location__, fname);
650 printf("ninth delete on close test succeeded.\n");
655 static BOOL deltest10(struct smbcli_state *cli1, struct smbcli_state *cli2)
660 del_clean_area(cli1, cli2);
662 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
666 FILE_ATTRIBUTE_NORMAL,
667 NTCREATEX_SHARE_ACCESS_NONE,
668 NTCREATEX_DISP_OVERWRITE_IF,
669 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
671 printf("(%s) open of %s failed (%s)\n",
672 __location__, fname, smbcli_errstr(cli1->tree));
677 /* This should delete the file. */
678 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
679 printf("(%s) close failed (%s)\n",
680 __location__, smbcli_errstr(cli1->tree));
685 /* This should fail.. */
686 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
688 printf("(%s) open of %s succeeded should have been deleted on close !\n",
689 __location__, fname);
693 printf("tenth delete on close test succeeded.\n");
702 static BOOL deltest11(struct smbcli_state *cli1, struct smbcli_state *cli2)
707 del_clean_area(cli1, cli2);
709 /* test 11 - does having read only attribute still allow delete on close. */
711 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
713 FILE_ATTRIBUTE_READONLY,
714 NTCREATEX_SHARE_ACCESS_NONE,
715 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
718 printf("(%s) open of %s failed (%s)\n",
719 __location__, fname, smbcli_errstr(cli1->tree));
723 status = smbcli_nt_delete_on_close(cli1->tree, fnum1, True);
725 if (!NT_STATUS_EQUAL(status, NT_STATUS_CANNOT_DELETE)) {
726 printf("(%s) setting delete_on_close should fail with NT_STATUS_CANNOT_DELETE. Got %s instead)\n",
727 __location__, smbcli_errstr(cli1->tree));
731 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
732 printf("(%s) close failed (%s)\n",
733 __location__, smbcli_errstr(cli1->tree));
737 printf("eleventh delete on close test succeeded.\n");
742 static BOOL deltest12(struct smbcli_state *cli1, struct smbcli_state *cli2)
747 del_clean_area(cli1, cli2);
749 /* test 12 - does having read only attribute still allow delete on
750 * close at time of open. */
752 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
754 FILE_ATTRIBUTE_READONLY,
755 NTCREATEX_SHARE_ACCESS_DELETE,
756 NTCREATEX_DISP_OVERWRITE_IF,
757 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
760 printf("(%s) open of %s succeeded. Should fail with "
761 "NT_STATUS_CANNOT_DELETE.\n", __location__, fname);
762 smbcli_close(cli1->tree, fnum1);
765 status = smbcli_nt_error(cli1->tree);
766 if (!NT_STATUS_EQUAL(status, NT_STATUS_CANNOT_DELETE)) {
767 printf("(%s) setting delete_on_close on open should "
768 "fail with NT_STATUS_CANNOT_DELETE. Got %s "
770 __location__, smbcli_errstr(cli1->tree));
775 printf("twelvth delete on close test succeeded.\n");
780 static BOOL deltest13(struct smbcli_state *cli1, struct smbcli_state *cli2)
786 del_clean_area(cli1, cli2);
788 /* Test 13: Does resetting the delete on close flag affect a second
791 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
795 FILE_ATTRIBUTE_NORMAL,
796 NTCREATEX_SHARE_ACCESS_READ|
797 NTCREATEX_SHARE_ACCESS_WRITE|
798 NTCREATEX_SHARE_ACCESS_DELETE,
799 NTCREATEX_DISP_OVERWRITE_IF,
803 printf("(%s) open of %s failed (%s)\n",
804 __location__, fname, smbcli_errstr(cli1->tree));
809 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
813 FILE_ATTRIBUTE_NORMAL,
814 NTCREATEX_SHARE_ACCESS_READ|
815 NTCREATEX_SHARE_ACCESS_WRITE|
816 NTCREATEX_SHARE_ACCESS_DELETE,
817 NTCREATEX_DISP_OPEN, 0, 0);
820 printf("(%s) open of %s failed (%s)\n",
821 __location__, fname, smbcli_errstr(cli2->tree));
826 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1,
828 printf("(%s) setting delete_on_close on file failed !\n",
834 correct &= check_delete_on_close(cli1, fnum1, fname, True, __location__);
835 correct &= check_delete_on_close(cli2, fnum2, fname, True, __location__);
837 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli2->tree, fnum2,
839 printf("(%s) setting delete_on_close on file failed !\n",
845 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
846 correct &= check_delete_on_close(cli2, fnum2, fname, False, __location__);
848 if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) {
849 printf("(%s) close - 1 failed (%s)\n",
850 __location__, smbcli_errstr(cli1->tree));
855 if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) {
856 printf("(%s) close - 2 failed (%s)\n",
857 __location__, smbcli_errstr(cli2->tree));
862 fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY, DENY_NONE);
865 printf("(%s) open of %s failed!\n",
866 __location__, fname);
871 printf("thirteenth delete on close test succeeded.\n");
879 static BOOL deltest14(struct smbcli_state *cli1, struct smbcli_state *cli2)
884 del_clean_area(cli1, cli2);
886 /* Test 14 -- directory */
888 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
892 FILE_ATTRIBUTE_DIRECTORY,
893 NTCREATEX_SHARE_ACCESS_READ|
894 NTCREATEX_SHARE_ACCESS_WRITE|
895 NTCREATEX_SHARE_ACCESS_DELETE,
896 NTCREATEX_DISP_CREATE, 0, 0);
898 printf("(%s) open of %s failed: %s!\n",
899 __location__, dirname, smbcli_errstr(cli1->tree));
904 correct &= check_delete_on_close(cli1, dnum1, dirname, False, __location__);
905 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, dnum1, True))) {
906 printf("(%s) setting delete_on_close on file failed !\n",
911 correct &= check_delete_on_close(cli1, dnum1, dirname, True, __location__);
912 smbcli_close(cli1->tree, dnum1);
914 /* Now it should be gone... */
916 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
920 FILE_ATTRIBUTE_DIRECTORY,
921 NTCREATEX_SHARE_ACCESS_READ|
922 NTCREATEX_SHARE_ACCESS_WRITE|
923 NTCREATEX_SHARE_ACCESS_DELETE,
924 NTCREATEX_DISP_OPEN, 0, 0);
926 printf("(%s) setting delete_on_close on file succeeded !\n",
932 printf("fourteenth delete on close test succeeded.\n");
940 static BOOL deltest15(struct smbcli_state *cli1, struct smbcli_state *cli2)
947 del_clean_area(cli1, cli2);
949 /* Test 15: delete on close under rename */
951 smbcli_setatr(cli1->tree, fname, 0, 0);
952 smbcli_unlink(cli1->tree, fname);
953 smbcli_unlink(cli1->tree, fname_new);
955 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
957 FILE_ATTRIBUTE_NORMAL,
958 NTCREATEX_SHARE_ACCESS_READ|
959 NTCREATEX_SHARE_ACCESS_WRITE|
960 NTCREATEX_SHARE_ACCESS_DELETE,
961 NTCREATEX_DISP_OVERWRITE_IF,
965 printf("(%s) open - 1 of %s failed (%s)\n",
966 __location__, fname, smbcli_errstr(cli1->tree));
971 status = smbcli_rename(cli2->tree, fname, fname_new);
973 if (!NT_STATUS_IS_OK(status)) {
974 printf("(%s) renaming failed: %s !\n",
975 __location__, nt_errstr(status));
980 fnum2 = smbcli_nt_create_full(cli2->tree, fname_new, 0,
982 FILE_ATTRIBUTE_NORMAL,
983 NTCREATEX_SHARE_ACCESS_READ|
984 NTCREATEX_SHARE_ACCESS_WRITE|
985 NTCREATEX_SHARE_ACCESS_DELETE,
986 NTCREATEX_DISP_OVERWRITE_IF,
990 printf("(%s) open - 1 of %s failed (%s)\n",
991 __location__, fname_new, smbcli_errstr(cli1->tree));
996 status = smbcli_nt_delete_on_close(cli2->tree, fnum2, True);
998 if (!NT_STATUS_IS_OK(status)) {
999 printf("(%s) setting delete_on_close on file failed !\n",
1005 smbcli_close(cli2->tree, fnum2);
1007 /* The file should be around under the new name, there's a second
1010 correct &= check_delete_on_close(cli1, fnum1, fname_new, True, __location__);
1012 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
1014 FILE_ATTRIBUTE_NORMAL,
1015 NTCREATEX_SHARE_ACCESS_READ|
1016 NTCREATEX_SHARE_ACCESS_WRITE|
1017 NTCREATEX_SHARE_ACCESS_DELETE,
1018 NTCREATEX_DISP_OVERWRITE_IF,
1022 printf("(%s) open - 1 of %s failed (%s)\n",
1023 __location__, fname, smbcli_errstr(cli1->tree));
1028 correct &= check_delete_on_close(cli2, fnum2, fname, False, __location__);
1030 smbcli_close(cli2->tree, fnum2);
1031 smbcli_close(cli1->tree, fnum1);
1033 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1035 FILE_ATTRIBUTE_NORMAL,
1036 NTCREATEX_SHARE_ACCESS_READ|
1037 NTCREATEX_SHARE_ACCESS_WRITE|
1038 NTCREATEX_SHARE_ACCESS_DELETE,
1039 NTCREATEX_DISP_OPEN,
1043 printf("(%s) open - 1 of %s failed (%s)\n",
1044 __location__, fname, smbcli_errstr(cli1->tree));
1049 smbcli_close(cli1->tree, fnum1);
1051 fnum1 = smbcli_nt_create_full(cli1->tree, fname_new, 0,
1053 FILE_ATTRIBUTE_NORMAL,
1054 NTCREATEX_SHARE_ACCESS_READ|
1055 NTCREATEX_SHARE_ACCESS_WRITE|
1056 NTCREATEX_SHARE_ACCESS_DELETE,
1057 NTCREATEX_DISP_OPEN,
1061 printf("(%s) smbcli_open succeeded, should have "
1062 "failed\n", __location__);
1063 smbcli_close(cli1->tree, fnum1);
1068 printf("fifteenth delete on close test succeeded.\n");
1076 static BOOL deltest16(struct smbcli_state *cli1, struct smbcli_state *cli2)
1080 BOOL correct = True;
1082 del_clean_area(cli1, cli2);
1086 /* Ensure the file doesn't already exist. */
1087 smbcli_close(cli1->tree, fnum1);
1088 smbcli_close(cli1->tree, fnum2);
1089 smbcli_setatr(cli1->tree, fname, 0, 0);
1090 smbcli_unlink(cli1->tree, fname);
1092 /* Firstly create with all access, but delete on close. */
1093 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1094 SEC_RIGHTS_FILE_ALL,
1095 FILE_ATTRIBUTE_NORMAL,
1096 NTCREATEX_SHARE_ACCESS_READ|
1097 NTCREATEX_SHARE_ACCESS_WRITE|
1098 NTCREATEX_SHARE_ACCESS_DELETE,
1099 NTCREATEX_DISP_CREATE,
1100 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1103 printf("(%s) open - 1 of %s failed (%s)\n",
1104 __location__, fname, smbcli_errstr(cli1->tree));
1109 /* The delete on close bit is *not* reported as being set. */
1110 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
1112 /* The delete on close bit is *not* reported as being set. */
1113 correct &= check_delete_on_close(cli1, -1, fname, False, __location__);
1114 correct &= check_delete_on_close(cli2, -1, fname, False, __location__);
1116 /* Now try opening again for read-only. */
1117 fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0,
1118 SEC_RIGHTS_FILE_READ,
1119 FILE_ATTRIBUTE_NORMAL,
1120 NTCREATEX_SHARE_ACCESS_READ|
1121 NTCREATEX_SHARE_ACCESS_WRITE|
1122 NTCREATEX_SHARE_ACCESS_DELETE,
1123 NTCREATEX_DISP_OPEN,
1129 printf("(%s) open - 1 of %s failed (%s)\n",
1130 __location__, fname, smbcli_errstr(cli1->tree));
1135 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
1136 correct &= check_delete_on_close(cli1, -1, fname, False, __location__);
1137 correct &= check_delete_on_close(cli2, fnum2, fname, False, __location__);
1138 correct &= check_delete_on_close(cli2, -1, fname, False, __location__);
1140 smbcli_close(cli1->tree, fnum1);
1142 correct &= check_delete_on_close(cli2, fnum2, fname, True, __location__);
1143 correct &= check_delete_on_close(cli2, -1, fname, True, __location__);
1145 smbcli_close(cli2->tree, fnum2);
1147 /* And the file should be deleted ! */
1148 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
1150 printf("(%s) open of %s succeeded (should fail)\n",
1151 __location__, fname);
1156 printf("sixteenth delete on close test succeeded.\n");
1164 static BOOL deltest17(struct smbcli_state *cli1, struct smbcli_state *cli2)
1168 BOOL correct = True;
1170 del_clean_area(cli1, cli2);
1174 /* Ensure the file doesn't already exist. */
1175 smbcli_close(cli1->tree, fnum1);
1176 smbcli_close(cli1->tree, fnum2);
1177 smbcli_setatr(cli1->tree, fname, 0, 0);
1178 smbcli_unlink(cli1->tree, fname);
1180 /* Firstly open and create with all access */
1181 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1182 SEC_RIGHTS_FILE_ALL,
1183 FILE_ATTRIBUTE_NORMAL,
1184 NTCREATEX_SHARE_ACCESS_READ|
1185 NTCREATEX_SHARE_ACCESS_WRITE|
1186 NTCREATEX_SHARE_ACCESS_DELETE,
1187 NTCREATEX_DISP_CREATE,
1190 printf("(%s) open - 1 of %s failed (%s)\n",
1191 __location__, fname, smbcli_errstr(cli1->tree));
1196 /* And close - just to create the file. */
1197 smbcli_close(cli1->tree, fnum1);
1199 /* Next open with all access, but add delete on close. */
1200 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1201 SEC_RIGHTS_FILE_ALL,
1202 FILE_ATTRIBUTE_NORMAL,
1203 NTCREATEX_SHARE_ACCESS_READ|
1204 NTCREATEX_SHARE_ACCESS_WRITE|
1205 NTCREATEX_SHARE_ACCESS_DELETE,
1206 NTCREATEX_DISP_OPEN,
1207 NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1210 printf("(%s) open - 1 of %s failed (%s)\n",
1211 __location__, fname, smbcli_errstr(cli1->tree));
1216 /* The delete on close bit is *not* reported as being set. */
1217 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
1219 /* Now try opening again for read-only. */
1220 fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0,
1221 SEC_RIGHTS_FILE_READ|
1223 FILE_ATTRIBUTE_NORMAL,
1224 NTCREATEX_SHARE_ACCESS_READ|
1225 NTCREATEX_SHARE_ACCESS_WRITE|
1226 NTCREATEX_SHARE_ACCESS_DELETE,
1227 NTCREATEX_DISP_OPEN,
1232 printf("(%s) open - 1 of %s failed (%s)\n",
1233 __location__, fname, smbcli_errstr(cli1->tree));
1238 /* still not reported as being set on either */
1239 correct &= check_delete_on_close(cli1, fnum1, fname, False, __location__);
1240 correct &= check_delete_on_close(cli1, fnum2, fname, False, __location__);
1242 smbcli_close(cli1->tree, fnum1);
1244 correct &= check_delete_on_close(cli1, fnum2, fname, False, __location__);
1246 smbcli_close(cli1->tree, fnum2);
1248 /* See if the file is deleted - shouldn't be.... */
1249 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);
1251 printf("(%s) open of %s failed (should succeed) - %s\n",
1252 __location__, fname, smbcli_errstr(cli1->tree));
1257 printf("seventeenth delete on close test succeeded.\n");
1265 static BOOL deltest18(struct smbcli_state *cli1, struct smbcli_state *cli2)
1269 BOOL correct = True;
1271 del_clean_area(cli1, cli2);
1273 /* Test 18. With directories. */
1275 /* Ensure the file doesn't already exist. */
1276 smbcli_close(cli1->tree, fnum1);
1277 smbcli_close(cli1->tree, fnum2);
1279 smbcli_deltree(cli1->tree, dirname);
1281 /* Firstly create with all access, but delete on close. */
1282 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1284 SEC_FILE_WRITE_DATA|
1286 FILE_ATTRIBUTE_DIRECTORY,
1287 NTCREATEX_SHARE_ACCESS_READ|
1288 NTCREATEX_SHARE_ACCESS_WRITE|
1289 NTCREATEX_SHARE_ACCESS_DELETE,
1290 NTCREATEX_DISP_CREATE,
1291 NTCREATEX_OPTIONS_DIRECTORY|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1294 printf("(%s) open - 1 of %s failed (%s)\n",
1295 __location__, dirname, smbcli_errstr(cli1->tree));
1300 /* The delete on close bit is *not* reported as being set. */
1301 correct &= check_delete_on_close(cli1, fnum1, dirname, False, __location__);
1303 /* Now try opening again for read-only. */
1304 fnum2 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1305 SEC_RIGHTS_FILE_READ,
1306 FILE_ATTRIBUTE_DIRECTORY,
1307 NTCREATEX_SHARE_ACCESS_READ|
1308 NTCREATEX_SHARE_ACCESS_WRITE|
1309 NTCREATEX_SHARE_ACCESS_DELETE,
1310 NTCREATEX_DISP_OPEN,
1311 NTCREATEX_OPTIONS_DIRECTORY, 0);
1316 printf("(%s) open - 1 of %s failed (%s)\n",
1317 __location__, dirname, smbcli_errstr(cli1->tree));
1322 correct &= check_delete_on_close(cli1, fnum1, dirname, False, __location__);
1323 correct &= check_delete_on_close(cli1, fnum2, dirname, False, __location__);
1325 smbcli_close(cli1->tree, fnum1);
1327 correct &= check_delete_on_close(cli1, fnum2, dirname, True, __location__);
1329 smbcli_close(cli1->tree, fnum2);
1331 /* And the directory should be deleted ! */
1332 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1333 SEC_RIGHTS_FILE_READ,
1334 FILE_ATTRIBUTE_DIRECTORY,
1335 NTCREATEX_SHARE_ACCESS_READ|
1336 NTCREATEX_SHARE_ACCESS_WRITE|
1337 NTCREATEX_SHARE_ACCESS_DELETE,
1338 NTCREATEX_DISP_OPEN,
1339 NTCREATEX_OPTIONS_DIRECTORY, 0);
1341 printf("(%s) open of %s succeeded (should fail)\n",
1342 __location__, dirname);
1347 printf("eighteenth delete on close test succeeded.\n");
1355 static BOOL deltest19(struct smbcli_state *cli1, struct smbcli_state *cli2)
1359 BOOL correct = True;
1361 del_clean_area(cli1, cli2);
1365 smbcli_deltree(cli1->tree, dirname);
1367 /* Firstly open and create with all access */
1368 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1370 SEC_FILE_WRITE_DATA|
1372 FILE_ATTRIBUTE_DIRECTORY,
1373 NTCREATEX_SHARE_ACCESS_READ|
1374 NTCREATEX_SHARE_ACCESS_WRITE|
1375 NTCREATEX_SHARE_ACCESS_DELETE,
1376 NTCREATEX_DISP_CREATE,
1377 NTCREATEX_OPTIONS_DIRECTORY, 0);
1380 printf("(%s) open - 1 of %s failed (%s)\n",
1381 __location__, dirname, smbcli_errstr(cli1->tree));
1386 /* And close - just to create the directory. */
1387 smbcli_close(cli1->tree, fnum1);
1389 /* Next open with all access, but add delete on close. */
1390 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1392 SEC_FILE_WRITE_DATA|
1394 FILE_ATTRIBUTE_DIRECTORY,
1395 NTCREATEX_SHARE_ACCESS_READ|
1396 NTCREATEX_SHARE_ACCESS_WRITE|
1397 NTCREATEX_SHARE_ACCESS_DELETE,
1398 NTCREATEX_DISP_OPEN,
1399 NTCREATEX_OPTIONS_DIRECTORY|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);
1402 printf("(%s) open - 1 of %s failed (%s)\n",
1403 __location__, fname, smbcli_errstr(cli1->tree));
1408 /* The delete on close bit is *not* reported as being set. */
1409 correct &= check_delete_on_close(cli1, fnum1, dirname, False, __location__);
1411 /* Now try opening again for read-only. */
1412 fnum2 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1413 SEC_RIGHTS_FILE_READ,
1414 FILE_ATTRIBUTE_DIRECTORY,
1415 NTCREATEX_SHARE_ACCESS_READ|
1416 NTCREATEX_SHARE_ACCESS_WRITE|
1417 NTCREATEX_SHARE_ACCESS_DELETE,
1418 NTCREATEX_DISP_OPEN,
1419 NTCREATEX_OPTIONS_DIRECTORY, 0);
1423 printf("(%s) open - 1 of %s failed (%s)\n",
1424 __location__, dirname, smbcli_errstr(cli1->tree));
1429 smbcli_close(cli1->tree, fnum1);
1431 correct &= check_delete_on_close(cli1, fnum2, dirname, True, __location__);
1433 smbcli_close(cli1->tree, fnum2);
1435 /* See if the file is deleted - for a directory this seems to be true ! */
1436 fnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1437 SEC_RIGHTS_FILE_READ,
1438 FILE_ATTRIBUTE_DIRECTORY,
1439 NTCREATEX_SHARE_ACCESS_READ|
1440 NTCREATEX_SHARE_ACCESS_WRITE|
1441 NTCREATEX_SHARE_ACCESS_DELETE,
1442 NTCREATEX_DISP_OPEN,
1443 NTCREATEX_OPTIONS_DIRECTORY, 0);
1445 CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND);
1448 printf("(%s) open of %s succeeded (should fail)\n",
1449 __location__, dirname);
1454 printf("nineteenth delete on close test succeeded.\n");
1462 static BOOL deltest20(struct smbcli_state *cli1, struct smbcli_state *cli2)
1466 BOOL correct = True;
1469 del_clean_area(cli1, cli2);
1471 /* Test 20 -- non-empty directory hardest to get right... */
1473 smbcli_deltree(cli1->tree, dirname);
1475 dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0,
1477 SEC_FILE_WRITE_DATA|
1479 FILE_ATTRIBUTE_DIRECTORY,
1480 NTCREATEX_SHARE_ACCESS_READ|
1481 NTCREATEX_SHARE_ACCESS_WRITE|
1482 NTCREATEX_SHARE_ACCESS_DELETE,
1483 NTCREATEX_DISP_CREATE,
1484 NTCREATEX_OPTIONS_DIRECTORY, 0);
1486 printf("(%s) open of %s failed: %s!\n",
1487 __location__, dirname, smbcli_errstr(cli1->tree));
1492 correct &= check_delete_on_close(cli1, dnum1, dirname, False, __location__);
1493 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True);
1497 asprintf(&fullname, "\\%s%s", dirname, fname);
1498 fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,
1501 printf("(%s) smbcli_open succeeded, should have "
1502 "failed with NT_STATUS_DELETE_PENDING\n",
1508 if (!NT_STATUS_EQUAL(smbcli_nt_error(cli1->tree),
1509 NT_STATUS_DELETE_PENDING)) {
1510 printf("(%s) smbcli_open returned %s, expected "
1511 "NT_STATUS_DELETE_PENDING\n",
1512 __location__, smbcli_errstr(cli1->tree));
1518 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, False);
1519 if (!NT_STATUS_IS_OK(status)) {
1520 printf("(%s) setting delete_on_close on file failed !\n",
1528 asprintf(&fullname, "\\%s%s", dirname, fname);
1529 fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,
1532 printf("(%s) smbcli_open failed: %s\n",
1533 __location__, smbcli_errstr(cli1->tree));
1537 smbcli_close(cli1->tree, fnum1);
1540 status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True);
1542 if (!NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) {
1543 printf("(%s) setting delete_on_close returned %s, expected "
1544 "NT_STATUS_DIRECTORY_NOT_EMPTY\n", __location__,
1545 smbcli_errstr(cli1->tree));
1550 smbcli_close(cli1->tree, dnum1);
1552 printf("twentieth delete on close test succeeded.\n");
1560 static BOOL deltest21(struct smbcli_state **ppcli1, struct smbcli_state **ppcli2)
1563 struct smbcli_state *cli1 = *ppcli1;
1564 struct smbcli_state *cli2 = *ppcli2;
1565 BOOL correct = True;
1567 del_clean_area(cli1, cli2);
1569 /* Test 21 -- Test removal of file after socket close. */
1571 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1572 SEC_RIGHTS_FILE_ALL,
1573 FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE,
1574 NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
1577 printf("(%s) open of %s failed (%s)\n",
1578 __location__, fname, smbcli_errstr(cli1->tree));
1582 if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, fnum1, True))) {
1583 printf("(%s) setting delete_on_close failed (%s)\n",
1584 __location__, smbcli_errstr(cli1->tree));
1588 /* Ensure delete on close is set. */
1589 correct &= check_delete_on_close(cli1, fnum1, fname, True, __location__);
1591 /* Now yank the rug from under cli1. */
1592 smbcli_transport_dead(cli1->transport);
1596 if (!torture_open_connection(ppcli1)) {
1602 /* File should not be there. */
1603 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0,
1604 SEC_RIGHTS_FILE_READ,
1605 FILE_ATTRIBUTE_NORMAL,
1606 NTCREATEX_SHARE_ACCESS_READ|
1607 NTCREATEX_SHARE_ACCESS_WRITE|
1608 NTCREATEX_SHARE_ACCESS_DELETE,
1609 NTCREATEX_DISP_OPEN,
1612 CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND);
1614 printf("twenty-first delete on close test succeeded.\n");
1622 Test delete on close semantics.
1624 BOOL torture_test_delete(void)
1626 struct smbcli_state *cli1 = NULL;
1627 struct smbcli_state *cli2 = NULL;
1628 BOOL correct = True;
1630 printf("starting delete test\n");
1632 if (!torture_open_connection(&cli1)) {
1636 if (!torture_open_connection(&cli2)) {
1637 printf("(%s) failed to open second connection.\n",
1643 correct &= deltest1(cli1, cli2);
1644 correct &= deltest2(cli1, cli2);
1645 correct &= deltest3(cli1, cli2);
1646 correct &= deltest4(cli1, cli2);
1647 correct &= deltest5(cli1, cli2);
1648 correct &= deltest6(cli1, cli2);
1649 correct &= deltest7(cli1, cli2);
1650 correct &= deltest8(cli1, cli2);
1651 correct &= deltest9(cli1, cli2);
1652 correct &= deltest10(cli1, cli2);
1653 correct &= deltest11(cli1, cli2);
1654 correct &= deltest12(cli1, cli2);
1655 correct &= deltest13(cli1, cli2);
1656 correct &= deltest14(cli1, cli2);
1657 correct &= deltest15(cli1, cli2);
1658 correct &= deltest16(cli1, cli2);
1659 correct &= deltest17(cli1, cli2);
1660 correct &= deltest18(cli1, cli2);
1661 correct &= deltest19(cli1, cli2);
1662 correct &= deltest20(cli1, cli2);
1663 correct &= deltest21(&cli1, &cli2);
1666 printf("Failed delete test\n");
1668 printf("delete test ok !\n");
1672 del_clean_area(cli1, cli2);
1674 if (!torture_close_connection(cli1)) {
1677 if (!torture_close_connection(cli2)) {