r14520: Split up smbtorture binary into a core (torture.c) and UI frontend (smbtorture.c)
authorJelmer Vernooij <jelmer@samba.org>
Fri, 17 Mar 2006 16:27:22 +0000 (16:27 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Fri, 17 Mar 2006 16:27:22 +0000 (16:27 +0000)
source/torture/config.mk
source/torture/smbtorture.c [new file with mode: 0644]
source/torture/torture.c
source/torture/torture.h

index 4711aba27df6b29c89aa7f9bf17105a56f053ed8..af8069909312662a12f13e0ce35c6ea137353112 100644 (file)
@@ -1,9 +1,27 @@
 # TORTURE subsystem
+[LIBRARY::torture]
+PUBLIC_HEADERS = torture.h
+PUBLIC_PROTO_HEADER = proto.h
+OBJ_FILES = \
+               torture.o \
+               torture_util.o
+REQUIRED_SUBSYSTEMS = \
+               TORTURE_RAW \
+               TORTURE_SMB2 \
+               TORTURE_RAP \
+               TORTURE_AUTH \
+               TORTURE_LOCAL \
+               TORTURE_NBENCH \
+               TORTURE_LDAP \
+               TORTURE_NBT \
+               TORTURE_NET \
+               CONFIG \
+               LIBBASIC
 
 #################################
 # Start SUBSYSTEM TORTURE_BASIC
 [MODULE::TORTURE_BASIC]
-SUBSYSTEM = smbtorture
+SUBSYSTEM = torture
 INIT_FUNCTION = torture_base_init
 PRIVATE_PROTO_HEADER = \
                basic/proto.h
@@ -68,7 +86,7 @@ include smb2/config.mk
 
 [MODULE::torture_com]
 INIT_FUNCTION = torture_com_init
-SUBSYSTEM = smbtorture
+SUBSYSTEM = torture
 PRIVATE_PROTO_HEADER = \
                com/proto.h
 OBJ_FILES = \
@@ -79,7 +97,7 @@ REQUIRED_SUBSYSTEMS = \
 [MODULE::torture_rpc]
 # TORTURE_NET and TORTURE_NBT use functions from torture_rpc...
 OUTPUT_TYPE = MERGEDOBJ
-SUBSYSTEM = smbtorture
+SUBSYSTEM = torture
 INIT_FUNCTION = torture_rpc_init
 PRIVATE_PROTO_HEADER = \
                rpc/proto.h
@@ -223,23 +241,10 @@ REQUIRED_SUBSYSTEMS = \
 # Start BINARY smbtorture
 [BINARY::smbtorture]
 INSTALLDIR = BINDIR
-PUBLIC_HEADERS = torture.h
-PUBLIC_PROTO_HEADER = proto.h
 OBJ_FILES = \
-               torture.o \
-               torture_util.o
+               smbtorture.o
 REQUIRED_SUBSYSTEMS = \
-               TORTURE_RAW \
-               TORTURE_SMB2 \
-               TORTURE_RAP \
-               TORTURE_AUTH \
-               TORTURE_LOCAL \
-               TORTURE_NBENCH \
-               TORTURE_LDAP \
-               TORTURE_NBT \
-               TORTURE_NET \
-               CONFIG \
-               LIBBASIC \
+               torture \
                LIBPOPT \
                POPT_SAMBA \
                POPT_CREDENTIALS
diff --git a/source/torture/smbtorture.c b/source/torture/smbtorture.c
new file mode 100644 (file)
index 0000000..e707929
--- /dev/null
@@ -0,0 +1,374 @@
+/* 
+   Unix SMB/CIFS implementation.
+   SMB torture tester
+   Copyright (C) Andrew Tridgell 1997-2003
+   Copyright (C) Jelmer Vernooij 2006
+   
+   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 2 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, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "lib/cmdline/popt_common.h"
+#include "libcli/raw/libcliraw.h"
+#include "system/time.h"
+#include "system/wait.h"
+#include "system/filesys.h"
+#include "libcli/raw/ioctl.h"
+#include "libcli/libcli.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/events/events.h"
+#include "libcli/resolve/resolve.h"
+#include "auth/credentials/credentials.h"
+#include "libcli/ldap/ldap_client.h"
+#include "librpc/gen_ndr/ndr_nbt.h"
+
+#include "torture/torture.h"
+#include "build.h"
+#include "dlinklist.h"
+
+#define MAX_COLS 80 /* FIXME: Determine this at run-time */
+
+/****************************************************************************
+run a specified test or "ALL"
+****************************************************************************/
+static BOOL run_test(const char *name)
+{
+       BOOL ret = True;
+       struct torture_op *o;
+       BOOL matched = False;
+
+       if (strequal(name,"ALL")) {
+               for (o = torture_ops; o; o = o->next) {
+                       if (!run_test(o->name)) {
+                               ret = False;
+                       }
+               }
+               return ret;
+       }
+
+       for (o = torture_ops; o; o = o->next) {
+               if (gen_fnmatch(name, o->name) == 0) {
+                       double t;
+                       matched = True;
+                       init_iconv();
+                       printf("Running %s\n", o->name);
+                       if (o->multi_fn) {
+                               BOOL result = False;
+                               t = torture_create_procs(o->multi_fn, 
+                                                        &result);
+                               if (!result) { 
+                                       ret = False;
+                                       printf("TEST %s FAILED!\n", o->name);
+                               }
+                                        
+                       } else {
+                               struct timeval tv = timeval_current();
+                               if (!o->fn()) {
+                                       ret = False;
+                                       printf("TEST %s FAILED!\n", o->name);
+                               }
+                               t = timeval_elapsed(&tv);
+                       }
+                       printf("%s took %g secs\n\n", o->name, t);
+               }
+       }
+
+       if (!matched) {
+               printf("Unknown torture operation '%s'\n", name);
+       }
+
+       return ret;
+}
+
+static void parse_dns(const char *dns)
+{
+       char *userdn, *basedn, *secret;
+       char *p, *d;
+
+       /* retrievieng the userdn */
+       p = strchr_m(dns, '#');
+       if (!p) {
+               lp_set_cmdline("torture:ldap_userdn", "");
+               lp_set_cmdline("torture:ldap_basedn", "");
+               lp_set_cmdline("torture:ldap_secret", "");
+               return;
+       }
+       userdn = strndup(dns, p - dns);
+       lp_set_cmdline("torture:ldap_userdn", userdn);
+
+       /* retrieve the basedn */
+       d = p + 1;
+       p = strchr_m(d, '#');
+       if (!p) {
+               lp_set_cmdline("torture:ldap_basedn", "");
+               lp_set_cmdline("torture:ldap_secret", "");
+               return;
+       }
+       basedn = strndup(d, p - d);
+       lp_set_cmdline("torture:ldap_basedn", basedn);
+
+       /* retrieve the secret */
+       p = p + 1;
+       if (!p) {
+               lp_set_cmdline("torture:ldap_secret", "");
+               return;
+       }
+       secret = strdup(p);
+       lp_set_cmdline("torture:ldap_secret", secret);
+
+       printf ("%s - %s - %s\n", userdn, basedn, secret);
+
+}
+
+static void usage(poptContext pc)
+{
+       struct torture_op *o;
+       int i;
+
+       poptPrintUsage(pc, stdout, 0);
+       printf("\n");
+
+       printf("The binding format is:\n\n");
+
+       printf("  TRANSPORT:host[flags]\n\n");
+
+       printf("  where TRANSPORT is either ncacn_np for SMB or ncacn_ip_tcp for RPC/TCP\n\n");
+
+       printf("  'host' is an IP or hostname or netbios name. If the binding string\n");
+       printf("  identifies the server side of an endpoint, 'host' may be an empty\n");
+       printf("  string.\n\n");
+
+       printf("  'flags' can include a SMB pipe name if using the ncacn_np transport or\n");
+       printf("  a TCP port number if using the ncacn_ip_tcp transport, otherwise they\n");
+       printf("  will be auto-determined.\n\n");
+
+       printf("  other recognised flags are:\n\n");
+
+       printf("    sign : enable ntlmssp signing\n");
+       printf("    seal : enable ntlmssp sealing\n");
+       printf("    connect : enable rpc connect level auth (auth, but no sign or seal)\n");
+       printf("    validate: enable the NDR validator\n");
+       printf("    print: enable debugging of the packets\n");
+       printf("    bigendian: use bigendian RPC\n");
+       printf("    padcheck: check reply data for non-zero pad bytes\n\n");
+
+       printf("  For example, these all connect to the samr pipe:\n\n");
+
+       printf("    ncacn_np:myserver\n");
+       printf("    ncacn_np:myserver[samr]\n");
+       printf("    ncacn_np:myserver[\\pipe\\samr]\n");
+       printf("    ncacn_np:myserver[/pipe/samr]\n");
+       printf("    ncacn_np:myserver[samr,sign,print]\n");
+       printf("    ncacn_np:myserver[\\pipe\\samr,sign,seal,bigendian]\n");
+       printf("    ncacn_np:myserver[/pipe/samr,seal,validate]\n");
+       printf("    ncacn_np:\n");
+       printf("    ncacn_np:[/pipe/samr]\n\n");
+
+       printf("    ncacn_ip_tcp:myserver\n");
+       printf("    ncacn_ip_tcp:myserver[1024]\n");
+       printf("    ncacn_ip_tcp:myserver[1024,sign,seal]\n\n");
+
+       printf("The unc format is:\n\n");
+
+       printf("    //server/share\n\n");
+
+       printf("tests are:\n");
+
+       i = 0;
+       for (o = torture_ops; o; o = o->next) {
+               if (i + strlen(o->name) >= MAX_COLS) {
+                       printf("\n");
+                       i = 0;
+               }
+               i+=printf("%s ", o->name);
+       }
+       printf("\n\n");
+
+       printf("default test is ALL\n");
+
+       exit(1);
+}
+
+static BOOL is_binding_string(const char *binding_string)
+{
+       TALLOC_CTX *mem_ctx = talloc_init("is_binding_string");
+       struct dcerpc_binding *binding_struct;
+       NTSTATUS status;
+       
+       status = dcerpc_parse_binding(mem_ctx, binding_string, &binding_struct);
+
+       talloc_free(mem_ctx);
+       return NT_STATUS_IS_OK(status);
+}
+
+static void max_runtime_handler(int sig)
+{
+       DEBUG(0,("maximum runtime exceeded for smbtorture - terminating\n"));
+       exit(1);
+}
+
+/****************************************************************************
+  main program
+****************************************************************************/
+ int main(int argc,char *argv[])
+{
+       int opt, i;
+       char *p;
+       BOOL correct = True;
+       int max_runtime=0;
+       int argc_new;
+       char **argv_new;
+       poptContext pc;
+       enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS,
+           OPT_DANGEROUS,OPT_SMB_PORTS};
+       
+       struct poptOption long_options[] = {
+               POPT_AUTOHELP
+               {"smb-ports",   'p', POPT_ARG_STRING, NULL,     OPT_SMB_PORTS,  "SMB ports",    NULL},
+               {"seed",          0, POPT_ARG_INT,  &torture_seed,      0,      "seed",         NULL},
+               {"num-progs",     0, POPT_ARG_INT,  &torture_nprocs,    0,      "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},
+               {"use-oplocks", 'L', POPT_ARG_NONE, &use_oplocks,       0,      "use oplocks",  NULL},
+               {"show-all",      0, POPT_ARG_NONE, &torture_showall,   0,      "show all",     NULL},
+               {"loadfile",      0, POPT_ARG_STRING,   NULL,   OPT_LOADFILE,   "loadfile",     NULL},
+               {"unclist",       0, POPT_ARG_STRING,   NULL,   OPT_UNCLIST,    "unclist",      NULL},
+               {"timelimit",   't', POPT_ARG_STRING,   NULL,   OPT_TIMELIMIT,  "timelimit",    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,  "dangerous",    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
+               POPT_TABLEEND
+       };
+
+#ifdef HAVE_SETBUFFER
+       setbuffer(stdout, NULL, 0);
+#endif
+
+       torture_init();
+
+       /* 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("torture:loadfile", poptGetOptArg(pc));
+                       break;
+               case OPT_UNCLIST:
+                       lp_set_cmdline("torture:unclist", poptGetOptArg(pc));
+                       break;
+               case OPT_TIMELIMIT:
+                       lp_set_cmdline("torture:timelimit", poptGetOptArg(pc));
+                       break;
+               case OPT_DNS:
+                       parse_dns(poptGetOptArg(pc));
+                       break;
+               case OPT_DANGEROUS:
+                       lp_set_cmdline("torture:dangerous", "Yes");
+                       break;
+               case OPT_SMB_PORTS:
+                       lp_set_cmdline("smb ports", poptGetOptArg(pc));
+                       break;
+               default:
+                       d_printf("Invalid option %s: %s\n", 
+                                poptBadOption(pc, 0), poptStrerror(opt));
+                       usage(pc);
+                       exit(1);
+               }
+       }
+
+       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);
+       }
+
+       ldb_global_init();
+
+       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) {
+               usage(pc);
+               exit(1);
+       }
+
+        for(p = argv_new[1]; *p; p++) {
+               if(*p == '\\')
+                       *p = '/';
+       }
+
+       /* see if its a RPC transport specifier */
+       if (is_binding_string(argv_new[1])) {
+               lp_set_cmdline("torture:binding", argv_new[1]);
+       } else {
+               char *binding = NULL;
+               char *host = NULL, *share = NULL;
+
+               if (!smbcli_parse_unc(argv_new[1], NULL, &host, &share)) {
+                       d_printf("Invalid option: %s is not a valid torture target (share or binding string)\n\n", argv_new[1]);
+                       usage(pc);
+               }
+
+               lp_set_cmdline("torture:host", host);
+               lp_set_cmdline("torture:share", share);
+               asprintf(&binding, "ncacn_np:%s", host);
+               lp_set_cmdline("torture:binding", binding);
+       }
+
+       if (argc_new == 0) {
+               printf("You must specify a test to run, or 'ALL'\n");
+       } else {
+               for (i=2;i<argc_new;i++) {
+                       if (!run_test(argv_new[i])) {
+                               correct = False;
+                       }
+               }
+       }
+
+       if (correct) {
+               return(0);
+       } else {
+               return(1);
+       }
+}
index 4003b52c92979cfbcba52b2be666a31433be562a..a54c760dc851abcdb21a82cca85c6160dff26a04 100644 (file)
 #include "build.h"
 #include "dlinklist.h"
 
-int torture_nprocs=4;
+_PUBLIC_ int torture_nprocs=4;
 _PUBLIC_ int torture_numops=10;
 _PUBLIC_ int torture_entries=1000;
 _PUBLIC_ int torture_failures=1;
 _PUBLIC_ int torture_seed=0;
+_PUBLIC_ BOOL use_oplocks;
 static int procnum; /* records process count number when forking */
 static struct smbcli_state *current_cli;
-static BOOL use_oplocks;
 static BOOL use_level_II_oplocks;
-#define MAX_COLS 80 /* FIXME: Determine this at run-time */
 
 _PUBLIC_ BOOL torture_showall = False;
 
@@ -761,12 +760,7 @@ static void register_builtin_ops(void)
 }
 
 
-static struct torture_op {
-       const char *name;
-       BOOL (*fn)(void);
-       BOOL (*multi_fn)(struct smbcli_state *, int );
-       struct torture_op *prev, *next;
-}* torture_ops = NULL;;
+struct torture_op *torture_ops = NULL;
 
 static struct torture_op *find_torture_op(const char *name)
 {
@@ -800,231 +794,11 @@ _PUBLIC_ NTSTATUS register_torture_op(const char *name, BOOL (*fn)(void), BOOL (
        return NT_STATUS_OK;
 }
 
-/****************************************************************************
-run a specified test or "ALL"
-****************************************************************************/
-static BOOL run_test(const char *name)
-{
-       BOOL ret = True;
-       struct torture_op *o;
-       BOOL matched = False;
-
-       if (strequal(name,"ALL")) {
-               for (o = torture_ops; o; o = o->next) {
-                       if (!run_test(o->name)) {
-                               ret = False;
-                       }
-               }
-               return ret;
-       }
-
-       for (o = torture_ops; o; o = o->next) {
-               if (gen_fnmatch(name, o->name) == 0) {
-                       double t;
-                       matched = True;
-                       init_iconv();
-                       printf("Running %s\n", o->name);
-                       if (o->multi_fn) {
-                               BOOL result = False;
-                               t = torture_create_procs(o->multi_fn, 
-                                                        &result);
-                               if (!result) { 
-                                       ret = False;
-                                       printf("TEST %s FAILED!\n", o->name);
-                               }
-                                        
-                       } else {
-                               struct timeval tv = timeval_current();
-                               if (!o->fn()) {
-                                       ret = False;
-                                       printf("TEST %s FAILED!\n", o->name);
-                               }
-                               t = timeval_elapsed(&tv);
-                       }
-                       printf("%s took %g secs\n\n", o->name, t);
-               }
-       }
-
-       if (!matched) {
-               printf("Unknown torture operation '%s'\n", name);
-       }
-
-       return ret;
-}
-
-
-static void parse_dns(const char *dns)
-{
-       char *userdn, *basedn, *secret;
-       char *p, *d;
-
-       /* retrievieng the userdn */
-       p = strchr_m(dns, '#');
-       if (!p) {
-               lp_set_cmdline("torture:ldap_userdn", "");
-               lp_set_cmdline("torture:ldap_basedn", "");
-               lp_set_cmdline("torture:ldap_secret", "");
-               return;
-       }
-       userdn = strndup(dns, p - dns);
-       lp_set_cmdline("torture:ldap_userdn", userdn);
-
-       /* retrieve the basedn */
-       d = p + 1;
-       p = strchr_m(d, '#');
-       if (!p) {
-               lp_set_cmdline("torture:ldap_basedn", "");
-               lp_set_cmdline("torture:ldap_secret", "");
-               return;
-       }
-       basedn = strndup(d, p - d);
-       lp_set_cmdline("torture:ldap_basedn", basedn);
-
-       /* retrieve the secret */
-       p = p + 1;
-       if (!p) {
-               lp_set_cmdline("torture:ldap_secret", "");
-               return;
-       }
-       secret = strdup(p);
-       lp_set_cmdline("torture:ldap_secret", secret);
-
-       printf ("%s - %s - %s\n", userdn, basedn, secret);
-
-}
-
-static void usage(poptContext pc)
-{
-       struct torture_op *o;
-       int i;
-
-       poptPrintUsage(pc, stdout, 0);
-       printf("\n");
-
-       printf("The binding format is:\n\n");
-
-       printf("  TRANSPORT:host[flags]\n\n");
-
-       printf("  where TRANSPORT is either ncacn_np for SMB or ncacn_ip_tcp for RPC/TCP\n\n");
-
-       printf("  'host' is an IP or hostname or netbios name. If the binding string\n");
-       printf("  identifies the server side of an endpoint, 'host' may be an empty\n");
-       printf("  string.\n\n");
-
-       printf("  'flags' can include a SMB pipe name if using the ncacn_np transport or\n");
-       printf("  a TCP port number if using the ncacn_ip_tcp transport, otherwise they\n");
-       printf("  will be auto-determined.\n\n");
-
-       printf("  other recognised flags are:\n\n");
-
-       printf("    sign : enable ntlmssp signing\n");
-       printf("    seal : enable ntlmssp sealing\n");
-       printf("    connect : enable rpc connect level auth (auth, but no sign or seal)\n");
-       printf("    validate: enable the NDR validator\n");
-       printf("    print: enable debugging of the packets\n");
-       printf("    bigendian: use bigendian RPC\n");
-       printf("    padcheck: check reply data for non-zero pad bytes\n\n");
-
-       printf("  For example, these all connect to the samr pipe:\n\n");
-
-       printf("    ncacn_np:myserver\n");
-       printf("    ncacn_np:myserver[samr]\n");
-       printf("    ncacn_np:myserver[\\pipe\\samr]\n");
-       printf("    ncacn_np:myserver[/pipe/samr]\n");
-       printf("    ncacn_np:myserver[samr,sign,print]\n");
-       printf("    ncacn_np:myserver[\\pipe\\samr,sign,seal,bigendian]\n");
-       printf("    ncacn_np:myserver[/pipe/samr,seal,validate]\n");
-       printf("    ncacn_np:\n");
-       printf("    ncacn_np:[/pipe/samr]\n\n");
-
-       printf("    ncacn_ip_tcp:myserver\n");
-       printf("    ncacn_ip_tcp:myserver[1024]\n");
-       printf("    ncacn_ip_tcp:myserver[1024,sign,seal]\n\n");
-
-       printf("The unc format is:\n\n");
-
-       printf("    //server/share\n\n");
-
-       printf("tests are:\n");
-
-       i = 0;
-       for (o = torture_ops; o; o = o->next) {
-               if (i + strlen(o->name) >= MAX_COLS) {
-                       printf("\n");
-                       i = 0;
-               }
-               i+=printf("%s ", o->name);
-       }
-       printf("\n\n");
-
-       printf("default test is ALL\n");
-
-       exit(1);
-}
-
-static BOOL is_binding_string(const char *binding_string)
-{
-       TALLOC_CTX *mem_ctx = talloc_init("is_binding_string");
-       struct dcerpc_binding *binding_struct;
-       NTSTATUS status;
-       
-       status = dcerpc_parse_binding(mem_ctx, binding_string, &binding_struct);
-
-       talloc_free(mem_ctx);
-       return NT_STATUS_IS_OK(status);
-}
-
-static void max_runtime_handler(int sig)
-{
-       DEBUG(0,("maximum runtime exceeded for smbtorture - terminating\n"));
-       exit(1);
-}
-
-/****************************************************************************
-  main program
-****************************************************************************/
- int main(int argc,char *argv[])
+int torture_init(void)
 {
-       int opt, i;
-       char *p;
-       BOOL correct = True;
-       int max_runtime=0;
-       int argc_new;
-       char **argv_new;
-       poptContext pc;
-       enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS,
-           OPT_DANGEROUS,OPT_SMB_PORTS};
-       init_module_fn static_init[] = STATIC_smbtorture_MODULES;
+       init_module_fn static_init[] = STATIC_torture_MODULES;
        init_module_fn *shared_init = load_samba_modules(NULL, "torture");
        
-       struct poptOption long_options[] = {
-               POPT_AUTOHELP
-               {"smb-ports",   'p', POPT_ARG_STRING, NULL,     OPT_SMB_PORTS,  "SMB ports",    NULL},
-               {"seed",          0, POPT_ARG_INT,  &torture_seed,      0,      "seed",         NULL},
-               {"num-progs",     0, POPT_ARG_INT,  &torture_nprocs,    0,      "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},
-               {"use-oplocks", 'L', POPT_ARG_NONE, &use_oplocks,       0,      "use oplocks",  NULL},
-               {"show-all",      0, POPT_ARG_NONE, &torture_showall,   0,      "show all",     NULL},
-               {"loadfile",      0, POPT_ARG_STRING,   NULL,   OPT_LOADFILE,   "loadfile",     NULL},
-               {"unclist",       0, POPT_ARG_STRING,   NULL,   OPT_UNCLIST,    "unclist",      NULL},
-               {"timelimit",   't', POPT_ARG_STRING,   NULL,   OPT_TIMELIMIT,  "timelimit",    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,  "dangerous",    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
-               POPT_TABLEEND
-       };
-
-#ifdef HAVE_SETBUFFER
-       setbuffer(stdout, NULL, 0);
-#endif
-
        register_builtin_ops();
 
        run_init_functions(static_init);
@@ -1032,111 +806,5 @@ static void max_runtime_handler(int sig)
 
        talloc_free(shared_init);
 
-       /* 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("torture:loadfile", poptGetOptArg(pc));
-                       break;
-               case OPT_UNCLIST:
-                       lp_set_cmdline("torture:unclist", poptGetOptArg(pc));
-                       break;
-               case OPT_TIMELIMIT:
-                       lp_set_cmdline("torture:timelimit", poptGetOptArg(pc));
-                       break;
-               case OPT_DNS:
-                       parse_dns(poptGetOptArg(pc));
-                       break;
-               case OPT_DANGEROUS:
-                       lp_set_cmdline("torture:dangerous", "Yes");
-                       break;
-               case OPT_SMB_PORTS:
-                       lp_set_cmdline("smb ports", poptGetOptArg(pc));
-                       break;
-               default:
-                       d_printf("Invalid option %s: %s\n", 
-                                poptBadOption(pc, 0), poptStrerror(opt));
-                       usage(pc);
-                       exit(1);
-               }
-       }
-
-       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);
-       }
-
-       ldb_global_init();
-
-       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) {
-               usage(pc);
-               exit(1);
-       }
-
-        for(p = argv_new[1]; *p; p++) {
-               if(*p == '\\')
-                       *p = '/';
-       }
-
-       /* see if its a RPC transport specifier */
-       if (is_binding_string(argv_new[1])) {
-               lp_set_cmdline("torture:binding", argv_new[1]);
-       } else {
-               char *binding = NULL;
-               char *host = NULL, *share = NULL;
-
-               if (!smbcli_parse_unc(argv_new[1], NULL, &host, &share)) {
-                       d_printf("Invalid option: %s is not a valid torture target (share or binding string)\n\n", argv_new[1]);
-                       usage(pc);
-               }
-
-               lp_set_cmdline("torture:host", host);
-               lp_set_cmdline("torture:share", share);
-               asprintf(&binding, "ncacn_np:%s", host);
-               lp_set_cmdline("torture:binding", binding);
-       }
-
-       if (argc_new == 0) {
-               printf("You must specify a test to run, or 'ALL'\n");
-       } else {
-               for (i=2;i<argc_new;i++) {
-                       if (!run_test(argv_new[i])) {
-                               correct = False;
-                       }
-               }
-       }
-
-       if (correct) {
-               return(0);
-       } else {
-               return(1);
-       }
+       return 0;
 }
index e509ac70281e3ead5e856e46b8258ce973598e0e..6218700ac6637889125457b9823b97be64f72215 100644 (file)
 #ifndef __TORTURE_H__
 #define __TORTURE_H__
 
+struct torture_op {
+       const char *name;
+       BOOL (*fn)(void);
+       BOOL (*multi_fn)(struct smbcli_state *, int );
+       struct torture_op *prev, *next;
+};
+
+extern struct torture_op * torture_ops;
+
+extern BOOL use_oplocks;
+extern BOOL torture_showall;
+extern int torture_entries;
+extern int torture_nprocs;
+extern int torture_seed;
 extern int torture_numops;
 extern int torture_failures;