12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- --- /tmp/hosts_access.c 2003-08-03 22:18:00.000000000 +0000
- +++ hosts_access.c 2003-08-03 22:39:44.000000000 +0000
- @@ -289,6 +289,17 @@
- {
- int n;
-
- +#ifndef DISABLE_WILDCARD_MATCHING
- + if (strchr(tok, '*') || strchr(tok,'?')) { /* contains '*' or '?' */
- + /* we must convert the both to lowercase as match_pattern_ylo is case-sensitive */
- + for (n = 0; n < strlen(tok); n++)
- + tok[n] = isupper(tok[n]) ? tolower(tok[n]) : tok[n];
- + for (n = 0; n < strlen(string); n++)
- + string[n] = isupper(string[n]) ? tolower(string[n]) : string[n];
- + return (match_pattern_ylo(string,tok));
- + } else
- +#endif
- +
- if (tok[0] == '.') { /* suffix */
- n = strlen(string) - strlen(tok);
- return (n > 0 && STR_EQ(tok, string + n));
- @@ -329,3 +340,72 @@
- }
- return ((addr & mask) == net);
- }
- +
- +#ifndef DISABLE_WILDCARD_MATCHING
- +/* Note: this feature has been adapted in a pretty straightforward way
- + from Tatu Ylonen's last SSH version under free license by
- + Pekka Savola <pekkas@netcore.fi>.
- +
- + Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- +*/
- +
- +/* Returns true if the given string matches the pattern (which may contain
- + ? and * as wildcards), and zero if it does not match. */
- +
- +int match_pattern_ylo(const char *s, const char *pattern)
- +{
- + while (1)
- + {
- + /* If at end of pattern, accept if also at end of string. */
- + if (!*pattern)
- + return !*s;
- +
- + /* Process '*'. */
- + if (*pattern == '*')
- + {
- + /* Skip the asterisk. */
- + pattern++;
- +
- + /* If at end of pattern, accept immediately. */
- + if (!*pattern)
- + return 1;
- +
- + /* If next character in pattern is known, optimize. */
- + if (*pattern != '?' && *pattern != '*')
- + {
- + /* Look instances of the next character in pattern, and try
- + to match starting from those. */
- + for (; *s; s++)
- + if (*s == *pattern &&
- + match_pattern_ylo(s + 1, pattern + 1))
- + return 1;
- + /* Failed. */
- + return 0;
- + }
- +
- + /* Move ahead one character at a time and try to match at each
- + position. */
- + for (; *s; s++)
- + if (match_pattern_ylo(s, pattern))
- + return 1;
- + /* Failed. */
- + return 0;
- + }
- +
- + /* There must be at least one more character in the string. If we are
- + at the end, fail. */
- + if (!*s)
- + return 0;
- +
- + /* Check if the next character of the string is acceptable. */
- + if (*pattern != '?' && *pattern != *s)
- + return 0;
- +
- + /* Move to the next character, both in string and in pattern. */
- + s++;
- + pattern++;
- + }
- + /*NOTREACHED*/
- +}
- +#endif /* DISABLE_WILDCARD_MATCHING */
- +
|