diff options
author | Jeremy Allison <jra@samba.org> | 2016-11-11 10:35:01 -0800 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2016-11-16 12:41:09 +0100 |
commit | 828b60f30debce84a057dda2551f2fd494327872 (patch) | |
tree | 0572babd9bc39f78d802e0641886f8c8fe2ef178 /source3 | |
parent | caadd8afe65cd17f47c737bb483ad05362071fb7 (diff) | |
download | samba-828b60f30debce84a057dda2551f2fd494327872.tar.gz |
lib/util: Move unix_wild_match() from source3/lib/util to lib/util/
Use top-level functions instead of source3 specific ones.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12419
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/util.c | 159 |
2 files changed, 1 insertions, 160 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 0b0a2b59325..2758dc5a47b 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -411,7 +411,7 @@ bool ms_has_wild_w(const smb_ucs2_t *s); bool mask_match(const char *string, const char *pattern, bool is_case_sensitive); bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive); bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive); -bool unix_wild_match(const char *pattern, const char *string); +#include "lib/util/unix_match.h" bool name_to_fqdn(fstring fqdn, const char *name); uint32_t map_share_mode_to_deny_mode(uint32_t share_access, uint32_t private_options); diff --git a/source3/lib/util.c b/source3/lib/util.c index 7cb613011aa..85cb9b39687 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1785,165 +1785,6 @@ bool mask_match_list(const char *string, char **list, int listLen, bool is_case_ return False; } -/********************************************************* - Recursive routine that is called by unix_wild_match. -*********************************************************/ - -static bool unix_do_match(const char *regexp, const char *str) -{ - const char *p; - - for( p = regexp; *p && *str; ) { - - switch(*p) { - case '?': - str++; - p++; - break; - - case '*': - - /* - * Look for a character matching - * the one after the '*'. - */ - p++; - if(!*p) { - return true; /* Automatic match */ - } - while(*str) { - - while(*str && (*p != *str)) { - str++; - } - - /* - * Patch from weidel@multichart.de. - * In the case of the regexp - * '*XX*' we want to ensure there are - * at least 2 'X' characters in the - * string after the '*' for a match to - * be made. - */ - - { - int matchcount=0; - - /* - * Eat all the characters that - * match, but count how many - * there were. - */ - - while(*str && (*p == *str)) { - str++; - matchcount++; - } - - /* - * Now check that if the regexp - * had n identical characters - * that matchcount had at least - * that many matches. - */ - - while (*(p+1) && (*(p+1)==*p)) { - p++; - matchcount--; - } - - if ( matchcount <= 0 ) { - return false; - } - } - - /* - * We've eaten the match char - * after the '*' - */ - str--; - - if(unix_do_match(p, str)) { - return true; - } - - if(!*str) { - return false; - } else { - str++; - } - } - return false; - - default: - if(*str != *p) { - return false; - } - str++; - p++; - break; - } - } - - if(!*p && !*str) { - return true; - } - - if (!*p && str[0] == '.' && str[1] == 0) { - return true; - } - - if (!*str && *p == '?') { - while (*p == '?') { - p++; - } - return(!*p); - } - - if(!*str && (*p == '*' && p[1] == '\0')) { - return true; - } - - return false; -} - -/******************************************************************* - Simple case insensitive interface to a UNIX wildcard matcher. - Returns True if match, False if not. -*******************************************************************/ - -bool unix_wild_match(const char *pattern, const char *string) -{ - TALLOC_CTX *ctx = talloc_stackframe(); - char *p2; - char *s2; - char *p; - bool ret = false; - - p2 = strlower_talloc(ctx, pattern); - s2 = strlower_talloc(ctx, string); - if (!p2 || !s2) { - TALLOC_FREE(ctx); - return false; - } - - /* Remove any *? and ** from the pattern as they are meaningless */ - for(p = p2; *p; p++) { - while( *p == '*' && (p[1] == '?' ||p[1] == '*')) { - memmove(&p[1], &p[2], strlen(&p[2])+1); - } - } - - if (p2[0] == '*' && p2[1] == '\0') { - TALLOC_FREE(ctx); - return true; - } - - ret = unix_do_match(p2, s2); - TALLOC_FREE(ctx); - return ret; -} - /********************************************************************** Converts a name to a fully qualified domain name. Returns true if lookup succeeded, false if not (then fqdn is set to name) |