libndr: Avoid assigning duplicate versions to symbols
[amitay/samba.git] / source4 / torture / masktest.c
index 201738626b3d3a25f0590b6104285a6935318554..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"
 
-#define MAX_STRING_LEN 1024
-
-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)
 {
@@ -50,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,'\\');
 
@@ -71,25 +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, const char **ports)
+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;
@@ -107,6 +119,8 @@ 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)) {
@@ -114,15 +128,18 @@ static void listfn(struct clilist_file_info *f, const char *s, void *state)
        } else {
                resultp[2] = '+';
        }
-       safe_strcpy(last_hit.long_name, f->name, MAX_STRING_LEN);
-       safe_strcpy(last_hit.short_name, f->short_name, MAX_STRING_LEN);
+
+       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(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
-                         char *long_name, fstring short_name)
+                         char **long_name, char **short_name)
 {
        const char *mask;
+       struct masktest_state state;
+
        if (cli->transport->negotiate.protocol <= PROTOCOL_LANMAN1) {
                mask = "\\masktest\\*.*";
        } else {
@@ -130,23 +147,21 @@ static void get_real_name(TALLOC_CTX *mem_ctx, struct smbcli_state *cli,
        }
 
        f_info_hit = false;
-       last_hit.short_name = talloc_array(mem_ctx, char, MAX_STRING_LEN);
-       last_hit.long_name = talloc_array(mem_ctx, char, MAX_STRING_LEN);
+
+       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);
-               safe_strcpy(long_name, last_hit.long_name, MAX_STRING_LEN);
-               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);
        }
 }
 
@@ -154,16 +169,18 @@ 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;
-       char *long_name;
+       char *short_name = NULL;
+       char *long_name = NULL;
+       struct masktest_state state;
 
-       long_name = talloc_array(mem_ctx, char, MAX_STRING_LEN);
        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) {
@@ -173,15 +190,15 @@ static void testpair(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, char *mask,
        smbcli_close(cli->tree, fnum);
 
        resultp = res1;
-       fstrcpy(short_name, "");
-       get_real_name(mem_ctx, 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",
@@ -197,28 +214,24 @@ static void testpair(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, char *mask,
 }
 
 static void test_mask(int argc, char *argv[],
+                                         TALLOC_CTX *mem_ctx,
                      struct smbcli_state *cli)
 {
-       TALLOC_CTX *mem_ctx;
        char *mask, *file;
        int l1, l2, i, l;
        int mc_len = strlen(maskchars);
        int fc_len = strlen(filechars);
 
-       mem_ctx = talloc_init("test_mask");
-       mask = talloc_array(mem_ctx, char, MAX_STRING_LEN);
-       file = talloc_array(mem_ctx, char, MAX_STRING_LEN);
-
        smbcli_mkdir(cli->tree, "\\masktest");
 
        smbcli_unlink(cli->tree, "\\masktest\\*");
 
        if (argc >= 2) {
                while (argc >= 2) {
-                       safe_strcpy(mask,"\\masktest\\", MAX_STRING_LEN);
-                       safe_strcpy(file,"\\masktest\\", MAX_STRING_LEN);
-                       safe_strcat(mask, argv[0], MAX_STRING_LEN);
-                       safe_strcat(file, argv[1], MAX_STRING_LEN);
+                       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;
@@ -229,8 +242,10 @@ static void test_mask(int argc, char *argv[],
        while (1) {
                l1 = 1 + random() % max_length;
                l2 = 1 + random() % max_length;
-               safe_strcpy(mask,"\\masktest\\", MAX_STRING_LEN);
-               safe_strcpy(file,"\\masktest\\", MAX_STRING_LEN);
+               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];
@@ -255,128 +270,114 @@ static void test_mask(int argc, char *argv[],
 
  finished:
        smbcli_rmdir(cli->tree, "\\masktest");
-       talloc_free(mem_ctx);
 }
 
 
-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);
-
-       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];
-
-       all_string_sub(share,"/","\\",0);
-
-       setup_logging(argv[0], DEBUG_STDOUT);
-
-       argc -= 1;
-       argv += 1;
-
-       lp_ctx = loadparm_init(talloc_autofree_context());
-       lp_load(lp_ctx, dyn_CONFIGFILE);
+       pc = poptGetContext("locktest", argc, argv, long_options,
+                           POPT_CONTEXT_KEEP_FIRST);
 
-       credentials = cli_credentials_init(talloc_autofree_context());
-       cli_credentials_guess(credentials, lp_ctx);
+       poptSetOtherOptionHelp(pc, "<unc>");
 
-       seed = time(NULL);
-
-       while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vEl:")) != EOF) {
+       while((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
-               case 'n':
-                       NumLoops = atoi(optarg);
-                       break;
-               case 'd':
-                       DEBUGLEVEL = atoi(optarg);
+               case OPT_UNCLIST:
+                       lpcfg_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc));
                        break;
-               case 'E':
-                       die_on_error = 1;
-                       break;
-               case 'v':
-                       verbose++;
-                       break;
-               case 'M':
-                       lp_set_cmdline(lp_ctx, "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;
+               }
+       }
+
+       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;
-               default:
-                       printf("Unknown option %c (%d)\n", (char)opt, opt);
-                       exit(1);
                }
        }
 
-       gensec_init(lp_ctx);
+       if (!(argc_new >= 2)) {
+               usage(pc);
+               talloc_free(mem_ctx);
+               exit(1);
+       }
+
+       setup_logging("masktest", DEBUG_STDOUT);
+
+       share = argv_new[1];
 
-       argc -= optind;
-       argv += optind;
+       all_string_sub(share,"/","\\",0);
 
-       cli = connect_one(share, lp_smb_ports(lp_ctx));
+       lp_ctx = cmdline_lp_ctx;
+
+       ev = s4_event_context_init(mem_ctx);
+
+       gensec_init();
+
+       lpcfg_smbcli_options(lp_ctx, &options);
+       lpcfg_smbcli_session_options(lp_ctx, &session_options);
+
+       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);
        }
 
@@ -384,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);
 }