s3: Change sockaddr util function names for consistency
[samba.git] / source3 / torture / masktest.c
index 7d751fb789ae5f537f59d2335be6b371b5060615..8fea15877f14922a3008fc579640fcd2eb443f45 100644 (file)
@@ -5,7 +5,7 @@
    
    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
+   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,
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#define NO_SYSLOG
-
 #include "includes.h"
 
 static fstring password;
 static fstring username;
 static int got_pass;
 static int max_protocol = PROTOCOL_NT1;
-static BOOL showall = False;
-static BOOL old_list = False;
+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 ignore_dot_errors = 0;
+
+extern char *optarg;
+extern int optind;
+extern bool AllowDebugChange;
 
 /* a test fn for LANMAN mask support */
-int ms_fnmatch_lanman_core(const char *pattern, const char *string)
+static int ms_fnmatch_lanman_core(const char *pattern, const char *string)
 {
        const char *p = pattern, *n = string;
        char c;
@@ -93,9 +95,9 @@ int ms_fnmatch_lanman_core(const char *pattern, const char *string)
                        n++;
                }
        }
-       
+
        if (! *n) goto match;
-       
+
  nomatch:
        if (verbose) printf("NOMATCH pattern=[%s] string=[%s]\n", pattern, string);
        return -1;
@@ -109,7 +111,7 @@ next:
        return 0;
 }
 
-int ms_fnmatch_lanman(const char *pattern, const char *string)
+static int ms_fnmatch_lanman(const char *pattern, const char *string)
 {
        if (!strpbrk(pattern, "?*<>\"")) {
                if (strcmp(string,"..") == 0) 
@@ -126,7 +128,7 @@ int ms_fnmatch_lanman(const char *pattern, const char *string)
        return ms_fnmatch_lanman_core(pattern, string);
 }
 
-static BOOL reg_match_one(struct cli_state *cli, const char *pattern, const char *file)
+static bool reg_match_one(struct cli_state *cli, const char *pattern, const char *file)
 {
        /* oh what a weird world this is */
        if (old_list && strcmp(pattern, "*.*") == 0) return True;
@@ -139,20 +141,19 @@ static BOOL reg_match_one(struct cli_state *cli, const char *pattern, const char
 
        if (strcmp(file,"..") == 0) file = ".";
 
-       return ms_fnmatch(pattern, file, cli->protocol)==0;
+       return ms_fnmatch(pattern, file, cli->protocol, False) == 0;
 }
 
-static char *reg_test(struct cli_state *cli, char *pattern, char *long_name, char *short_name)
+static char *reg_test(struct cli_state *cli, const char *pattern, const char *long_name, const char *short_name)
 {
        static fstring ret;
-       fstrcpy(ret, "---");
+       const char *new_pattern = 1+strrchr_m(pattern,'\\');
 
-       pattern = 1+strrchr_m(pattern,'\\');
-
-       if (reg_match_one(cli, pattern, ".")) ret[0] = '+';
-       if (reg_match_one(cli, pattern, "..")) ret[1] = '+';
-       if (reg_match_one(cli, pattern, long_name) || 
-           (*short_name && reg_match_one(cli, pattern, short_name))) ret[2] = '+';
+       fstrcpy(ret, "---");
+       if (reg_match_one(cli, new_pattern, ".")) ret[0] = '+';
+       if (reg_match_one(cli, new_pattern, "..")) ret[1] = '+';
+       if (reg_match_one(cli, new_pattern, long_name) ||
+           (*short_name && reg_match_one(cli, new_pattern, short_name))) ret[2] = '+';
        return ret;
 }
 
@@ -160,13 +161,14 @@ static char *reg_test(struct cli_state *cli, char *pattern, char *long_name, cha
 /***************************************************** 
 return a connection to a server
 *******************************************************/
-struct cli_state *connect_one(char *share)
+static struct cli_state *connect_one(char *share)
 {
        struct cli_state *c;
        struct nmb_name called, calling;
        char *server_n;
        char *server;
-       struct in_addr ip;
+       struct sockaddr_storage ss;
+       NTSTATUS status;
 
        server = share+2;
        share = strchr_m(server,'\\');
@@ -175,21 +177,27 @@ struct cli_state *connect_one(char *share)
        share++;
 
        server_n = server;
-       
-        zero_ip(&ip);
+
+       zero_sockaddr(&ss);
 
        make_nmb_name(&calling, "masktest", 0x0);
        make_nmb_name(&called , server, 0x20);
 
  again:
-        zero_ip(&ip);
+        zero_sockaddr(&ss);
 
        /* have to open a new connection */
-       if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, &ip)) {
+       if (!(c=cli_initialise())) {
                DEBUG(0,("Connection to %s failed\n", server_n));
                return NULL;
        }
 
+       status = cli_connect(c, server_n, &ss);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("Connection to %s failed. Error %s\n", server_n, nt_errstr(status) ));
+               return NULL;
+       }
+
        c->protocol = max_protocol;
 
        if (!cli_session_request(c, &calling, &called)) {
@@ -217,10 +225,10 @@ struct cli_state *connect_one(char *share)
                }
        }
 
-       if (!cli_session_setup(c, username, 
-                              password, strlen(password),
-                              password, strlen(password),
-                              lp_workgroup())) {
+       if (!NT_STATUS_IS_OK(cli_session_setup(c, username, 
+                                              password, strlen(password),
+                                              password, strlen(password),
+                                              lp_workgroup()))) {
                DEBUG(0,("session setup failed: %s\n", cli_errstr(c)));
                return NULL;
        }
@@ -236,7 +244,7 @@ struct cli_state *connect_one(char *share)
        if (*c->server_domain || *c->server_os || *c->server_type)
                DEBUG(1,("Domain=[%s] OS=[%s] Server=[%s]\n",
                        c->server_domain,c->server_os,c->server_type));
-       
+
        DEBUG(4,(" session setup ok\n"));
 
        if (!cli_send_tconX(c, share, "?????",
@@ -254,21 +262,22 @@ struct cli_state *connect_one(char *share)
 static char *resultp;
 static file_info *f_info;
 
-static void listfn(file_info *f, const char *s, void *state)
+static void listfn(const char *mnt, file_info *f, const char *s, void *state)
 {
        if (strcmp(f->name,".") == 0) {
                resultp[0] = '+';
        } else if (strcmp(f->name,"..") == 0) {
-               resultp[1] = '+';               
+               resultp[1] = '+';
        } else {
                resultp[2] = '+';
        }
        f_info = f;
 }
 
-static void get_real_name(struct cli_state *cli, 
-                         pstring long_name, fstring short_name)
+static void get_real_name(struct cli_state *cli,
+                         char **pp_long_name, fstring short_name)
 {
+       *pp_long_name = NULL;
        /* nasty hack to force level 260 listings - tridge */
        cli->capabilities |= CAP_NT_SMBS;
        if (max_protocol <= PROTOCOL_LANMAN1) {
@@ -278,13 +287,16 @@ static void get_real_name(struct cli_state *cli,
        }
        if (f_info) {
                fstrcpy(short_name, f_info->short_name);
-               strlower(short_name);
-               pstrcpy(long_name, f_info->name);
-               strlower(long_name);
+               strlower_m(short_name);
+               *pp_long_name = SMB_STRDUP(f_info->name);
+               if (!*pp_long_name) {
+                       return;
+               }
+               strlower_m(*pp_long_name);
        }
 
        if (*short_name == 0) {
-               fstrcpy(short_name, long_name);
+               fstrcpy(short_name, *pp_long_name);
        }
 
 #if 0
@@ -294,14 +306,14 @@ static void get_real_name(struct cli_state *cli,
 #endif
 }
 
-static void testpair(struct cli_state *cli, char *mask, char *file)
+static void testpair(struct cli_state *cli, const char *mask, const char *file)
 {
        int fnum;
        fstring res1;
        char *res2;
        static int count;
        fstring short_name;
-       pstring long_name;
+       char *long_name = NULL;
 
        count++;
 
@@ -317,14 +329,19 @@ static void testpair(struct cli_state *cli, char *mask, char *file)
        resultp = res1;
        fstrcpy(short_name, "");
        f_info = NULL;
-       get_real_name(cli, long_name, short_name);
+       get_real_name(cli, &long_name, short_name);
+       if (!long_name) {
+               return;
+       }
        f_info = NULL;
        fstrcpy(res1, "---");
        cli_list(cli, mask, aHIDDEN | aDIR, listfn, NULL);
 
        res2 = reg_test(cli, mask, long_name, short_name);
 
-       if (showall || strcmp(res1, res2)) {
+       if (showall ||
+           ((strcmp(res1, res2) && !ignore_dot_errors) ||
+            (strcmp(res1+2, res2+2) && ignore_dot_errors))) {
                DEBUG(0,("%s %s %d mask=[%s] file=[%s] rfile=[%s/%s]\n",
                         res1, res2, count, mask, file, long_name, short_name));
                if (die_on_error) exit(1);
@@ -333,15 +350,17 @@ static void testpair(struct cli_state *cli, char *mask, char *file)
        cli_unlink(cli, file);
 
        if (count % 100 == 0) DEBUG(0,("%d\n", count));
+       SAFE_FREE(long_name);
 }
 
-static void test_mask(int argc, char *argv[], 
+static void test_mask(int argc, char *argv[],
                      struct cli_state *cli)
 {
-       pstring mask, file;
+       char *mask, *file;
        int l1, l2, i, l;
        int mc_len = strlen(maskchars);
        int fc_len = strlen(filechars);
+       TALLOC_CTX *ctx = talloc_tos();
 
        cli_mkdir(cli, "\\masktest");
 
@@ -349,10 +368,15 @@ 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]);
+                       mask = talloc_asprintf(ctx,
+                                       "\\masktest\\%s",
+                                       argv[0]);
+                       file = talloc_asprintf(ctx,
+                                       "\\masktest\\%s",
+                                       argv[1]);
+                       if (!mask || !file) {
+                               goto finished;
+                       }
                        testpair(cli, mask, file);
                        argv += 2;
                        argc -= 2;
@@ -363,8 +387,13 @@ static void test_mask(int argc, char *argv[],
        while (1) {
                l1 = 1 + random() % 20;
                l2 = 1 + random() % 20;
-               pstrcpy(mask,"\\masktest\\");
-               pstrcpy(file,"\\masktest\\");
+               mask = TALLOC_ARRAY(ctx, char, strlen("\\masktest\\")+1+22);
+               file = TALLOC_ARRAY(ctx, char, strlen("\\masktest\\")+1+22);
+               if (!mask || !file) {
+                       goto finished;
+               }
+               memcpy(mask,"\\masktest\\",strlen("\\masktest\\")+1);
+               memcpy(file,"\\masktest\\",strlen("\\masktest\\")+1);
                l = strlen(mask);
                for (i=0;i<l1;i++) {
                        mask[i+l] = maskchars[random() % mc_len];
@@ -385,6 +414,8 @@ static void test_mask(int argc, char *argv[],
                testpair(cli, mask, file);
                if (NumLoops && (--NumLoops == 0))
                        break;
+               TALLOC_FREE(mask);
+               TALLOC_FREE(file);
        }
 
  finished:
@@ -409,6 +440,7 @@ static void usage(void)
        -v                             verbose mode\n\
        -E                             die on error\n\
         -a                             show all tests\n\
+        -i                             ignore . and .. errors\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\
@@ -423,13 +455,11 @@ static void usage(void)
  int main(int argc,char *argv[])
 {
        char *share;
-       struct cli_state *cli;  
-       extern char *optarg;
-       extern int optind;
-       extern BOOL AllowDebugChange;
+       struct cli_state *cli;
        int opt;
        char *p;
        int seed;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        setlinebuf(stdout);
 
@@ -452,7 +482,7 @@ static void usage(void)
        argc -= 1;
        argv += 1;
 
-       lp_load(dyn_CONFIGFILE,True,False,False);
+       lp_load(get_dyn_CONFIGFILE(),True,False,False,True);
        load_interfaces();
 
        if (getenv("USER")) {
@@ -461,7 +491,7 @@ static void usage(void)
 
        seed = time(NULL);
 
-       while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vE")) != EOF) {
+       while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vEi")) != EOF) {
                switch (opt) {
                case 'n':
                        NumLoops = atoi(optarg);
@@ -472,6 +502,9 @@ static void usage(void)
                case 'E':
                        die_on_error = 1;
                        break;
+               case 'i':
+                       ignore_dot_errors = 1;
+                       break;
                case 'v':
                        verbose++;
                        break;
@@ -527,5 +560,6 @@ static void usage(void)
 
        test_mask(argc, argv, cli);
 
+       TALLOC_FREE(frame);
        return(0);
 }