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

📄 locktest.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			}		}		if (showall) {			printf("reopen conn=%u f=%u\n",			       conn, f);			show_locks();		}		break;	}	return True;}static void close_files(struct cli_state *cli[NSERVERS][NCONNECTIONS], 			int fnum[NSERVERS][NCONNECTIONS][NFILES]){	int server, conn, f; 	for (server=0;server<NSERVERS;server++)	for (conn=0;conn<NCONNECTIONS;conn++)	for (f=0;f<NFILES;f++) {		if (fnum[server][conn][f] != -1) {			cli_close(cli[server][conn], fnum[server][conn][f]);			fnum[server][conn][f] = -1;		}	}	for (server=0;server<NSERVERS;server++) {		cli_unlink(cli[server][0], FILENAME);	}}static void open_files(struct cli_state *cli[NSERVERS][NCONNECTIONS], 		       int fnum[NSERVERS][NCONNECTIONS][NFILES]){	int server, conn, f; 	for (server=0;server<NSERVERS;server++)	for (conn=0;conn<NCONNECTIONS;conn++)	for (f=0;f<NFILES;f++) {		fnum[server][conn][f] = cli_open(cli[server][conn], FILENAME,						 O_RDWR|O_CREAT,						 DENY_NONE);		if (fnum[server][conn][f] == -1) {			fprintf(stderr,"Failed to open fnum[%u][%u][%u]\n",				server, conn, f);			exit(1);		}	}}static int retest(struct cli_state *cli[NSERVERS][NCONNECTIONS], 		   int fnum[NSERVERS][NCONNECTIONS][NFILES],		   int n){	int i;	printf("testing %u ...\n", n);	for (i=0; i<n; i++) {		if (i && i % 100 == 0) {			printf("%u\n", i);		}		if (recorded[i].needed &&		    !test_one(cli, fnum, &recorded[i])) return i;	}	return n;}/* each server has two connections open to it. Each connection has two file   descriptors open on the file - 8 file descriptors in total    we then do random locking ops in tamdem on the 4 fnums from each   server and ensure that the results match */static void test_locks(char *share[NSERVERS]){	struct cli_state *cli[NSERVERS][NCONNECTIONS];	int fnum[NSERVERS][NCONNECTIONS][NFILES];	int n, i, n1, skip, r1, r2; 	ZERO_STRUCT(fnum);	ZERO_STRUCT(cli);	recorded = SMB_MALLOC_ARRAY(struct record, numops);	for (n=0; n<numops; n++) {#if PRESETS		if (n < sizeof(preset) / sizeof(preset[0])) {			recorded[n] = preset[n];		} else {#endif			recorded[n].conn = random() % NCONNECTIONS;			recorded[n].f = random() % NFILES;			recorded[n].start = lock_base + ((unsigned)random() % (lock_range-1));			recorded[n].len =  min_length +				random() % (lock_range-(recorded[n].start-lock_base));			recorded[n].start *= RANGE_MULTIPLE;			recorded[n].len *= RANGE_MULTIPLE;			r1 = random() % 100;			r2 = random() % 100;			if (r1 < READ_PCT) {				recorded[n].lock_type = READ_LOCK;			} else {				recorded[n].lock_type = WRITE_LOCK;			}			if (r2 < LOCK_PCT) {				recorded[n].lock_op = OP_LOCK;			} else if (r2 < UNLOCK_PCT) {				recorded[n].lock_op = OP_UNLOCK;			} else {				recorded[n].lock_op = OP_REOPEN;			}			recorded[n].needed = True;			if (!zero_zero && recorded[n].start==0 && recorded[n].len==0) {				recorded[n].len = 1;			}#if PRESETS		}#endif	}	reconnect(cli, fnum, share);	open_files(cli, fnum);	n = retest(cli, fnum, numops);	if (n == numops || !analyze) return;	n++;	skip = n/2;	while (1) {		n1 = n;		close_files(cli, fnum);		reconnect(cli, fnum, share);		open_files(cli, fnum);		for (i=0;i<n-skip;i+=skip) {			int m, j;			printf("excluding %d-%d\n", i, i+skip-1);			for (j=i;j<i+skip;j++) {				recorded[j].needed = False;			}			close_files(cli, fnum);			open_files(cli, fnum);			m = retest(cli, fnum, n);			if (m == n) {				for (j=i;j<i+skip;j++) {					recorded[j].needed = True;				}			} else {				if (i+(skip-1) < m) {					memmove(&recorded[i], &recorded[i+skip],						(m-(i+skip-1))*sizeof(recorded[0]));				}				n = m-(skip-1);				i--;			}		}		if (skip > 1) {			skip = skip/2;			printf("skip=%d\n", skip);			continue;		}		if (n1 == n) break;	}	close_files(cli, fnum);	reconnect(cli, fnum, share);	open_files(cli, fnum);	showall = True;	n1 = retest(cli, fnum, n);	if (n1 != n-1) {		printf("ERROR - inconsistent result (%u %u)\n", n1, n);	}	close_files(cli, fnum);	for (i=0;i<n;i++) {		printf("{%d, %d, %u, %u, %.0f, %.0f, %u},\n",		       recorded[i].lock_op,		       recorded[i].lock_type,		       recorded[i].conn,		       recorded[i].f,		       (double)recorded[i].start,		       (double)recorded[i].len,		       recorded[i].needed);	}	}static void usage(void){	printf("Usage:\n\  locktest //server1/share1 //server2/share2 [options..]\n\  options:\n\        -U user%%pass        (may be specified twice)\n\        -k               use kerberos\n\        -s seed\n\        -o numops\n\        -u          hide unlock fails\n\        -a          (show all ops)\n\        -A          analyse for minimal ops\n\        -O          use oplocks\n\        -E          enable exact error code checking\n\        -Z          enable the zero/zero lock\n\        -R range    set lock range\n\        -B base     set lock base\n\        -M min      set min lock length\n\");}/****************************************************************************  main program****************************************************************************/ int main(int argc,char *argv[]){	char *share[NSERVERS];	extern char *optarg;	extern int optind;	int opt;	char *p;	int seed, server;	setlinebuf(stdout);	dbf = x_stderr;	if (argc < 3 || argv[1][0] == '-') {		usage();		exit(1);	}	setup_logging(argv[0],True);	for (server=0;server<NSERVERS;server++) {		share[server] = argv[1+server];		all_string_sub(share[server],"/","\\",0);	}	argc -= NSERVERS;	argv += NSERVERS;	lp_load(dyn_CONFIGFILE,True,False,False);	load_interfaces();	if (getenv("USER")) {		fstrcpy(username[0],getenv("USER"));		fstrcpy(username[1],getenv("USER"));	}	seed = time(NULL);	while ((opt = getopt(argc, argv, "U:s:ho:aAW:OkR:B:M:EZ")) != EOF) {		switch (opt) {		case 'k':#ifdef HAVE_KRB5			use_kerberos = True;#else			d_printf("No kerberos support compiled in\n");			exit(1);#endif			break;		case 'U':			got_user = 1;			if (got_pass == 2) {				d_printf("Max of 2 usernames\n");				exit(1);			}			fstrcpy(username[got_pass],optarg);			p = strchr_m(username[got_pass],'%');			if (p) {				*p = 0;				fstrcpy(password[got_pass], p+1);				got_pass++;			}			break;		case 'R':			lock_range = strtol(optarg, NULL, 0);			break;		case 'B':			lock_base = strtol(optarg, NULL, 0);			break;		case 'M':			min_length = strtol(optarg, NULL, 0);			break;		case 's':			seed = atoi(optarg);			break;		case 'u':			hide_unlock_fails = True;			break;		case 'o':			numops = atoi(optarg);			break;		case 'O':			use_oplocks = True;			break;		case 'a':			showall = True;			break;		case 'A':			analyze = True;			break;		case 'Z':			zero_zero = True;			break;		case 'E':			exact_error_codes = True;			break;		case 'h':			usage();			exit(1);		default:			printf("Unknown option %c (%d)\n", (char)opt, opt);			exit(1);		}	}	if(use_kerberos && !got_user) got_pass = True;	argc -= optind;	argv += optind;	DEBUG(0,("seed=%u\n", seed));	srandom(seed);	test_locks(share);	return(0);}

⌨️ 快捷键说明

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