On Jun 21, 2010, at 2:09 PM, Matthieu Patou wrote: > James, > > It seems that something is wrong with your patch set, I get: > > m...@ares:/usr/local/src/samba4/source4$ make > WAF_MAKE=1 ../buildtools/bin/waf build > Waf: Entering directory `/usr/local/src/samba4/source4/bin' > [1775/1973] Compiling torture/shell.c > ../torture/shell.c: In function ‘shell_set’: > ../torture/shell.c:181: error: implicit declaration of function ‘lp_dump’ > ../torture/shell.c:188: error: implicit declaration of function > ‘lp_set_cmdline’ > Waf: Leaving directory `/usr/local/src/samba4/source4/bin' > Build failed: -> task failed (err #1): > {task: cc shell.c -> shell_28.o} > make: *** [all] Erreur 1
Sorry, fixed with f5709975c1671dc23471a81b2a6523138d98a74b > > reseting to acf54c3... s3-winbind: Make KRB5_EVENT_REFRESH_TIME a function, > allow me to build ! > > Can you have a look ? > > On 21/06/2010 22:31, James Peach wrote: >> The branch, master has been updated >> via 6227eac... smbtorture: Fixx off-by-one command line parsing. >> via 0fc18ea... smbtorture: Add "target" command to interactive shell. >> via 7a25e2e... smbtorture: Enhance shell "help" command. >> via bf35aa8... smbtorture: Add "auth" command to the shell. >> via 3f398ec... smbtorture: Refactor interactive shell into >> independent commands. >> via 9f69790... smbtorture: Move interactive shell into a separate >> file. >> via a5e14bd... smbtorture: Print global options for interactive >> "list" command. >> via 12e15b0... smbtorture: Add history support to shell mode. >> via 6f96293... smbtorture: Add list command to smbtorture shell. >> from acf54c3... s3-winbind: Make KRB5_EVENT_REFRESH_TIME a function >> >> http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master >> >> >> - Log ----------------------------------------------------------------- >> commit 6227eac607131ed1042af1de83af7f70d0b05375 >> Author: James Peach<jpe...@samba.org> >> Date: Mon Jun 21 11:09:45 2010 -0700 >> >> smbtorture: Fixx off-by-one command line parsing. >> >> If we are not in shell mode we require both the target and test name >> arguments. Make sure we process these from the correct index. >> >> commit 0fc18ead76a79286365646eeb7607b39b01a1c9f >> Author: James Peach<jpe...@samba.org> >> Date: Mon Mar 22 21:55:49 2010 -0700 >> >> smbtorture: Add "target" command to interactive shell. >> >> Add a "target" command to set the target server to test. Refactor >> the command line argument processing a little so that you can run >> --shell without any additional arguments. >> >> commit 7a25e2efe9360b333fedc3fb938774437703700e >> Author: James Peach<jpe...@samba.org> >> Date: Sun Mar 21 22:04:37 2010 -0700 >> >> smbtorture: Enhance shell "help" command. >> >> Sort the command list alphabetically. Let the help command print >> usage info for other commands. >> >> commit bf35aa86038aa5bbf06bf73eb58cfa6fa1eae904 >> Author: James Peach<jpe...@samba.org> >> Date: Sun Mar 21 21:56:05 2010 -0700 >> >> smbtorture: Add "auth" command to the shell. >> >> Add a new "auth" command to set the cmdline credentials from withing >> the smbtorture shell. >> >> commit 3f398ec36d6b733c92682f5eb03eeacb047e582f >> Author: James Peach<jpe...@samba.org> >> Date: Fri Mar 19 22:04:08 2010 -0700 >> >> smbtorture: Refactor interactive shell into independent commands. >> >> Refactor the smbtorture interactive shell into a set of independent >> command callbacks to make it easier to add more independent commands. >> >> commit 9f697903556529bb4fedd73d027c317e56f6bf21 >> Author: James Peach<jpe...@samba.org> >> Date: Fri Mar 19 21:24:15 2010 -0700 >> >> smbtorture: Move interactive shell into a separate file. >> >> commit a5e14bded48ac53e21307eda1c9767be64b39a17 >> Author: James Peach<jpe...@samba.org> >> Date: Thu Mar 18 21:59:35 2010 -0700 >> >> smbtorture: Print global options for interactive "list" command. >> >> commit 12e15b0ac800a84d553ff82c4c61ccc8da9fd5fd >> Author: James Peach<jpe...@samba.org> >> Date: Thu Mar 18 21:25:17 2010 -0700 >> >> smbtorture: Add history support to shell mode. >> >> commit 6f96293406bfaff35e7588d0624842de145ff249 >> Author: James Peach<jpe...@samba.org> >> Date: Thu Mar 18 21:14:47 2010 -0700 >> >> smbtorture: Add list command to smbtorture shell. >> >> ----------------------------------------------------------------------- >> >> Summary of changes: >> lib/torture/torture.c | 2 +- >> lib/torture/torture.h | 2 +- >> source4/lib/smbreadline/readline.m4 | 5 + >> source4/torture/config.mk | 5 +- >> source4/torture/shell.c | 318 >> +++++++++++++++++++++++++++++++++++ >> source4/torture/smbtorture.c | 141 ++++++++++------ >> source4/torture/smbtorture.h | 5 + >> source4/torture/wscript_build | 2 +- >> 8 files changed, 422 insertions(+), 58 deletions(-) >> create mode 100644 source4/torture/shell.c >> >> >> Changeset truncated at 500 lines: >> >> diff --git a/lib/torture/torture.c b/lib/torture/torture.c >> index dcb28ee..4333f98 100644 >> --- a/lib/torture/torture.c >> +++ b/lib/torture/torture.c >> @@ -305,7 +305,7 @@ bool torture_run_suite(struct torture_context *context, >> } >> >> bool torture_run_suite_restricted(struct torture_context *context, >> - struct torture_suite *suite, char **restricted) >> + struct torture_suite *suite, const char **restricted) >> { >> /* FIXME */ >> return false; >> diff --git a/lib/torture/torture.h b/lib/torture/torture.h >> index 931937c..6482e89 100644 >> --- a/lib/torture/torture.h >> +++ b/lib/torture/torture.h >> @@ -221,7 +221,7 @@ bool torture_run_suite(struct torture_context *context, >> /* Run the specified testsuite recursively, but only the specified >> * tests */ >> bool torture_run_suite_restricted(struct torture_context *context, >> - struct torture_suite *suite, char **restricted); >> + struct torture_suite *suite, const char **restricted); >> >> /* Run the specified testcase */ >> bool torture_run_tcase(struct torture_context *context, >> diff --git a/source4/lib/smbreadline/readline.m4 >> b/source4/lib/smbreadline/readline.m4 >> index df15440..06d60ca 100644 >> --- a/source4/lib/smbreadline/readline.m4 >> +++ b/source4/lib/smbreadline/readline.m4 >> @@ -78,6 +78,11 @@ AC_CHECK_LIB(readline, history_list, >> [], >> [$TERMLIBS]) >> >> +AC_CHECK_LIB(readline, add_history, >> + [AC_DEFINE(HAVE_ADD_HISTORY, 1, [Do we have add_history?])], >> + [], >> + [$TERMLIBS]) >> + >> AC_MSG_CHECKING(whether to use extern readline) >> if test x"$EXTERNAL_READLINE" = x"yes"; then >> AC_MSG_RESULT(yes) >> diff --git a/source4/torture/config.mk b/source4/torture/config.mk >> index 25e9b53..09af078 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 0000000..2f58eb9 >> --- /dev/null >> +++ b/source4/torture/shell.c >> @@ -0,0 +1,318 @@ >> +/* >> + Unix SMB/CIFS implementation. >> + SMB torture tester >> + Copyright (C) Andrew Tridgell 1997-2003 >> + Copyright (C) Jelmer Vernooij 2006-2008 >> + Copyright (C) James Peach 2010 >> + >> + 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<http://www.gnu.org/licenses/>. >> +*/ >> + >> +#include "includes.h" >> +#include "system/readline.h" >> +#include "lib/smbreadline/smbreadline.h" >> +#include "lib/cmdline/popt_common.h" >> +#include "auth/credentials/credentials.h" >> +#include "torture/smbtorture.h" >> + >> +struct shell_command; >> + >> +typedef void (*shell_function)(const struct shell_command *, >> + struct torture_context *, int, const char **); >> + >> +static void shell_quit(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_help(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_set(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_run(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_list(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_auth(const struct shell_command *, >> + struct torture_context *, int, const char **); >> +static void shell_target(const struct shell_command *, >> + struct torture_context *, int, const char **); >> + >> +static void shell_usage(const struct shell_command *); >> +static bool match_command(const char *, const struct shell_command *); >> + >> +struct shell_command >> +{ >> + shell_function handler; >> + const char * name; >> + const char * usage; >> + const char * help; >> +} shell_command; >> + >> +static const struct shell_command commands[] = >> +{ >> + { >> + shell_auth, "auth", >> + "[[username | principal | domain | realm | password] STRING]", >> + "set authentication parameters" >> + }, >> + >> + { >> + shell_help, "help", NULL, >> + "print this help message" >> + }, >> + >> + { >> + shell_list, "list", NULL, >> + "list the available tests" >> + }, >> + >> + { >> + shell_quit, "quit", NULL, >> + "exit smbtorture" >> + }, >> + >> + { >> + shell_run, "run", "[TESTNAME]", >> + "run the specified test" >> + }, >> + >> + { >> + shell_set, "set", "[NAME VALUE]", >> + "print or set test configuration parameters" >> + }, >> + >> + { >> + shell_target, "target", "[TARGET]", >> + "print or set the test target" >> + } >> + >> +}; >> + >> +void torture_shell(struct torture_context *tctx) >> +{ >> + char *cline; >> + int argc; >> + const char **argv; >> + int ret; >> + int i; >> + >> + /* If we don't have a specified password, specify it as empty. This >> + * stops the credentials system prompting when we use the "auth" >> + * command to display the current auth parameters. >> + */ >> + if (cmdline_credentials->password_obtained != CRED_SPECIFIED) { >> + cli_credentials_set_password(cmdline_credentials, "", >> + CRED_SPECIFIED); >> + } >> + >> + 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; >> + } >> + >> + for (i = 0; i< ARRAY_SIZE(commands); i++) { >> + if (match_command(argv[0],&commands[i])) { >> + argc--; >> + argv++; >> + commands[i].handler(&commands[i], >> + tctx, argc, argv); >> + break; >> + } >> + } >> + >> + free(cline); >> + } >> +} >> + >> +static void shell_quit(const struct shell_command * command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + exit(0); >> +} >> + >> +static void shell_help(const struct shell_command * command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + int i; >> + >> + if (argc == 1) { >> + for (i = 0; i< ARRAY_SIZE(commands); i++) { >> + if (match_command(argv[0],&commands[i])) { >> + shell_usage(&commands[i]); >> + return; >> + } >> + } >> + } else { >> + fprintf(stdout, "Available commands:\n"); >> + for (i = 0; i< ARRAY_SIZE(commands); i++) { >> + fprintf(stdout, "\t%s - %s\n", >> + commands[i].name, commands[i].help); >> + } >> + } >> +} >> + >> +static void shell_set(const struct shell_command *command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + char * name; >> + >> + switch (argc) { >> + case 0: >> + lp_dump(tctx->lp_ctx, stdout, >> + false /* show_defaults */, >> + 0 /* skip services */); >> + break; >> + >> + case 2: >> + name = talloc_asprintf(NULL, "torture:%s", argv[0]); >> + lp_set_cmdline(tctx->lp_ctx, name, argv[1]); >> + talloc_free(name); >> + break; >> + >> + default: >> + shell_usage(command); >> + } >> +} >> + >> +static void shell_run(const struct shell_command * command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + if (argc != 1) { >> + shell_usage(command); >> + return; >> + } >> + >> + torture_run_named_tests(tctx, argv[0], NULL /* restricted */); >> +} >> + >> +static void shell_list(const struct shell_command * command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + if (argc != 0) { >> + shell_usage(command); >> + return; >> + } >> + >> + torture_print_tests(true); >> +} >> + >> +static void shell_auth(const struct shell_command * command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + >> + if (argc == 0) { >> + const char * username; >> + const char * domain; >> + const char * realm; >> + const char * password; >> + const char * principal; >> + >> + username = cli_credentials_get_username(cmdline_credentials); >> + principal = cli_credentials_get_principal(cmdline_credentials, >> tctx); >> + domain = cli_credentials_get_domain(cmdline_credentials); >> + realm = cli_credentials_get_realm(cmdline_credentials); >> + password = cli_credentials_get_password(cmdline_credentials); >> + >> + printf("Username: %s\n", username ? username : ""); >> + printf("User Principal: %s\n", principal ? principal : ""); >> + printf("Domain: %s\n", domain ? domain : ""); >> + printf("Realm: %s\n", realm ? realm : ""); >> + printf("Password: %s\n", password ? password : ""); >> + } else if (argc == 2) { >> + bool result; >> + >> + if (!strcmp(argv[0], "username")) { >> + result = cli_credentials_set_username( >> + cmdline_credentials, argv[1], CRED_SPECIFIED); >> + } else if (!strcmp(argv[0], "principal")) { >> + result = cli_credentials_set_principal( >> + cmdline_credentials, argv[1], CRED_SPECIFIED); >> + } else if (!strcmp(argv[0], "domain")) { >> + result = cli_credentials_set_domain( >> + cmdline_credentials, argv[1], CRED_SPECIFIED); >> + } else if (!strcmp(argv[0], "realm")) { >> + result = cli_credentials_set_realm( >> + cmdline_credentials, argv[1], CRED_SPECIFIED); >> + } else if (!strcmp(argv[0], "password")) { >> + result = cli_credentials_set_password( >> + cmdline_credentials, argv[1], CRED_SPECIFIED); >> + } else { >> + shell_usage(command); >> + return; >> + } >> + >> + if (!result) { >> + printf("failed to set %s\n", argv[0]); >> + } >> + } else { >> + shell_usage(command); >> + } >> + >> +} >> + >> +static void shell_target(const struct shell_command *command, >> + struct torture_context *tctx, int argc, const char **argv) >> +{ >> + if (argc == 0) { >> + const char * host; >> + const char * share; >> + const char * binding; >> + >> + host = torture_setting_string(tctx, "host", NULL); >> + share = torture_setting_string(tctx, "share", NULL); >> + binding = torture_setting_string(tctx, "binding", NULL); >> + >> + printf("Target host: %s\n", host ? host : ""); >> + printf("Target share: %s\n", share ? share : ""); >> + printf("Target binding: %s\n", binding ? binding : ""); >> + } else if (argc == 1) { >> + torture_parse_target(tctx->lp_ctx, argv[0]); >> + } else { >> + shell_usage(command); >> + } >> +} >> + >> +static void shell_usage(const struct shell_command * command) >> +{ >> + if (command->usage) { >> + fprintf(stderr, "Usage: %s %s\n", >> + command->name, command->usage); >> + } else { >> + fprintf(stderr, "Usage: %s\n", >> + command->name); >> + } >> +} >> + >> +static bool match_command(const char * name, >> + const struct shell_command * command) >> +{ >> + if (!strcmp(name, command->name)) { >> + return true; >> + } >> + >> + if (name[0] == command->name[0]&& name[1] == '\0') { >> + return true; >> + } >> + >> + return false; >> +} >> diff --git a/source4/torture/smbtorture.c b/source4/torture/smbtorture.c >> index 4b5eef6..14eeff9 100644 >> --- a/source4/torture/smbtorture.c >> +++ b/source4/torture/smbtorture.c >> @@ -33,11 +33,14 @@ >> #include "auth/gensec/gensec.h" >> #include "param/param.h" >> >> +#if HAVE_READLINE_HISTORY_H >> +#include<readline/history.h> >> +#endif >> >> 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) >> { >> @@ -91,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; >> @@ -119,7 +122,7 @@ static bool run_test(struct torture_context *torture, >> const char *name, >> return ret; >> } >> >> -static bool parse_target(struct loadparm_context *lp_ctx, const char >> *target) >> +bool torture_parse_target(struct loadparm_context *lp_ctx, const char >> *target) >> { >> char *host = NULL, *share = NULL; >> struct dcerpc_binding *binding_struct; >> @@ -185,6 +188,47 @@ static void parse_dns(struct loadparm_context *lp_ctx, >> const char *dns) >> >> } >> >> +/* Print the full test list, formatted into separate labelled test >> + * groups. >> + */ >> +static void print_structured_test_list(void) >> +{ >> + struct torture_suite *o; >> + struct torture_suite *s; >> + struct torture_tcase *t; >> + int i; >> + >> + if (torture_root == NULL) { >> + printf("NO TESTS LOADED\n"); >> + return; >> + } >> + >> + for (o = torture_root->children; o; o = o->next) { >> + printf("\n%s (%s):\n ", o->description, o->name); >> + >> + i = 0; >> + for (s = o->children; s; s = s->next) { >> + if (i + strlen(o->name) + strlen(s->name)>= (MAX_COLS - >> 3)) { >> + printf("\n "); >> + i = 0; >> + } >> + i+=printf("%s-%s ", o->name, s->name); >> + } >> + >> + for (t = o->testcases; t; t = t->next) { >> + if (i + strlen(o->name) + strlen(t->name)>= (MAX_COLS - >> 3)) { >> + printf("\n "); >> + i = 0; >> + } >> + i+=printf("%s-%s ", o->name, t->name); >> + } >> + >> + if (i) printf("\n"); >> + } >> + >> + printf("\nThe default test is ALL.\n"); >> +} >> + >> static void print_test_list(void) >> { >> struct torture_suite *o; >> @@ -205,13 +249,17 @@ static void print_test_list(void) >> } >> } >> >> -_NORETURN_ static void usage(poptContext pc) >> +void torture_print_tests(bool structured) >> { >> - struct torture_suite *o; >> - struct torture_suite *s; >> - struct torture_tcase *t; >> - int i; >> + if (structured) { >> + print_structured_test_list(); >> + } else { >> + print_test_list(); >> + } >> +} >> >> +_NORETURN_ static void usage(poptContext pc) >> +{ >> poptPrintUsage(pc, stdout, 0); >> printf("\n"); >> >> @@ -264,35 +312,7 @@ _NORETURN_ static void usage(poptContext pc) >> >> printf("Tests are:"); >> >> - if (torture_root == NULL) { >> - printf("NO TESTS LOADED\n"); >> - exit(1); >> >> >> > > > -- > Matthieu Patou > Samba Team http://samba.org >