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

📄 smbtorture.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	.test_result = simple_test_result};static void subunit_init(struct torture_context *ctx) {	/* FIXME: register segv and bus handler */}static void subunit_suite_start(struct torture_context *ctx,				struct torture_suite *suite){}static void subunit_print_testname(struct torture_context *ctx, 				   struct torture_tcase *tcase,				   struct torture_test *test){	if (!strcmp(tcase->name, test->name)) {		printf("%s", test->name);	} else {		printf("%s.%s", tcase->name, test->name);	}}static void subunit_test_start(struct torture_context *ctx, 			       struct torture_tcase *tcase,			       struct torture_test *test){	printf("test: ");	subunit_print_testname(ctx, tcase, test);		printf("\n");}static void subunit_test_result(struct torture_context *context, 				enum torture_result res, const char *reason){	switch (res) {	case TORTURE_OK:		printf("success: ");		break;	case TORTURE_FAIL:		printf("failure: ");		break;	case TORTURE_ERROR:		printf("error: ");		break;	case TORTURE_SKIP:		printf("skip: ");		break;	}	subunit_print_testname(context, context->active_tcase, context->active_test);		if (reason)		printf(" [\n%s\n]", reason);	printf("\n");}static void subunit_comment(struct torture_context *test,			    const char *comment){	fprintf(stderr, "%s", comment);}static void subunit_warning(struct torture_context *test,			    const char *comment){	fprintf(stderr, "WARNING!: %s\n", comment);}const static struct torture_ui_ops subunit_ui_ops = {	.init = subunit_init,	.comment = subunit_comment,	.warning = subunit_warning,	.test_start = subunit_test_start,	.test_result = subunit_test_result,	.suite_start = subunit_suite_start};static void quiet_suite_start(struct torture_context *ctx,			      struct torture_suite *suite){	int i;	ctx->quiet = true;	for (i = 1; i < ctx->level; i++) putchar('\t');	printf("%s: ", suite->name);	fflush(stdout);}static void quiet_suite_finish(struct torture_context *ctx,			       struct torture_suite *suite){	putchar('\n');}static void quiet_test_result(struct torture_context *context, 			      enum torture_result res, const char *reason){	fflush(stdout);	switch (res) {	case TORTURE_OK: putchar('.'); break;	case TORTURE_FAIL: putchar('F'); break;	case TORTURE_ERROR: putchar('E'); break;	case TORTURE_SKIP: putchar('I'); break;	}}const static struct torture_ui_ops quiet_ui_ops = {	.suite_start = quiet_suite_start,	.suite_finish = quiet_suite_finish,	.test_result = quiet_test_result};void run_shell(struct torture_context *tctx){	char *cline;	int argc;	const char **argv;	int ret;	while (1) {		cline = smb_readline("torture> ", NULL, NULL);		if (cline == NULL)			return;			ret = poptParseArgvString(cline, &argc, &argv);		if (ret != 0) {			fprintf(stderr, "Error parsing line\n");			continue;		}		if (!strcmp(argv[0], "quit")) {			return;		} else if (!strcmp(argv[0], "set")) {			if (argc < 3) {				fprintf(stderr, "Usage: set <variable> <value>\n");			} else {				char *name = talloc_asprintf(NULL, "torture:%s", argv[1]);				lp_set_cmdline(tctx->lp_ctx, name, argv[2]);				talloc_free(name);			}		} else if (!strcmp(argv[0], "help")) {			fprintf(stderr, "Available commands:\n"							" help - This help command\n"							" run - Run test\n"							" set - Change variables\n"							"\n");		} else if (!strcmp(argv[0], "run")) {			if (argc < 2) {				fprintf(stderr, "Usage: run TEST-NAME [OPTIONS...]\n");			} else {				run_test(tctx, argv[1]);			}		}		free(cline);	}}/****************************************************************************  main program****************************************************************************/int main(int argc,char *argv[]){	int opt, i;	bool correct = true;	int max_runtime=0;	int argc_new;	struct torture_context *torture;	const struct torture_ui_ops *ui_ops;	char **argv_new;	poptContext pc;	static const char *target = "other";	NTSTATUS status;	int shell = false;	static const char *ui_ops_name = "simple";	const char *basedir = NULL;	const char *extra_module = NULL;	static int list_tests = 0;	enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS, OPT_LIST,	      OPT_DANGEROUS,OPT_SMB_PORTS,OPT_ASYNC,OPT_NUMPROGS};		struct poptOption long_options[] = {		POPT_AUTOHELP		{"format", 0, POPT_ARG_STRING, &ui_ops_name, 0, "Output format (one of: simple, subunit)", NULL },		{"smb-ports",	'p', POPT_ARG_STRING, NULL,     OPT_SMB_PORTS,	"SMB ports", 	NULL},		{"basedir",	  0, POPT_ARG_STRING, &basedir, 0, "base directory", "BASEDIR" },		{"seed",	  0, POPT_ARG_INT,  &torture_seed, 	0,	"Seed to use for randomizer", 	NULL},		{"num-progs",	  0, POPT_ARG_INT,  NULL, 	OPT_NUMPROGS,	"num progs",	NULL},		{"num-ops",	  0, POPT_ARG_INT,  &torture_numops, 	0, 	"num ops",	NULL},		{"entries",	  0, POPT_ARG_INT,  &torture_entries, 	0,	"entries",	NULL},		{"loadfile",	  0, POPT_ARG_STRING,	NULL, 	OPT_LOADFILE,	"NBench load file to use", 	NULL},		{"list", 	  0, POPT_ARG_NONE, &list_tests, 0, "List available tests and exit", NULL },		{"unclist",	  0, POPT_ARG_STRING,	NULL, 	OPT_UNCLIST,	"unclist", 	NULL},		{"timelimit",	't', POPT_ARG_INT,	NULL, 	OPT_TIMELIMIT,	"Set time limit (in seconds)", 	NULL},		{"failures",	'f', POPT_ARG_INT,  &torture_failures, 	0,	"failures", 	NULL},		{"parse-dns",	'D', POPT_ARG_STRING,	NULL, 	OPT_DNS,	"parse-dns", 	NULL},		{"dangerous",	'X', POPT_ARG_NONE,	NULL,   OPT_DANGEROUS,		 "run dangerous tests (eg. wiping out password database)", NULL},		{"load-module",  0,  POPT_ARG_STRING, &extra_module,     0, "load tests from DSO file",    "SOFILE"},		{"shell", 		0, POPT_ARG_NONE, &shell, true, "Run shell", NULL},		{"target", 		'T', POPT_ARG_STRING, &target, 0, "samba3|samba4|other", NULL},		{"async",       'a', POPT_ARG_NONE,     NULL,   OPT_ASYNC,		 "run async tests", NULL},		{"num-async",    0, POPT_ARG_INT,  &torture_numasync,  0,		 "number of simultaneous async requests", NULL},		{"maximum-runtime", 0, POPT_ARG_INT, &max_runtime, 0, 		 "set maximum time for smbtorture to live", "seconds"},		POPT_COMMON_SAMBA		POPT_COMMON_CONNECTION		POPT_COMMON_CREDENTIALS		POPT_COMMON_VERSION		{ NULL }	};	setlinebuf(stdout);	/* we are never interested in SIGPIPE */	BlockSignals(true, SIGPIPE);	pc = poptGetContext("smbtorture", argc, (const char **) argv, long_options, 			    POPT_CONTEXT_KEEP_FIRST);	poptSetOtherOptionHelp(pc, "<binding>|<unc> TEST1 TEST2 ...");	while((opt = poptGetNextOpt(pc)) != -1) {		switch (opt) {		case OPT_LOADFILE:			lp_set_cmdline(cmdline_lp_ctx, "torture:loadfile", poptGetOptArg(pc));			break;		case OPT_UNCLIST:			lp_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc));			break;		case OPT_TIMELIMIT:			lp_set_cmdline(cmdline_lp_ctx, "torture:timelimit", poptGetOptArg(pc));			break;		case OPT_NUMPROGS:			lp_set_cmdline(cmdline_lp_ctx, "torture:nprocs", poptGetOptArg(pc));			break;		case OPT_DNS:			parse_dns(cmdline_lp_ctx, poptGetOptArg(pc));			break;		case OPT_DANGEROUS:			lp_set_cmdline(cmdline_lp_ctx, "torture:dangerous", "Yes");			break;		case OPT_ASYNC:			lp_set_cmdline(cmdline_lp_ctx, "torture:async", "Yes");			break;		case OPT_SMB_PORTS:			lp_set_cmdline(cmdline_lp_ctx, "smb ports", poptGetOptArg(pc));			break;		}	}	if (strcmp(target, "samba3") == 0) {		lp_set_cmdline(cmdline_lp_ctx, "torture:samba3", "true");	} else if (strcmp(target, "samba4") == 0) {		lp_set_cmdline(cmdline_lp_ctx, "torture:samba4", "true");	}	if (max_runtime) {		/* this will only work if nobody else uses alarm(),		   which means it won't work for some tests, but we		   can't use the event context method we use for smbd		   as so many tests create their own event		   context. This will at least catch most cases. */		signal(SIGALRM, max_runtime_handler);		alarm(max_runtime);	}	if (extra_module != NULL) {	    init_module_fn fn = load_module(talloc_autofree_context(), poptGetOptArg(pc));	    if (fn == NULL) 		d_printf("Unable to load module from %s\n", poptGetOptArg(pc));	    else {		status = fn();		if (NT_STATUS_IS_ERR(status)) {		    d_printf("Error initializing module %s: %s\n", 			     poptGetOptArg(pc), nt_errstr(status));		}	    }	} else { 		torture_init();	}	if (list_tests) {		print_test_list();		return 0;	}	if (torture_seed == 0) {		torture_seed = time(NULL);	} 	printf("Using seed %d\n", torture_seed);	srandom(torture_seed);	argv_new = discard_const_p(char *, poptGetArgs(pc));	argc_new = argc;	for (i=0; i<argc; i++) {		if (argv_new[i] == NULL) {			argc_new = i;			break;		}	}	if (!(argc_new >= 3 || (shell && argc_new >= 2))) {		usage(pc);		exit(1);	}	if (!parse_target(cmdline_lp_ctx, argv_new[1])) {		usage(pc);		exit(1);	}	if (!strcmp(ui_ops_name, "simple")) {		ui_ops = &std_ui_ops;	} else if (!strcmp(ui_ops_name, "subunit")) {		ui_ops = &subunit_ui_ops;	} else if (!strcmp(ui_ops_name, "quiet")) {		ui_ops = &quiet_ui_ops;	} else {		printf("Unknown output format '%s'\n", ui_ops_name);		exit(1);	}	torture = torture_context_init(event_context_init(NULL), ui_ops);	if (basedir != NULL) {		if (basedir[0] != '/') {			fprintf(stderr, "Please specify an absolute path to --basedir\n");			return 1;		}		torture->outputdir = basedir;	} else {		char *pwd = talloc_size(torture, PATH_MAX);		if (!getcwd(pwd, PATH_MAX)) {			fprintf(stderr, "Unable to determine current working directory\n");			return 1;		}		torture->outputdir = pwd;	}	torture->lp_ctx = cmdline_lp_ctx;	if (argc_new == 0) {		printf("You must specify a test to run, or 'ALL'\n");	} else if (shell) {		run_shell(torture);	} else {		for (i=2;i<argc_new;i++) {			if (!run_test(torture, argv_new[i])) {				correct = false;			}		}	}	if (torture->returncode && correct) {		return(0);	} else {		return(1);	}}

⌨️ 快捷键说明

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