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

📄 open.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	/* check fields when the file already existed */	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	fnum = create_complex_file(cli, tctx, fname);	if (fnum == -1) {		ret = false;		goto done;	}	smbcli_close(cli->tree, fnum);	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	CHECK_VAL(io.ntcreatex.out.oplock_level, 0);	CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_EXISTED);	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* create a directory */	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.fname = dname;	fname = dname;	smbcli_rmdir(cli->tree, fname);	smbcli_unlink(cli->tree, fname);	io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	CHECK_VAL(io.ntcreatex.out.oplock_level, 0);	CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED);	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_VAL(io.ntcreatex.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, 		  FILE_ATTRIBUTE_DIRECTORY);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.is_directory, 1);	CHECK_VAL(io.ntcreatex.out.size, 0);	CHECK_VAL(io.ntcreatex.out.alloc_size, 0);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	smbcli_unlink(cli->tree, fname);	done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_NTTRANS_CREATE*/static bool test_nttrans_create(struct smbcli_state *cli, struct torture_context *tctx){	union smb_open io;	union smb_fileinfo finfo;	const char *fname = BASEDIR "\\torture_ntcreatex.txt";	const char *dname = BASEDIR "\\torture_ntcreatex.dir";	NTSTATUS status;	int fnum = -1;	bool ret = true;	int i;	struct {		uint32_t open_disp;		bool with_file;		NTSTATUS correct_status;	} open_funcs[] = {		{ NTCREATEX_DISP_SUPERSEDE, 	true,  NT_STATUS_OK },		{ NTCREATEX_DISP_SUPERSEDE, 	false, NT_STATUS_OK },		{ NTCREATEX_DISP_OPEN, 	        true,  NT_STATUS_OK },		{ NTCREATEX_DISP_OPEN, 	        false, NT_STATUS_OBJECT_NAME_NOT_FOUND },		{ NTCREATEX_DISP_CREATE, 	true,  NT_STATUS_OBJECT_NAME_COLLISION },		{ NTCREATEX_DISP_CREATE, 	false, NT_STATUS_OK },		{ NTCREATEX_DISP_OPEN_IF, 	true,  NT_STATUS_OK },		{ NTCREATEX_DISP_OPEN_IF, 	false, NT_STATUS_OK },		{ NTCREATEX_DISP_OVERWRITE, 	true,  NT_STATUS_OK },		{ NTCREATEX_DISP_OVERWRITE, 	false, NT_STATUS_OBJECT_NAME_NOT_FOUND },		{ NTCREATEX_DISP_OVERWRITE_IF, 	true,  NT_STATUS_OK },		{ NTCREATEX_DISP_OVERWRITE_IF, 	false, NT_STATUS_OK },		{ 6, 			        true,  NT_STATUS_INVALID_PARAMETER },		{ 6, 	                        false, NT_STATUS_INVALID_PARAMETER },	};	printf("Checking RAW_OPEN_NTTRANS_CREATE\n");	/* reasonable default parameters */	io.generic.level = RAW_OPEN_NTTRANS_CREATE;	io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	io.ntcreatex.in.alloc_size = 1024*1024;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.fname = fname;	io.ntcreatex.in.sec_desc = NULL;	io.ntcreatex.in.ea_list = NULL;	/* test the open disposition */	for (i=0; i<ARRAY_SIZE(open_funcs); i++) {		if (open_funcs[i].with_file) {			fnum = smbcli_open(cli->tree, fname, O_CREAT|O_RDWR|O_TRUNC, DENY_NONE);			if (fnum == -1) {				d_printf("Failed to create file %s - %s\n", fname, smbcli_errstr(cli->tree));				ret = false;				goto done;			}			smbcli_close(cli->tree, fnum);		}		io.ntcreatex.in.open_disposition = open_funcs[i].open_disp;		status = smb_raw_open(cli->tree, tctx, &io);		if (!NT_STATUS_EQUAL(status, open_funcs[i].correct_status)) {			printf("(%s) incorrect status %s should be %s (i=%d with_file=%d open_disp=%d)\n", 			       __location__, nt_errstr(status), nt_errstr(open_funcs[i].correct_status),			       i, (int)open_funcs[i].with_file, (int)open_funcs[i].open_disp);			ret = false;		}		if (NT_STATUS_IS_OK(status) || open_funcs[i].with_file) {			smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);			smbcli_unlink(cli->tree, fname);		}	}	/* basic field testing */	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	CHECK_VAL(io.ntcreatex.out.oplock_level, 0);	CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED);	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	/* check fields when the file already existed */	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	fnum = create_complex_file(cli, tctx, fname);	if (fnum == -1) {		ret = false;		goto done;	}	smbcli_close(cli->tree, fnum);	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	CHECK_VAL(io.ntcreatex.out.oplock_level, 0);	CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_EXISTED);	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* create a directory */	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.fname = dname;	fname = dname;	smbcli_rmdir(cli->tree, fname);	smbcli_unlink(cli->tree, fname);	io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	CHECK_VAL(io.ntcreatex.out.oplock_level, 0);	CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED);	CHECK_NTTIME(io.ntcreatex.out.create_time, create_time);	CHECK_NTTIME(io.ntcreatex.out.access_time, access_time);	CHECK_NTTIME(io.ntcreatex.out.write_time, write_time);	CHECK_NTTIME(io.ntcreatex.out.change_time, change_time);	CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib);	CHECK_VAL(io.ntcreatex.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, 		  FILE_ATTRIBUTE_DIRECTORY);	CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size);	CHECK_ALL_INFO(io.ntcreatex.out.size, size);	CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory);	CHECK_VAL(io.ntcreatex.out.is_directory, 1);	CHECK_VAL(io.ntcreatex.out.size, 0);	CHECK_VAL(io.ntcreatex.out.alloc_size, 0);	CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK);	smbcli_unlink(cli->tree, fname);	done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_NTCREATEX with an already opened and byte range locked file  I've got an application that does a similar sequence of ntcreate&x,  locking&x and another ntcreate&x with  open_disposition==NTCREATEX_DISP_OVERWRITE_IF. Windows 2003 allows the  second open.*/static bool test_ntcreatex_brlocked(struct smbcli_state *cli, struct torture_context *tctx){	union smb_open io, io1;	union smb_lock io2;	struct smb_lock_entry lock[1];	const char *fname = BASEDIR "\\torture_ntcreatex.txt";	NTSTATUS status;	bool ret = true;	printf("Testing ntcreatex with a byte range locked file\n");	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.access_mask = 0x2019f;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ |		NTCREATEX_SHARE_ACCESS_WRITE;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;	io.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC |		NTCREATEX_SECURITY_ALL;	io.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	io2.lockx.level = RAW_LOCK_LOCKX;	io2.lockx.in.file.fnum = io.ntcreatex.out.file.fnum;	io2.lockx.in.mode = LOCKING_ANDX_LARGE_FILES;	io2.lockx.in.timeout = 0;	io2.lockx.in.ulock_cnt = 0;	io2.lockx.in.lock_cnt = 1;	lock[0].pid = cli->session->pid;	lock[0].offset = 0;	lock[0].count = 0x1;	io2.lockx.in.locks = &lock[0];	status = smb_raw_lock(cli->tree, &io2);	CHECK_STATUS(status, NT_STATUS_OK);	io1.generic.level = RAW_OPEN_NTCREATEX;	io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;	io1.ntcreatex.in.root_fid = 0;	io1.ntcreatex.in.access_mask = 0x20196;	io1.ntcreatex.in.alloc_size = 0;	io1.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io1.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ |		NTCREATEX_SHARE_ACCESS_WRITE;	io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF;	io1.ntcreatex.in.create_options = 0;	io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;	io1.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC |		NTCREATEX_SECURITY_ALL;	io1.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io1);	CHECK_STATUS(status, NT_STATUS_OK); done:	smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);	smbcli_close(cli->tree, io1.ntcreatex.out.file.fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_MKNEW*/static bool test_mknew(struct smbcli_state *cli, struct torture_context *tctx){	union smb_open io;	const char *fname = BASEDIR "\\torture_mknew.txt";	NTSTATUS status;	int fnum = -1;	bool ret = true;	time_t basetime = (time(NULL) + 3600*24*3) & ~1;	union smb_fileinfo finfo;	printf("Checking RAW_OPEN_MKNEW\n");	io.mknew.level = RAW_OPEN_MKNEW;	io.mknew.in.attrib = 0;	io.mknew.in.write_time = 0;	io.mknew.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.mknew.out.file.fnum;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* make sure write_time works */	io.mknew.in.write_time = basetime;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.mknew.out.file.fnum;

⌨️ 快捷键说明

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