mirror of
https://github.com/samba-team/samba.git
synced 2025-01-08 21:18:16 +03:00
lib: Add "is_case_sensitive" to ms_fnmatch_protocol
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
parent
07d9a909ba
commit
f969be5441
@ -59,7 +59,8 @@ struct max_n {
|
||||
not contain a '.', otherwise it points at the last dot in 'n'.
|
||||
*/
|
||||
static int ms_fnmatch_core(const char *p, const char *n,
|
||||
struct max_n *max_n, const char *ldot)
|
||||
struct max_n *max_n, const char *ldot,
|
||||
bool is_case_sensitive)
|
||||
{
|
||||
codepoint_t c, c2;
|
||||
int i;
|
||||
@ -76,7 +77,7 @@ static int ms_fnmatch_core(const char *p, const char *n,
|
||||
}
|
||||
for (i=0; n[i]; i += size_n) {
|
||||
next_codepoint(n+i, &size_n);
|
||||
if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) {
|
||||
if (ms_fnmatch_core(p, n+i, max_n+1, ldot, is_case_sensitive) == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -95,9 +96,9 @@ static int ms_fnmatch_core(const char *p, const char *n,
|
||||
}
|
||||
for (i=0; n[i]; i += size_n) {
|
||||
next_codepoint(n+i, &size_n);
|
||||
if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) return 0;
|
||||
if (ms_fnmatch_core(p, n+i, max_n+1, ldot, is_case_sensitive) == 0) return 0;
|
||||
if (n+i == ldot) {
|
||||
if (ms_fnmatch_core(p, n+i+size_n, max_n+1, ldot) == 0) return 0;
|
||||
if (ms_fnmatch_core(p, n+i+size_n, max_n+1, ldot, is_case_sensitive) == 0) return 0;
|
||||
if (!max_n->postdot || max_n->postdot > n) max_n->postdot = n;
|
||||
return -1;
|
||||
}
|
||||
@ -140,8 +141,13 @@ static int ms_fnmatch_core(const char *p, const char *n,
|
||||
|
||||
default:
|
||||
c2 = next_codepoint(n, &size_n);
|
||||
if (c != c2 && codepoint_cmpi(c, c2) != 0) {
|
||||
return -1;
|
||||
if (c != c2) {
|
||||
if (is_case_sensitive) {
|
||||
return -1;
|
||||
}
|
||||
if (codepoint_cmpi(c, c2) != 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
n += size_n;
|
||||
break;
|
||||
@ -155,7 +161,8 @@ static int ms_fnmatch_core(const char *p, const char *n,
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol)
|
||||
int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol,
|
||||
bool is_case_sensitive)
|
||||
{
|
||||
int ret, count, i;
|
||||
struct max_n *max_n = NULL;
|
||||
@ -193,7 +200,8 @@ int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol)
|
||||
p[i] = '<';
|
||||
}
|
||||
}
|
||||
ret = ms_fnmatch_protocol(p, string, PROTOCOL_NT1);
|
||||
ret = ms_fnmatch_protocol(p, string, PROTOCOL_NT1,
|
||||
is_case_sensitive);
|
||||
talloc_free(p);
|
||||
return ret;
|
||||
}
|
||||
@ -207,7 +215,8 @@ int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ms_fnmatch_core(pattern, string, max_n, strrchr(string, '.'));
|
||||
ret = ms_fnmatch_core(pattern, string, max_n, strrchr(string, '.'),
|
||||
is_case_sensitive);
|
||||
|
||||
talloc_free(max_n);
|
||||
|
||||
@ -218,5 +227,5 @@ int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol)
|
||||
/** a generic fnmatch function - uses for non-CIFS pattern matching */
|
||||
int gen_fnmatch(const char *pattern, const char *string)
|
||||
{
|
||||
return ms_fnmatch_protocol(pattern, string, PROTOCOL_NT1);
|
||||
return ms_fnmatch_protocol(pattern, string, PROTOCOL_NT1, false);
|
||||
}
|
||||
|
@ -526,7 +526,8 @@ _PUBLIC_ int sys_fsusage(const char *path, uint64_t *dfree, uint64_t *dsize);
|
||||
* @brief MS-style Filename matching
|
||||
*/
|
||||
|
||||
int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol);
|
||||
int ms_fnmatch_protocol(const char *pattern, const char *string, int protocol,
|
||||
bool is_case_sensitive);
|
||||
|
||||
/** a generic fnmatch function - uses for non-CIFS pattern matching */
|
||||
int gen_fnmatch(const char *pattern, const char *string);
|
||||
|
@ -311,12 +311,14 @@ static bool mask_match(struct smbcli_state *c, const char *string,
|
||||
return false;
|
||||
|
||||
if (is_case_sensitive)
|
||||
return ms_fnmatch_protocol(pattern, string,
|
||||
c->transport->negotiate.protocol) == 0;
|
||||
return ms_fnmatch_protocol(
|
||||
pattern, string, c->transport->negotiate.protocol,
|
||||
true) == 0;
|
||||
|
||||
p2 = strlower_talloc(NULL, pattern);
|
||||
s2 = strlower_talloc(NULL, string);
|
||||
ret = ms_fnmatch_protocol(p2, s2, c->transport->negotiate.protocol) == 0;
|
||||
ret = ms_fnmatch_protocol(p2, s2, c->transport->negotiate.protocol,
|
||||
true) == 0;
|
||||
talloc_free(p2);
|
||||
talloc_free(s2);
|
||||
|
||||
|
@ -105,7 +105,8 @@ struct cifspsx_dir *cifspsx_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request
|
||||
if (!low_name) { continue; }
|
||||
|
||||
/* check it matches the wildcard pattern */
|
||||
if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1) != 0) {
|
||||
if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1,
|
||||
true) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -199,7 +199,8 @@ const char *pvfs_list_next(struct pvfs_dir *dir, off_t *ofs)
|
||||
if (*ofs == DIR_OFFSET_DOT) {
|
||||
(*ofs) = DIR_OFFSET_DOTDOT;
|
||||
dir->offset = *ofs;
|
||||
if (ms_fnmatch_protocol(dir->pattern, ".", protocol) == 0) {
|
||||
if (ms_fnmatch_protocol(dir->pattern, ".", protocol,
|
||||
true) == 0) {
|
||||
dcache_add(dir, ".");
|
||||
return ".";
|
||||
}
|
||||
@ -208,7 +209,8 @@ const char *pvfs_list_next(struct pvfs_dir *dir, off_t *ofs)
|
||||
if (*ofs == DIR_OFFSET_DOTDOT) {
|
||||
(*ofs) = DIR_OFFSET_BASE;
|
||||
dir->offset = *ofs;
|
||||
if (ms_fnmatch_protocol(dir->pattern, "..", protocol) == 0) {
|
||||
if (ms_fnmatch_protocol(dir->pattern, "..", protocol,
|
||||
true) == 0) {
|
||||
dcache_add(dir, "..");
|
||||
return "..";
|
||||
}
|
||||
@ -228,10 +230,12 @@ const char *pvfs_list_next(struct pvfs_dir *dir, off_t *ofs)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ms_fnmatch_protocol(dir->pattern, dname, protocol) != 0) {
|
||||
if (ms_fnmatch_protocol(dir->pattern, dname, protocol,
|
||||
true) != 0) {
|
||||
char *short_name = pvfs_short_name_component(dir->pvfs, dname);
|
||||
if (short_name == NULL ||
|
||||
ms_fnmatch_protocol(dir->pattern, short_name, protocol) != 0) {
|
||||
ms_fnmatch_protocol(dir->pattern, short_name,
|
||||
protocol, true) != 0) {
|
||||
talloc_free(short_name);
|
||||
continue;
|
||||
}
|
||||
|
@ -101,7 +101,8 @@ struct svfs_dir *svfs_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request *req,
|
||||
if (!low_name) { continue; }
|
||||
|
||||
/* check it matches the wildcard pattern */
|
||||
if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1) != 0) {
|
||||
if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1,
|
||||
true) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,8 @@ static bool reg_match_one(struct smbcli_state *cli, const char *pattern, const c
|
||||
|
||||
if (ISDOTDOT(file)) file = ".";
|
||||
|
||||
return ms_fnmatch_protocol(pattern, file, cli->transport->negotiate.protocol)==0;
|
||||
return ms_fnmatch_protocol(
|
||||
pattern, file, cli->transport->negotiate.protocol, true)==0;
|
||||
}
|
||||
|
||||
static char *reg_test(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *pattern, const char *long_name, const char *short_name)
|
||||
|
Loading…
Reference in New Issue
Block a user