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

📄 open.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	CHECK_TIME(basetime, write_time);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* make sure file_attrs works */	io.mknew.in.attrib = FILE_ATTRIBUTE_HIDDEN;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.mknew.out.file.fnum;	CHECK_ALL_INFO(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_ARCHIVE, 		       attrib & ~FILE_ATTRIBUTE_NONINDEXED);	done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_CREATE*/static bool test_create(struct smbcli_state *cli, struct torture_context *tctx){	union smb_open io;	const char *fname = BASEDIR "\\torture_create.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_CREATE\n");	io.create.level = RAW_OPEN_CREATE;	io.create.in.attrib = 0;	io.create.in.write_time = 0;	io.create.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.create.out.file.fnum;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	smbcli_close(cli->tree, io.create.out.file.fnum);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* make sure write_time works */	io.create.in.write_time = basetime;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.create.out.file.fnum;	CHECK_TIME(basetime, write_time);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	/* make sure file_attrs works */	io.create.in.attrib = FILE_ATTRIBUTE_HIDDEN;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.create.out.file.fnum;	CHECK_ALL_INFO(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_ARCHIVE, 		       attrib & ~FILE_ATTRIBUTE_NONINDEXED);	done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_CTEMP*/static bool test_ctemp(struct smbcli_state *cli, TALLOC_CTX *tctx){	union smb_open io;	NTSTATUS status;	int fnum = -1;	bool ret = true;	time_t basetime = (time(NULL) + 3600*24*3) & ~1;	union smb_fileinfo finfo;	const char *name, *fname = NULL;	printf("Checking RAW_OPEN_CTEMP\n");	io.ctemp.level = RAW_OPEN_CTEMP;	io.ctemp.in.attrib = FILE_ATTRIBUTE_HIDDEN;	io.ctemp.in.write_time = basetime;	io.ctemp.in.directory = BASEDIR;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ctemp.out.file.fnum;	name = io.ctemp.out.name;	finfo.generic.level = RAW_FILEINFO_NAME_INFO;	finfo.generic.in.file.fnum = fnum;	status = smb_raw_fileinfo(cli->tree, tctx, &finfo);	CHECK_STATUS(status, NT_STATUS_OK);	fname = finfo.name_info.out.fname.s;	d_printf("ctemp name=%s  real name=%s\n", name, fname);done:	smbcli_close(cli->tree, fnum);	if (fname) {		smbcli_unlink(cli->tree, fname);	}	return ret;}/*  test chained RAW_OPEN_OPENX_READX*/static bool test_chained(struct smbcli_state *cli, TALLOC_CTX *tctx){	union smb_open io;	const char *fname = BASEDIR "\\torture_chained.txt";	NTSTATUS status;	int fnum = -1;	bool ret = true;	const char *buf = "test";	char buf2[4];	printf("Checking RAW_OPEN_OPENX chained with READX\n");	smbcli_unlink(cli->tree, fname);	fnum = create_complex_file(cli, tctx, fname);	smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf));	smbcli_close(cli->tree, fnum);		io.openxreadx.level = RAW_OPEN_OPENX_READX;	io.openxreadx.in.fname = fname;	io.openxreadx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO;	io.openxreadx.in.open_mode = OPENX_MODE_ACCESS_RDWR;	io.openxreadx.in.open_func = OPENX_OPEN_FUNC_OPEN;	io.openxreadx.in.search_attrs = 0;	io.openxreadx.in.file_attrs = 0;	io.openxreadx.in.write_time = 0;	io.openxreadx.in.size = 1024*1024;	io.openxreadx.in.timeout = 0;		io.openxreadx.in.offset = 0;	io.openxreadx.in.mincnt = sizeof(buf);	io.openxreadx.in.maxcnt = sizeof(buf);	io.openxreadx.in.remaining = 0;	io.openxreadx.out.data = (uint8_t *)buf2;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.openxreadx.out.file.fnum;	if (memcmp(buf, buf2, sizeof(buf)) != 0) {		d_printf("wrong data in reply buffer\n");		ret = false;	}done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/*  test RAW_OPEN_OPENX without a leading slash on the path.  NetApp filers are known to fail on this.  */static bool test_no_leading_slash(struct smbcli_state *cli, TALLOC_CTX *tctx){	union smb_open io;	const char *fname = BASEDIR "\\torture_no_leading_slash.txt";	NTSTATUS status;	int fnum = -1;	bool ret = true;	const char *buf = "test";	printf("Checking RAW_OPEN_OPENX without leading slash on path\n");	smbcli_unlink(cli->tree, fname);        /* Create the file */	fnum = create_complex_file(cli, tctx, fname);	smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf));	smbcli_close(cli->tree, fnum);	        /* Prepare to open the file using path without leading slash */	io.openx.level = RAW_OPEN_OPENX;	io.openx.in.fname = fname + 1;	io.openx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO;	io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR;	io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN;	io.openx.in.search_attrs = 0;	io.openx.in.file_attrs = 0;	io.openx.in.write_time = 0;	io.openx.in.size = 1024*1024;	io.openx.in.timeout = 0;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.openx.out.file.fnum;done:	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	return ret;}/* A little torture test to expose a race condition in Samba 3.0.20 ... :-) */static bool test_raw_open_multi(struct torture_context *tctx){	struct smbcli_state *cli;	TALLOC_CTX *mem_ctx = talloc_init("torture_test_oplock_multi");	const char *fname = "\\test_oplock.dat";	NTSTATUS status;	bool ret = true;	union smb_open io;	struct smbcli_state **clients;	struct smbcli_request **requests;	union smb_open *ios;	const char *host = torture_setting_string(tctx, "host", NULL);	const char *share = torture_setting_string(tctx, "share", NULL);	int i, num_files = 3;	int num_ok = 0;	int num_collision = 0;		clients = talloc_array(mem_ctx, struct smbcli_state *, num_files);	requests = talloc_array(mem_ctx, struct smbcli_request *, num_files);	ios = talloc_array(mem_ctx, union smb_open, num_files);	if ((tctx->ev == NULL) || (clients == NULL) || (requests == NULL) ||	    (ios == NULL)) {		DEBUG(0, ("talloc failed\n"));		return false;	}	if (!torture_open_connection_share(mem_ctx, &cli, tctx, host, share, tctx->ev)) {		return false;	}	cli->tree->session->transport->options.request_timeout = 60;	for (i=0; i<num_files; i++) {		if (!torture_open_connection_share(mem_ctx, &(clients[i]),						   tctx, host, share, tctx->ev)) {			DEBUG(0, ("Could not open %d'th connection\n", i));			return false;		}		clients[i]->tree->session->transport->options.request_timeout = 60;	}	/* cleanup */	smbcli_unlink(cli->tree, fname);	/*	  base ntcreatex parms	*/	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;	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|		NTCREATEX_SHARE_ACCESS_DELETE;	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.flags = 0;	for (i=0; i<num_files; i++) {		ios[i] = io;		requests[i] = smb_raw_open_send(clients[i]->tree, &ios[i]);		if (requests[i] == NULL) {			DEBUG(0, ("could not send %d'th request\n", i));			return false;		}	}	DEBUG(10, ("waiting for replies\n"));	while (1) {		bool unreplied = false;		for (i=0; i<num_files; i++) {			if (requests[i] == NULL) {				continue;			}			if (requests[i]->state < SMBCLI_REQUEST_DONE) {				unreplied = true;				break;			}			status = smb_raw_open_recv(requests[i], mem_ctx,						   &ios[i]);			DEBUG(0, ("File %d returned status %s\n", i,				  nt_errstr(status)));			if (NT_STATUS_IS_OK(status)) {				num_ok += 1;			} 			if (NT_STATUS_EQUAL(status,					    NT_STATUS_OBJECT_NAME_COLLISION)) {				num_collision += 1;			}			requests[i] = NULL;		}		if (!unreplied) {			break;		}		if (event_loop_once(tctx->ev) != 0) {			DEBUG(0, ("event_loop_once failed\n"));			return false;		}	}	if ((num_ok != 1) || (num_ok + num_collision != num_files)) {		ret = false;	}	for (i=0; i<num_files; i++) {		torture_close_connection(clients[i]);	}	talloc_free(mem_ctx);	return ret;}/* basic testing of all RAW_OPEN_* calls */bool torture_raw_open(struct torture_context *torture, struct smbcli_state *cli){	bool ret = true;	if (!torture_setup_dir(cli, BASEDIR)) {		return false;	}	ret &= test_ntcreatex_brlocked(cli, torture);	ret &= test_open(cli, torture);	ret &= test_raw_open_multi(torture);	ret &= test_openx(cli, torture);	ret &= test_ntcreatex(cli, torture);	ret &= test_nttrans_create(cli, torture);	ret &= test_t2open(cli, torture);	ret &= test_mknew(cli, torture);	ret &= test_create(cli, torture);	ret &= test_ctemp(cli, torture);	ret &= test_chained(cli, torture);	ret &= test_no_leading_slash(cli, torture);	smb_raw_exit(cli->session);	smbcli_deltree(cli->tree, BASEDIR);	return ret;}

⌨️ 快捷键说明

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