⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delete.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
		asprintf(&fullname, "\\%s%s", dname, fname);		fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,				    DENY_NONE);		torture_assert(tctx, fnum1 == -1, 				"smbcli_open succeeded, should have "			       "failed with NT_STATUS_DELETE_PENDING"			       );		torture_assert_ntstatus_equal(tctx, 					 smbcli_nt_error(cli1->tree),				     NT_STATUS_DELETE_PENDING, 					"smbcli_open failed");	}	status = smbcli_nt_delete_on_close(cli1->tree, dnum1, false);	torture_assert_ntstatus_ok(tctx, status, 					"setting delete_on_close on file failed !");			{		char *fullname;		asprintf(&fullname, "\\%s%s", dname, fname);		fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR,				    DENY_NONE);		torture_assert(tctx, fnum1 != -1, 				talloc_asprintf(tctx, "smbcli_open failed: %s\n",			       smbcli_errstr(cli1->tree)));		smbcli_close(cli1->tree, fnum1);	}	status = smbcli_nt_delete_on_close(cli1->tree, dnum1, true);	torture_assert_ntstatus_equal(tctx, status, NT_STATUS_DIRECTORY_NOT_EMPTY,		 "setting delete_on_close failed");	smbcli_close(cli1->tree, dnum1);	return correct;}/* Test 20a ... */static bool deltest20a(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){	int fnum1 = -1;	int fnum2 = -1;	bool correct = true;	del_clean_area(cli1, cli2);	/* Test 20a. */	/* Ensure the file doesn't already exist. */	smbcli_close(cli1->tree, fnum1);	smbcli_close(cli1->tree, fnum2);	smbcli_setatr(cli1->tree, fname, 0, 0);	smbcli_unlink(cli1->tree, fname);	/* Firstly open and create with all access */	fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_CREATE, 				      0, 0);	torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", 		       fname, smbcli_errstr(cli1->tree)));	/* Next open with all access, but add delete on close. */	fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN,				      NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);		torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 2 of %s failed (%s)", 		       fname, smbcli_errstr(cli2->tree)));	/* The delete on close bit is *not* reported as being set. */	correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__);	correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__);	smbcli_close(cli1->tree, fnum1);	correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__);	smbcli_close(cli2->tree, fnum2);	/* See if the file is deleted - should be.... */	fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);	torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail) - %s", 		       fname, smbcli_errstr(cli1->tree)));	return correct;}/* Test 20b ... *//* This is the delete semantics that the cifsfs client depends on when * trying to delete an open file on a Windows server. It * opens a file with initial delete on close set, renames it then closes * all open handles. The file goes away on Windows. */static bool deltest20b(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){	int fnum1 = -1;	int fnum2 = -1;	bool correct = true;	del_clean_area(cli1, cli2);	/* Test 20b. */	/* Ensure the file doesn't already exist. */	smbcli_close(cli1->tree, fnum1);	smbcli_close(cli1->tree, fnum2);	smbcli_setatr(cli1->tree, fname, 0, 0);	smbcli_unlink(cli1->tree, fname);	smbcli_setatr(cli1->tree, fname_new, 0, 0);	smbcli_unlink(cli1->tree, fname_new);	/* Firstly open and create with all access */	fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_CREATE, 				      0, 0);	torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", 		       fname, smbcli_errstr(cli1->tree)));	/* And close - just to create the file. */	smbcli_close(cli1->tree, fnum1);		/* Firstly open and create with all access */	fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN, 				      0, 0);	torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", 		       fname, smbcli_errstr(cli1->tree)));	/* Next open with all access, but add delete on close. */	fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN,				      NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0);		torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 2 of %s failed (%s)", 		       fname, smbcli_errstr(cli2->tree)));	/* The delete on close bit is *not* reported as being set. */	correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__);	correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__);	smbcli_close(cli1->tree, fnum1);	correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__);	/* Rename the file by handle. */	{		union smb_setfileinfo sfinfo;		NTSTATUS status;		memset(&sfinfo, '\0', sizeof(sfinfo));		sfinfo.generic.level = RAW_SFILEINFO_RENAME_INFORMATION;		sfinfo.generic.in.file.fnum = fnum2;		sfinfo.rename_information.in.root_fid  = 0;		/* Don't start the filename with '\\', we get NT_STATUS_NOT_SUPPORTED if so. */		sfinfo.rename_information.in.new_name  = fname_new + 1;		sfinfo.rename_information.in.overwrite = 1;		status = smb_raw_setfileinfo(cli2->tree, &sfinfo);		torture_assert_ntstatus_equal(tctx,status,NT_STATUS_OK,talloc_asprintf(tctx, "rename of %s to %s failed (%s)",			fname, fname_new, smbcli_errstr(cli2->tree)));	}	correct &= check_delete_on_close(tctx, cli2, fnum2, fname_new, false, __location__);	smbcli_close(cli2->tree, fnum2);	/* See if the file is deleted - should be.... */	fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE);	torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail) - %s", 		       fname, smbcli_errstr(cli1->tree)));	fnum1 = smbcli_open(cli1->tree, fname_new, O_RDWR, DENY_NONE);	torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail) - %s", 		       fname_new, smbcli_errstr(cli1->tree)));	return correct;}/* Test 21 ... */static bool deltest21(struct torture_context *tctx){	int fnum1 = -1;	struct smbcli_state *cli1;	struct smbcli_state *cli2;	bool correct = true;	if (!torture_open_connection(&cli1, tctx, 0))		return false;	if (!torture_open_connection(&cli2, tctx, 1))		return false;	del_clean_area(cli1, cli2);	/* Test 21 -- Test removal of file after socket close. */	fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 				      SEC_RIGHTS_FILE_ALL,				      FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, 				      NTCREATEX_DISP_OVERWRITE_IF, 0, 0);		torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open of %s failed (%s)", 		       fname, smbcli_errstr(cli1->tree)));		torture_assert_ntstatus_ok(tctx, 				smbcli_nt_delete_on_close(cli1->tree, fnum1, true),				talloc_asprintf(tctx, "setting delete_on_close failed (%s)", 		       smbcli_errstr(cli1->tree)));		/* Ensure delete on close is set. */	correct &= check_delete_on_close(tctx, cli1, fnum1, fname, true, __location__);	/* Now yank the rug from under cli1. */	smbcli_transport_dead(cli1->transport, NT_STATUS_LOCAL_DISCONNECT);	fnum1 = -1;	if (!torture_open_connection(&cli1, tctx, 0)) {		return false;	}	/* On slow build farm machines it might happen that they are not fast	 * enogh to delete the file for this test */	msleep(200);	/* File should not be there. */	fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 				      SEC_RIGHTS_FILE_READ,				      FILE_ATTRIBUTE_NORMAL,				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN,				      0, 0);		CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND);	return correct;}/* Test 22 ... *//* * Test whether a second *directory* handle inhibits delete if the first has * del-on-close set and is closed */static bool deltest22(struct torture_context *tctx){	int dnum1 = -1;	int dnum2 = -1;	struct smbcli_state *cli1;	bool correct = true;	if (!torture_open_connection(&cli1, tctx, 0))		return false;	smbcli_deltree(cli1->tree, dname);	torture_assert_ntstatus_ok(		tctx, smbcli_mkdir(cli1->tree, dname),		talloc_asprintf(tctx, "smbcli_mdir failed: (%s)\n",				smbcli_errstr(cli1->tree)));	dnum1 = smbcli_nt_create_full(cli1->tree, dname, 0,				      SEC_FILE_READ_DATA|				      SEC_FILE_WRITE_DATA|				      SEC_STD_DELETE,				      FILE_ATTRIBUTE_DIRECTORY, 				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN, 				      NTCREATEX_OPTIONS_DIRECTORY, 0);	torture_assert(tctx, dnum1 != -1,		       talloc_asprintf(tctx, "open of %s failed: %s!", 				       dname, smbcli_errstr(cli1->tree)));	dnum2 = smbcli_nt_create_full(cli1->tree, dname, 0,				      SEC_FILE_READ_DATA|				      SEC_FILE_WRITE_DATA,				      FILE_ATTRIBUTE_DIRECTORY, 				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN, 				      NTCREATEX_OPTIONS_DIRECTORY, 0);	torture_assert(tctx, dnum2 != -1,		       talloc_asprintf(tctx, "open of %s failed: %s!", 				       dname, smbcli_errstr(cli1->tree)));	torture_assert_ntstatus_ok(		tctx, smbcli_nt_delete_on_close(cli1->tree, dnum1, true), 		talloc_asprintf(tctx, "setting delete_on_close failed (%s)", 				smbcli_errstr(cli1->tree)));	smbcli_close(cli1->tree, dnum1);	dnum1 = smbcli_nt_create_full(cli1->tree, dname, 0,				      SEC_FILE_READ_DATA|				      SEC_FILE_WRITE_DATA|				      SEC_STD_DELETE,				      FILE_ATTRIBUTE_DIRECTORY, 				      NTCREATEX_SHARE_ACCESS_READ|				      NTCREATEX_SHARE_ACCESS_WRITE|				      NTCREATEX_SHARE_ACCESS_DELETE,				      NTCREATEX_DISP_OPEN, 				      NTCREATEX_OPTIONS_DIRECTORY, 0);	torture_assert(tctx, dnum1 == -1,		       talloc_asprintf(tctx, "open of %s succeeded!\n",				       dname));	CHECK_STATUS(cli1, NT_STATUS_DELETE_PENDING);	return correct;}/*  Test delete on close semantics. */struct torture_suite *torture_test_delete(void){	struct torture_suite *suite = torture_suite_create(		talloc_autofree_context(),		"DELETE");	torture_suite_add_2smb_test(suite, "deltest1", deltest1);	torture_suite_add_2smb_test(suite, "deltest2", deltest2);	torture_suite_add_2smb_test(suite, "deltest3", deltest3);	torture_suite_add_2smb_test(suite, "deltest4", deltest4);	torture_suite_add_2smb_test(suite, "deltest5", deltest5);	torture_suite_add_2smb_test(suite, "deltest6", deltest6);	torture_suite_add_2smb_test(suite, "deltest7", deltest7);	torture_suite_add_2smb_test(suite, "deltest8", deltest8);	torture_suite_add_2smb_test(suite, "deltest9", deltest9);	torture_suite_add_2smb_test(suite, "deltest10", deltest10);	torture_suite_add_2smb_test(suite, "deltest11", deltest11);	torture_suite_add_2smb_test(suite, "deltest12", deltest12);	torture_suite_add_2smb_test(suite, "deltest13", deltest13);	torture_suite_add_2smb_test(suite, "deltest14", deltest14);	torture_suite_add_2smb_test(suite, "deltest15", deltest15);	torture_suite_add_2smb_test(suite, "deltest16", deltest16);	torture_suite_add_2smb_test(suite, "deltest17", deltest17);	torture_suite_add_2smb_test(suite, "deltest18", deltest18);	torture_suite_add_2smb_test(suite, "deltest19", deltest19);	torture_suite_add_2smb_test(suite, "deltest20", deltest20);	torture_suite_add_2smb_test(suite, "deltest20a", deltest20a);	torture_suite_add_2smb_test(suite, "deltest20b", deltest20b);	torture_suite_add_simple_test(suite, "deltest21", deltest21);	torture_suite_add_simple_test(suite, "deltest22", deltest22);	return suite;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -