libndr: Avoid assigning duplicate versions to symbols
[amitay/samba.git] / source4 / torture / masktest.c
index fec7657afea1da7b7f9c309c673931546cdcd6db..35ec2e9d040eee934e2e73a1c906a7e92276fd7f 100644 (file)
 */
 
 #include "includes.h"
+#include "lib/cmdline/popt_common.h"
 #include "system/filesys.h"
 #include "system/dir.h"
 #include "libcli/libcli.h"
-#include "libcli/raw/libcliraw.h"
 #include "system/time.h"
-#include "pstring.h"
 #include "auth/credentials/credentials.h"
 #include "auth/gensec/gensec.h"
 #include "param/param.h"
-#include "dynconfig.h"
+#include "libcli/resolve/resolve.h"
+#include "lib/events/events.h"
 
-static struct cli_credentials *credentials;
 static bool showall = false;
 static bool old_list = false;
 static const char *maskchars = "<>\"?*abc.";
 static const char *filechars = "abcdefghijklm.";
-static int verbose;
 static int die_on_error;
 static int NumLoops = 0;
 static int max_length = 20;
+struct masktest_state {
+       TALLOC_CTX *mem_ctx;
+};
 
 static bool reg_match_one(struct smbcli_state *cli, const char *pattern, const char *file)
 {
@@ -48,13 +49,14 @@ static bool reg_match_one(struct smbcli_state *cli, const char *pattern, const c
 
        if (ISDOTDOT(file)) file = ".";
 
-       return ms_fnmatch(pattern, file, cli->transport->negotiate.protocol)==0;
+       return ms_fnmatch_protocol(
+               pattern, file, cli->transport->negotiate.protocol, false)==0;
 }
 
-static char *reg_test(struct smbcli_state *cli, char *pattern, char *long_name, char *short_name)
+static char *reg_test(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *pattern, const char *long_name, const char *short_name)
 {
-       static fstring ret;
-       fstrcpy(ret, "---");
+       char *ret;
+       ret = talloc_strdup(mem_ctx, "---");
 
        pattern = 1+strrchr_m(pattern,'\\');
 
@@ -69,24 +71,37 @@ static char *reg_test(struct smbcli_state *cli, char *pattern, char *long_name,
 /***************************************************** 
 return a connection to a server
 *******************************************************/
-static struct smbcli_state *connect_one(char *share)
+static struct smbcli_state *connect_one(struct resolve_context *resolve_ctx, 
+                                       struct tevent_context *ev,
+                                       TALLOC_CTX *mem_ctx,
+                                       char *share, const char **ports,
+                                       const char *socket_options,
+                                       struct smbcli_options *options,
+                                       struct smbcli_session_options *session_options,
+                                       struct gensec_settings *gensec_settings)
 {
        struct smbcli_state *c;
-       fstring server;
+       char *server;
        NTSTATUS status;
 
-       fstrcpy(server,share+2);
+       server = talloc_strdup(mem_ctx, share+2);
        share = strchr_m(server,'\\');
        if (!share) return NULL;
        *share = 0;
        share++;
 
-       cli_credentials_set_workstation(credentials, "masktest", CRED_SPECIFIED);
+       cli_credentials_set_workstation(popt_get_cmdline_credentials(),
+                       "masktest", CRED_SPECIFIED);
 
        status = smbcli_full_connection(NULL, &c,
                                        server, 
+                                       ports,
                                        share, NULL,
-                                       credentials, NULL);
+                                       socket_options,
+                                       popt_get_cmdline_credentials(),
+                                       resolve_ctx, ev,
+                                       options, session_options,
+                                       gensec_settings);
 
        if (!NT_STATUS_IS_OK(status)) {
                return NULL;
@@ -97,29 +112,34 @@ static struct smbcli_state *connect_one(char *share)
 
 static char *resultp;
 static struct {
-       pstring long_name;
-       pstring short_name;
+       char *long_name;
+       char *short_name;
 } last_hit;
 static bool f_info_hit;
 
 static void listfn(struct clilist_file_info *f, const char *s, void *state)
 {
+       struct masktest_state *m = (struct masktest_state *)state;
+
        if (ISDOT(f->name)) {
                resultp[0] = '+';
        } else if (ISDOTDOT(f->name)) {
-               resultp[1] = '+';               
+               resultp[1] = '+';
        } else {
                resultp[2] = '+';
        }
-       pstrcpy(last_hit.long_name, f->name);
-       pstrcpy(last_hit.short_name, f->short_name);
+
+       last_hit.long_name = talloc_strdup(m->mem_ctx, f->name);
+       last_hit.short_name = talloc_strdup(m->mem_ctx, f->short_name);
        f_info_hit = true;
 }
 
-static void get_real_name(struct smbcli_state *cli, 
-                         pstring long_name, fstring short_name)
+static void get_real_name(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
+                         char **long_name, char **short_name)
 {
        const char *mask;
+       struct masktest_state state;
+
        if (cli->transport->negotiate.protocol <= PROTOCOL_LANMAN1) {
                mask = "\\masktest\\*.*";
        } else {
@@ -128,35 +148,39 @@ static void get_real_name(struct smbcli_state *cli,
 
        f_info_hit = false;
 
-       smbcli_list_new(cli->tree, mask, 
-                       FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY, 
+       state.mem_ctx = mem_ctx;
+
+       smbcli_list_new(cli->tree, mask,
+                       FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY,
                        RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO,
-                       listfn, NULL);
+                       listfn, &state);
 
        if (f_info_hit) {
-               fstrcpy(short_name, last_hit.short_name);
-               strlower(short_name);
-               pstrcpy(long_name, last_hit.long_name);
-               strlower(long_name);
+               *short_name = strlower_talloc(mem_ctx, last_hit.short_name);
+               *long_name = strlower_talloc(mem_ctx, last_hit.long_name);
        }
 
-       if (*short_name == 0) {
-               fstrcpy(short_name, long_name);
+       if (*short_name[0] == '\0') {
+               *short_name = talloc_strdup(mem_ctx, *long_name);
        }
 }
 
-static void testpair(struct smbcli_state *cli, char *mask, char *file)
+static void testpair(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, char *mask,
+               char *file)
 {
        int fnum;
-       fstring res1;
+       char res1[256];
        char *res2;
        static int count;
-       fstring short_name;
-       pstring long_name;
+       char *short_name = NULL;
+       char *long_name = NULL;
+       struct masktest_state state;
 
        count++;
 
-       fstrcpy(res1, "---");
+       strlcpy(res1, "---", sizeof(res1));
+
+       state.mem_ctx = mem_ctx;
 
        fnum = smbcli_open(cli->tree, file, O_CREAT|O_TRUNC|O_RDWR, 0);
        if (fnum == -1) {
@@ -166,15 +190,15 @@ static void testpair(struct smbcli_state *cli, char *mask, char *file)
        smbcli_close(cli->tree, fnum);
 
        resultp = res1;
-       fstrcpy(short_name, "");
-       get_real_name(cli, long_name, short_name);
-       fstrcpy(res1, "---");
-       smbcli_list_new(cli->tree, mask, 
-                       FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY, 
+       short_name = talloc_strdup(mem_ctx, "");
+       get_real_name(mem_ctx, cli, &long_name, &short_name);
+       strlcpy(res1, "---", sizeof(res1));
+       smbcli_list_new(cli->tree, mask,
+                       FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY,
                        RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO,
-                       listfn, NULL);
+                       listfn, &state);
 
-       res2 = reg_test(cli, mask, long_name, short_name);
+       res2 = reg_test(cli, mem_ctx, mask, long_name, short_name);
 
        if (showall || strcmp(res1, res2)) {
                d_printf("%s %s %d mask=[%s] file=[%s] rfile=[%s/%s]\n",
@@ -189,10 +213,11 @@ static void testpair(struct smbcli_state *cli, char *mask, char *file)
        resultp = NULL;
 }
 
-static void test_mask(int argc, char *argv[], 
+static void test_mask(int argc, char *argv[],
+                                         TALLOC_CTX *mem_ctx,
                      struct smbcli_state *cli)
 {
-       pstring mask, file;
+       char *mask, *file;
        int l1, l2, i, l;
        int mc_len = strlen(maskchars);
        int fc_len = strlen(filechars);
@@ -203,11 +228,11 @@ static void test_mask(int argc, char *argv[],
 
        if (argc >= 2) {
                while (argc >= 2) {
-                       pstrcpy(mask,"\\masktest\\");
-                       pstrcpy(file,"\\masktest\\");
-                       pstrcat(mask, argv[0]);
-                       pstrcat(file, argv[1]);
-                       testpair(cli, mask, file);
+                       mask = talloc_strdup(mem_ctx, "\\masktest\\");
+                       file = talloc_strdup(mem_ctx, "\\masktest\\");
+                       mask = talloc_strdup_append(mask, argv[0]);
+                       file = talloc_strdup_append(file, argv[1]);
+                       testpair(mem_ctx, cli, mask, file);
                        argv += 2;
                        argc -= 2;
                }
@@ -217,8 +242,10 @@ static void test_mask(int argc, char *argv[],
        while (1) {
                l1 = 1 + random() % max_length;
                l2 = 1 + random() % max_length;
-               pstrcpy(mask,"\\masktest\\");
-               pstrcpy(file,"\\masktest\\");
+               mask = talloc_strdup(mem_ctx, "\\masktest\\");
+               file = talloc_strdup(mem_ctx, "\\masktest\\");
+               mask = talloc_realloc_size(mem_ctx, mask, strlen(mask)+l1+1);
+               file = talloc_realloc_size(mem_ctx, file, strlen(file)+l2+1);
                l = strlen(mask);
                for (i=0;i<l1;i++) {
                        mask[i+l] = maskchars[random() % mc_len];
@@ -236,7 +263,7 @@ static void test_mask(int argc, char *argv[],
 
                if (strspn(file+l, ".") == strlen(file+l)) continue;
 
-               testpair(cli, mask, file);
+               testpair(mem_ctx, cli, mask, file);
                if (NumLoops && (--NumLoops == 0))
                        break;
        }
@@ -246,126 +273,111 @@ static void test_mask(int argc, char *argv[],
 }
 
 
-static void usage(void)
+static void usage(poptContext pc)
 {
        printf(
 "Usage:\n\
   masktest //server/share [options..]\n\
-  options:\n\
-       -d debuglevel\n\
-       -n numloops\n\
-        -W workgroup\n\
-        -U user%%pass\n\
-        -s seed\n\
-        -l max test length\n\
-        -M max protocol\n\
-        -f filechars (default %s)\n\
-        -m maskchars (default %s)\n\
-       -v                             verbose mode\n\
-       -E                             die on error\n\
-        -a                             show all tests\n\
 \n\
   This program tests wildcard matching between two servers. It generates\n\
   random pairs of filenames/masks and tests that they match in the same\n\
-  way on the servers and internally\n\
-", 
-  filechars, maskchars);
+  way on the servers and internally\n");
+       poptPrintUsage(pc, stdout, 0);
 }
 
 /****************************************************************************
   main program
 ****************************************************************************/
- int main(int argc,char *argv[])
+int main(int argc, const char *argv[])
 {
        char *share;
        struct smbcli_state *cli;       
        int opt;
        int seed;
+       struct tevent_context *ev;
+       struct loadparm_context *lp_ctx;
+       struct smbcli_options options;
+       struct smbcli_session_options session_options;
+       poptContext pc;
+       int argc_new, i;
+       char **argv_new;
+       TALLOC_CTX *mem_ctx = NULL;
+       enum {OPT_UNCLIST=1000};
+       struct poptOption long_options[] = {
+               POPT_AUTOHELP
+               {"seed",          0, POPT_ARG_INT,  &seed,      0,      "Seed to use for randomizer",   NULL},
+               {"num-ops",       0, POPT_ARG_INT,  &NumLoops,  0,      "num ops",      NULL},
+               {"maxlength",     0, POPT_ARG_INT,  &max_length,0,      "maximum length",       NULL},
+               {"dieonerror",    0, POPT_ARG_NONE, &die_on_error, 0,   "die on errors", NULL},
+               {"showall",       0, POPT_ARG_NONE, &showall,    0,      "display all operations", NULL},
+               {"oldlist",       0, POPT_ARG_NONE, &old_list,    0,     "use old list call", NULL},
+               {"maskchars",     0, POPT_ARG_STRING,   &maskchars,    0,"mask characters",     NULL},
+               {"filechars",     0, POPT_ARG_STRING,   &filechars,    0,"file characters",     NULL},
+               POPT_COMMON_SAMBA
+               POPT_COMMON_CONNECTION
+               POPT_COMMON_CREDENTIALS
+               POPT_COMMON_VERSION
+               {0}
+       };
 
        setlinebuf(stdout);
+       seed = time(NULL);
 
-       setup_logging("masktest", DEBUG_STDOUT);
-
-       lp_set_cmdline(global_loadparm, "log level", "0");
-
-       if (argc < 2 || argv[1][0] == '-') {
-               usage();
+       mem_ctx = talloc_named_const(NULL, 0, "masktest_ctx");
+       if (mem_ctx == NULL) {
                exit(1);
        }
 
-       share = argv[1];
+       pc = poptGetContext("locktest", argc, argv, long_options,
+                           POPT_CONTEXT_KEEP_FIRST);
 
-       all_string_sub(share,"/","\\",0);
+       poptSetOtherOptionHelp(pc, "<unc>");
 
-       setup_logging(argv[0], DEBUG_STDOUT);
+       while((opt = poptGetNextOpt(pc)) != -1) {
+               switch (opt) {
+               case OPT_UNCLIST:
+                       lpcfg_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc));
+                       break;
+               }
+       }
 
-       argc -= 1;
-       argv += 1;
+       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 >= 2)) {
+               usage(pc);
+               talloc_free(mem_ctx);
+               exit(1);
+       }
 
-       lp_load(dyn_CONFIGFILE);
+       setup_logging("masktest", DEBUG_STDOUT);
 
-       credentials = cli_credentials_init(talloc_autofree_context());
-       cli_credentials_guess(credentials);
+       share = argv_new[1];
 
-       seed = time(NULL);
+       all_string_sub(share,"/","\\",0);
 
-       init_iconv();
+       lp_ctx = cmdline_lp_ctx;
 
-       while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vEl:")) != EOF) {
-               switch (opt) {
-               case 'n':
-                       NumLoops = atoi(optarg);
-                       break;
-               case 'd':
-                       DEBUGLEVEL = atoi(optarg);
-                       break;
-               case 'E':
-                       die_on_error = 1;
-                       break;
-               case 'v':
-                       verbose++;
-                       break;
-               case 'M':
-                       lp_set_cmdline(global_loadparm, "max protocol", optarg);
-                       break;
-               case 'U':
-                       cli_credentials_parse_string(credentials, optarg, CRED_SPECIFIED);
-                       break;
-               case 's':
-                       seed = atoi(optarg);
-                       break;
-               case 'h':
-                       usage();
-                       exit(1);
-               case 'm':
-                       maskchars = optarg;
-                       break;
-               case 'l':
-                       max_length = atoi(optarg);
-                       break;
-               case 'f':
-                       filechars = optarg;
-                       break;
-               case 'a':
-                       showall = 1;
-                       break;
-               case 'o':
-                       old_list = true;
-                       break;
-               default:
-                       printf("Unknown option %c (%d)\n", (char)opt, opt);
-                       exit(1);
-               }
-       }
+       ev = s4_event_context_init(mem_ctx);
 
        gensec_init();
 
-       argc -= optind;
-       argv += optind;
+       lpcfg_smbcli_options(lp_ctx, &options);
+       lpcfg_smbcli_session_options(lp_ctx, &session_options);
 
-       cli = connect_one(share);
+       cli = connect_one(lpcfg_resolve_context(lp_ctx), ev, mem_ctx, share,
+                         lpcfg_smb_ports(lp_ctx), lpcfg_socket_options(lp_ctx),
+                         &options, &session_options,
+                         lpcfg_gensec_settings(mem_ctx, lp_ctx));
        if (!cli) {
                DEBUG(0,("Failed to connect to %s\n", share));
+               talloc_free(mem_ctx);
                exit(1);
        }
 
@@ -373,7 +385,9 @@ static void usage(void)
        DEBUG(0,("seed=%d     format --- --- (server, correct)\n", seed));
        srandom(seed);
 
-       test_mask(argc, argv, cli);
+       test_mask(argc_new-1, argv_new+1, mem_ctx, cli);
 
+       poptFreeContext(pc);
+       talloc_free(mem_ctx);
        return(0);
 }