From 9f697903556529bb4fedd73d027c317e56f6bf21 Mon Sep 17 00:00:00 2001 From: James Peach Date: Fri, 19 Mar 2010 21:24:15 -0700 Subject: smbtorture: Move interactive shell into a separate file. --- source4/torture/config.mk | 5 ++- source4/torture/shell.c | 79 +++++++++++++++++++++++++++++++++++++++++++ source4/torture/smbtorture.c | 77 ++++++++++------------------------------- source4/torture/smbtorture.h | 5 +++ source4/torture/wscript_build | 2 +- 5 files changed, 107 insertions(+), 61 deletions(-) create mode 100644 source4/torture/shell.c (limited to 'source4/torture') diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 25e9b5377b..09af078d80 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -280,7 +280,10 @@ PRIVATE_DEPENDENCIES = \ # End BINARY smbtorture ################################# -smbtorture_OBJ_FILES = $(torturesrcdir)/smbtorture.o $(torturesrcdir)/torture.o +smbtorture_OBJ_FILES = \ + $(torturesrcdir)/smbtorture.o \ + $(torturesrcdir)/torture.o \ + $(torturesrcdir)/shell.o PUBLIC_HEADERS += $(torturesrcdir)/smbtorture.h MANPAGES += $(torturesrcdir)/man/smbtorture.1 diff --git a/source4/torture/shell.c b/source4/torture/shell.c new file mode 100644 index 0000000000..1da4c59081 --- /dev/null +++ b/source4/torture/shell.c @@ -0,0 +1,79 @@ +/* + Unix SMB/CIFS implementation. + SMB torture tester + Copyright (C) Andrew Tridgell 1997-2003 + Copyright (C) Jelmer Vernooij 2006-2008 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "system/readline.h" +#include "lib/smbreadline/smbreadline.h" +#include "torture/smbtorture.h" + +void torture_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; + +#if HAVE_ADD_HISTORY + add_history(cline); +#endif + + 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], "list")) { + torture_print_tests(true); + } else if (!strcmp(argv[0], "set")) { + if (argc < 3) { + lp_dump(tctx->lp_ctx, stdout, + false /* show_defaults */, + 0 /* skip services */); + } 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" + " list - List the available\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 { + torture_run_named_tests(tctx, argv[1]); + } + } + free(cline); + } +} diff --git a/source4/torture/smbtorture.c b/source4/torture/smbtorture.c index 96014a2206..b7140d70a5 100644 --- a/source4/torture/smbtorture.c +++ b/source4/torture/smbtorture.c @@ -40,7 +40,7 @@ static bool run_matching(struct torture_context *torture, const char *prefix, const char *expr, - char **restricted, + const char **restricted, struct torture_suite *suite, bool *matched) { @@ -94,8 +94,8 @@ static bool run_matching(struct torture_context *torture, /**************************************************************************** run a specified test or "ALL" ****************************************************************************/ -static bool run_test(struct torture_context *torture, const char *name, - char **restricted) +bool torture_run_named_tests(struct torture_context *torture, const char *name, + const char **restricted) { bool ret = true; bool matched = false; @@ -249,6 +249,15 @@ static void print_test_list(void) } } +void torture_print_tests(bool structured) +{ + if (structured) { + print_structured_test_list(); + } else { + print_test_list(); + } +} + _NORETURN_ static void usage(poptContext pc) { poptPrintUsage(pc, stdout, 0); @@ -377,61 +386,6 @@ const static struct torture_ui_ops std_ui_ops = { .progress = simple_progress, }; -static 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; - -#if HAVE_ADD_HISTORY - add_history(cline); -#endif - - 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], "list")) { - print_structured_test_list(); - } else if (!strcmp(argv[0], "set")) { - if (argc < 3) { - lp_dump(tctx->lp_ctx, stdout, - false /* show_defaults */, - 0 /* skip services */); - } 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" - " list - List the available\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 ****************************************************************************/ @@ -448,6 +402,7 @@ int main(int argc,char *argv[]) poptContext pc; static const char *target = "other"; NTSTATUS status; + int shell = false; static const char *ui_ops_name = "subunit"; const char *basedir = NULL; const char *extra_module = NULL; @@ -477,6 +432,7 @@ int main(int argc,char *argv[]) {"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}, @@ -695,9 +651,12 @@ int main(int argc,char *argv[]) if (argc_new == 0) { printf("You must specify a testsuite to run, or 'ALL'\n"); + } else if (shell) { + torture_shell(torture); } else { for (i=2;i