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

📄 torture.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	printf("Passed readwritetest v1: %s\n", BOOLSTR(test1));	if (test1) {		test2 = rw_torture2(cli1, cli1);		printf("Passed readwritetest v2: %s\n", BOOLSTR(test2));	}	if (!torture_close_connection(cli1)) {		test1 = False;	}	if (!torture_close_connection(cli2)) {		test2 = False;	}	return (test1 && test2);}static BOOL run_readwritemulti(int dummy){	struct cli_state *cli;	BOOL test;	cli = current_cli;	cli_sockopt(cli, sockops);	printf("run_readwritemulti: fname %s\n", randomfname);	test = rw_torture3(cli, randomfname);	if (!torture_close_connection(cli)) {		test = False;	}		return test;}static BOOL run_readwritelarge(int dummy){	static struct cli_state *cli1;	int fnum1;	const char *lockfname = "\\large.dat";	SMB_OFF_T fsize;	char buf[126*1024];	BOOL correct = True; 	if (!torture_open_connection(&cli1)) {		return False;	}	cli_sockopt(cli1, sockops);	memset(buf,'\0',sizeof(buf));		cli1->max_xmit = 128*1024;		printf("starting readwritelarge\n"); 	cli_unlink(cli1, lockfname);	fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);	if (fnum1 == -1) {		printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));		return False;	}   	cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf));	if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {		printf("qfileinfo failed (%s)\n", cli_errstr(cli1));		correct = False;	}	if (fsize == sizeof(buf))		printf("readwritelarge test 1 succeeded (size = %lx)\n", 		       (unsigned long)fsize);	else {		printf("readwritelarge test 1 failed (size = %lx)\n", 		       (unsigned long)fsize);		correct = False;	}	if (!cli_close(cli1, fnum1)) {		printf("close failed (%s)\n", cli_errstr(cli1));		correct = False;	}	if (!cli_unlink(cli1, lockfname)) {		printf("unlink failed (%s)\n", cli_errstr(cli1));		correct = False;	}	fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE);	if (fnum1 == -1) {		printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1));		return False;	}		cli1->max_xmit = 4*1024;		cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf));		if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {		printf("qfileinfo failed (%s)\n", cli_errstr(cli1));		correct = False;	}	if (fsize == sizeof(buf))		printf("readwritelarge test 2 succeeded (size = %lx)\n", 		       (unsigned long)fsize);	else {		printf("readwritelarge test 2 failed (size = %lx)\n", 		       (unsigned long)fsize);		correct = False;	}#if 0	/* ToDo - set allocation. JRA */	if(!cli_set_allocation_size(cli1, fnum1, 0)) {		printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));		return False;	}	if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {		printf("qfileinfo failed (%s)\n", cli_errstr(cli1));		correct = False;	}	if (fsize != 0)		printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);#endif	if (!cli_close(cli1, fnum1)) {		printf("close failed (%s)\n", cli_errstr(cli1));		correct = False;	}		if (!torture_close_connection(cli1)) {		correct = False;	}	return correct;}int line_count = 0;int nbio_id;#define ival(s) strtol(s, NULL, 0)/* run a test that simulates an approximate netbench client load */static BOOL run_netbench(int client){	struct cli_state *cli;	int i;	pstring line;	char cname[20];	FILE *f;	const char *params[20];	BOOL correct = True;	cli = current_cli;	nbio_id = client;	cli_sockopt(cli, sockops);	nb_setup(cli);	slprintf(cname,sizeof(cname)-1, "client%d", client);	f = fopen(client_txt, "r");	if (!f) {		perror(client_txt);		return False;	}	while (fgets(line, sizeof(line)-1, f)) {		line_count++;		line[strlen(line)-1] = 0;		/* printf("[%d] %s\n", line_count, line); */		all_string_sub(line,"client1", cname, sizeof(line));				/* parse the command parameters */		params[0] = strtok(line," ");		i = 0;		while (params[i]) params[++i] = strtok(NULL," ");		params[i] = "";		if (i < 2) continue;		if (!strncmp(params[0],"SMB", 3)) {			printf("ERROR: You are using a dbench 1 load file\n");			exit(1);		}		if (!strcmp(params[0],"NTCreateX")) {			nb_createx(params[1], ival(params[2]), ival(params[3]), 				   ival(params[4]));		} else if (!strcmp(params[0],"Close")) {			nb_close(ival(params[1]));		} else if (!strcmp(params[0],"Rename")) {			nb_rename(params[1], params[2]);		} else if (!strcmp(params[0],"Unlink")) {			nb_unlink(params[1]);		} else if (!strcmp(params[0],"Deltree")) {			nb_deltree(params[1]);		} else if (!strcmp(params[0],"Rmdir")) {			nb_rmdir(params[1]);		} else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {			nb_qpathinfo(params[1]);		} else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {			nb_qfileinfo(ival(params[1]));		} else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {			nb_qfsinfo(ival(params[1]));		} else if (!strcmp(params[0],"FIND_FIRST")) {			nb_findfirst(params[1]);		} else if (!strcmp(params[0],"WriteX")) {			nb_writex(ival(params[1]), 				  ival(params[2]), ival(params[3]), ival(params[4]));		} else if (!strcmp(params[0],"ReadX")) {			nb_readx(ival(params[1]), 				  ival(params[2]), ival(params[3]), ival(params[4]));		} else if (!strcmp(params[0],"Flush")) {			nb_flush(ival(params[1]));		} else {			printf("Unknown operation %s\n", params[0]);			exit(1);		}	}	fclose(f);	nb_cleanup();	if (!torture_close_connection(cli)) {		correct = False;	}		return correct;}/* run a test that simulates an approximate netbench client load */static BOOL run_nbench(int dummy){	double t;	BOOL correct = True;	nbio_shmem(nprocs);	nbio_id = -1;	signal(SIGALRM, nb_alarm);	alarm(1);	t = create_procs(run_netbench, &correct);	alarm(0);	printf("\nThroughput %g MB/sec\n", 	       1.0e-6 * nbio_total() / t);	return correct;}/*  This test checks for two things:  1) correct support for retaining locks over a close (ie. the server     must not use posix semantics)  2) support for lock timeouts */static BOOL run_locktest1(int dummy){	struct cli_state *cli1, *cli2;	const char *fname = "\\lockt1.lck";	int fnum1, fnum2, fnum3;	time_t t1, t2;	unsigned lock_timeout;	if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {		return False;	}	cli_sockopt(cli1, sockops);	cli_sockopt(cli2, sockops);	printf("starting locktest1\n");	cli_unlink(cli1, fname);	fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);	if (fnum1 == -1) {		printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));		return False;	}	fnum2 = cli_open(cli1, fname, O_RDWR, DENY_NONE);	if (fnum2 == -1) {		printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli1));		return False;	}	fnum3 = cli_open(cli2, fname, O_RDWR, DENY_NONE);	if (fnum3 == -1) {		printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli2));		return False;	}	if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) {		printf("lock1 failed (%s)\n", cli_errstr(cli1));		return False;	}	if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {		printf("lock2 succeeded! This is a locking bug\n");		return False;	} else {		if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 				 NT_STATUS_LOCK_NOT_GRANTED)) return False;	}	lock_timeout = (1 + (random() % 20));	printf("Testing lock timeout with timeout=%u\n", lock_timeout);	t1 = time(NULL);	if (cli_lock(cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) {		printf("lock3 succeeded! This is a locking bug\n");		return False;	} else {		if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 				 NT_STATUS_FILE_LOCK_CONFLICT)) return False;	}	t2 = time(NULL);	if (ABS(t2 - t1) < lock_timeout-1) {		printf("error: This server appears not to support timed lock requests\n");	}	printf("server slept for %u seconds for a %u second timeout\n",	       (unsigned int)(t2-t1), lock_timeout);	if (!cli_close(cli1, fnum2)) {		printf("close1 failed (%s)\n", cli_errstr(cli1));		return False;	}	if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) {		printf("lock4 succeeded! This is a locking bug\n");		return False;	} else {		if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, 				 NT_STATUS_FILE_LOCK_CONFLICT)) return False;	}	if (!cli_close(cli1, fnum1)) {		printf("close2 failed (%s)\n", cli_errstr(cli1));		return False;	}	if (!cli_close(cli2, fnum3)) {		printf("close3 failed (%s)\n", cli_errstr(cli2));		return False;	}	if (!cli_unlink(cli1, fname)) {		printf("unlink failed (%s)\n", cli_errstr(cli1));		return False;	}	if (!torture_close_connection(cli1)) {		return False;	}	if (!torture_close_connection(cli2)) {		return False;	}	printf("Passed locktest1\n");	return True;}/*  this checks to see if a secondary tconx can use open files from an  earlier tconx */static BOOL run_tcon_test(int dummy){	static struct cli_state *cli;	const char *fname = "\\tcontest.tmp";	int fnum1;	uint16 cnum1, cnum2, cnum3;	uint16 vuid1, vuid2;	char buf[4];	BOOL ret = True;	if (!torture_open_connection(&cli)) {		return False;	}	cli_sockopt(cli, sockops);	printf("starting tcontest\n");	cli_unlink(cli, fname);	fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);	if (fnum1 == -1) {		printf("open of %s failed (%s)\n", fname, cli_errstr(cli));		return False;	}	cnum1 = cli->cnum;	vuid1 = cli->vuid;	if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) {		printf("initial write failed (%s)", cli_errstr(cli));		return False;	}	if (!cli_send_tconX(cli, share, "?????",			    password, strlen(password)+1)) {		printf("%s refused 2nd tree connect (%s)\n", host,		           cli_errstr(cli));		cli_shutdown(cli);		return False;	}	cnum2 = cli->cnum;	cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */	vuid2 = cli->vuid + 1;	/* try a write with the wrong tid */	cli->cnum = cnum2;	if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {		printf("* server allows write with wrong TID\n");		ret = False;	} else {		printf("server fails write with wrong TID : %s\n", cli_errstr(cli));	}	/* try a write with an invalid tid */	cli->cnum = cnum3;	if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {		printf("* server allows write with invalid TID\n");		ret = False;	} else {		printf("server fails write with invalid TID : %s\n", cli_errstr(cli));	}	/* try a write with an invalid vuid */	cli->vuid = vuid2;	cli->cnum = cnum1;	if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {		printf("* server allows write with invalid VUID\n");		ret = False;	} else {		printf("server fails write with invalid VUID : %s\n", cli_errstr(cli));	}	cli->cnum = cnum1;	cli->vuid = vuid1;	if (!cli_close(cli, fnum1)) {		printf("close failed (%s)\n", cli_errstr(cli));		return False;	}	cli->cnum = cnum2;	if (!cli_tdis(cli)) {		printf("secondary tdis failed (%s)\n", cli_errstr(cli));		return False;	}	cli->cnum = cnum1;	if (!torture_close_connection(cli)) {		return False;	}	return ret;}/* checks for old style tcon support */static BOOL run_tcon2_test(int dummy){	static struct cli_state *cli;	uint16 cnum, max_xmit;	char *service;	NTSTATUS status;	if (!torture_open_connection(&cli)) {		return False;	}	cli_sockopt(cli, sockops);	printf("starting tcon2 test\n");	asprintf(&service, "\\\\%s\\%s", host, share);	status = cli_raw_tcon(cli, service, password, "?????", &max_xmit, &cnum);	if (!NT_STATUS_IS_OK(status)) {		printf("tcon2 failed : %s\n", cli_errstr(cli));	} else {		printf("tcon OK : max_xmit=%d cnum=%d tid=%d\n", 		       (int)max_xmit, (int)cnum, SVAL(cli->inbuf, smb_tid));	}	if (!torture_close_connection(cli)) {		return False;	}	printf("Passed tcon2 test\n");	return True;}static BOOL tcon_devtest(struct cli_state *cli,			 const char *myshare, const char *devtype,			 const char *return_devtype,			 NTSTATUS expected_error){	BOOL status;	BOOL ret;	status = cli_send_tconX(cli, myshare, devtype,				password, strlen(password)+1);	if (NT_STATUS_IS_OK(expected_error)) {		if (status) {			if (strcmp(cli->dev, return_devtype) == 0) {				ret = True;			} else { 				printf("tconX to share %s with type %s "				       "succeeded but returned the wrong "				       "device type (got [%s] but should have got [%s])\n",				       myshare, devtype, cli->dev, return_devtype);				ret = False;			}		} else {			printf("tconX to share %s with type %s "			       "should have succeeded but failed\n",			       myshare, devtype);			ret = False;		}		cli_tdis(cli);	} else {		if (status) {

⌨️ 快捷键说明

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