1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-04 17:47:26 +03:00

a snapshot of my attempts to get wildcard matching right for LANMAN1

clients. This is not complete and not correct - expect some more work
on this soon
(This used to be commit 06d158d5e91a222e6bf8d22f02107c60da383f82)
This commit is contained in:
Andrew Tridgell 2001-02-25 23:47:27 +00:00
parent 96e791eb11
commit f7602aaaa6

View File

@ -27,20 +27,110 @@ extern int DEBUGLEVEL;
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 char *maskchars = "<>\"?*abc.";
static char *filechars = "abcdefghijklm.";
/* a test fn for LANMAN mask support */
int ms_fnmatch_lanman_core(char *pattern, char *string)
{
char *p = pattern, *n = string;
char c;
// printf("ms_fnmatch_lanman_core(%s, %s)\n", pattern, string);
while ((c = *p++)) {
switch (c) {
case '?':
if (*n == 0 && ms_fnmatch_lanman_core(p, n) == 0) return 0;
if (! *n && !*p) return 0;
n++;
break;
case '>':
if (n[0] == '.') {
if (! n[1] && ms_fnmatch_lanman_core(p, n+1) == 0) return 0;
if (ms_fnmatch_lanman_core(p, n) == 0) return 0;
return -1;
}
if (! *n) return ms_fnmatch_lanman_core(p, n);
n++;
break;
case '*':
for (; *n; n++) {
if (ms_fnmatch_lanman_core(p, n) == 0) return 0;
}
break;
case '<':
for (; *n; n++) {
if (ms_fnmatch_lanman_core(p, n) == 0) return 0;
if (*n == '.' && !strchr(n+1,'.')) {
n++;
break;
}
}
break;
case '"':
if (*n == 0 && ms_fnmatch_lanman_core(p, n) == 0) return 0;
if (*n != '.') return -1;
n++;
break;
default:
if (c != *n) return -1;
n++;
}
}
if (! *n) return 0;
return -1;
}
int ms_fnmatch_lanman(char *pattern, char *string)
{
pstring p_base, p_ext="", s_base, s_ext="";
char *p;
pstrcpy(p_base, pattern);
pstrcpy(s_base, string);
p = strrchr(p_base,'.');
if (p) {
*p = 0;
pstrcpy(p_ext, p+1);
}
p = strrchr(s_base,'.');
if (p) {
*p = 0;
pstrcpy(s_ext, p+1);
}
//printf("[%s/%s] [%s/%s] [%s/%s]\n",
// pattern, string, p_base, s_base, p_ext, s_ext);
return ms_fnmatch_lanman_core(p_base, s_base) ||
ms_fnmatch_lanman_core(p_ext, s_ext);
}
static BOOL reg_match_one(char *pattern, char *file)
{
if (strcmp(file,"..") == 0) file = ".";
if (strcmp(pattern,".") == 0) return False;
/* oh what a weird world this is */
if (old_list && strcmp(pattern, "*.*") == 0) return True;
if (max_protocol <= PROTOCOL_LANMAN2) {
return ms_fnmatch_lanman(pattern, file)==0;
}
if (strcmp(file,"..") == 0) file = ".";
if (strcmp(pattern,".") == 0) return False;
return ms_fnmatch(pattern, file)==0;
}
@ -50,7 +140,7 @@ static char *reg_test(char *pattern, char *file, char *short_name)
fstrcpy(ret, "---");
pattern = 1+strrchr(pattern,'\\');
file = 1+strrchr(file,'\\');
// file = 1+strrchr(file,'\\');
if (reg_match_one(pattern, ".")) ret[0] = '+';
if (reg_match_one(pattern, "..")) ret[1] = '+';
@ -95,6 +185,8 @@ struct cli_state *connect_one(char *share)
return NULL;
}
c->protocol = max_protocol;
if (!cli_session_request(c, &calling, &called)) {
DEBUG(0,("session request to %s failed\n", called.name));
cli_shutdown(c);
@ -170,12 +262,14 @@ void listfn(file_info *f, const char *s, void *state)
}
static void get_short_name(struct cli_state *cli,
char *name, fstring short_name)
char *name, pstring long_name, fstring short_name)
{
cli_list(cli, name, aHIDDEN | aDIR, listfn, NULL);
cli_list(cli, "\\masktest\\*.*", aHIDDEN | aDIR, listfn, NULL);
if (finfo) {
fstrcpy(short_name, finfo->short_name);
strlower(short_name);
pstrcpy(long_name, finfo->name);
strlower(long_name);
}
}
@ -186,6 +280,7 @@ static void testpair(struct cli_state *cli, char *mask, char *file)
char *res2;
static int count;
fstring short_name;
pstring long_name;
count++;
@ -204,13 +299,13 @@ static void testpair(struct cli_state *cli, char *mask, char *file)
if (old_list) {
cli_list_old(cli, mask, aHIDDEN | aDIR, listfn, NULL);
} else {
get_short_name(cli, file, short_name);
get_short_name(cli, file, long_name, short_name);
finfo = NULL;
fstrcpy(res1, "---");
cli_list(cli, mask, aHIDDEN | aDIR, listfn, NULL);
}
res2 = reg_test(mask, file, short_name);
res2 = reg_test(mask, long_name, short_name);
if (showall || strcmp(res1, res2)) {
DEBUG(0,("%s %s %d mask=[%s] file=[%s] mfile=[%s]\n",
@ -341,8 +436,11 @@ static void usage(void)
seed = time(NULL);
while ((opt = getopt(argc, argv, "U:s:hm:f:aoW:")) != EOF) {
while ((opt = getopt(argc, argv, "U:s:hm:f:aoW:M:")) != EOF) {
switch (opt) {
case 'M':
max_protocol = interpret_protocol(optarg, max_protocol);
break;
case 'U':
pstrcpy(username,optarg);
p = strchr(username,'%');