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
> 

Reply via email to