version 1.14, 2001/06/27 04:48:53 |
version 1.14.2.1, 2002/03/07 17:37:46 |
|
|
} |
} |
|
|
/* |
/* |
* Tries to match the host name (which must be in all lowercase) against the |
* Tries to match the string against the |
* comma-separated sequence of subpatterns (each possibly preceded by ! to |
* comma-separated sequence of subpatterns (each possibly preceded by ! to |
* indicate negation). Returns -1 if negation matches, 1 if there is |
* indicate negation). Returns -1 if negation matches, 1 if there is |
* a positive match, 0 if there is no match at all. |
* a positive match, 0 if there is no match at all. |
*/ |
*/ |
|
|
int |
int |
match_hostname(const char *host, const char *pattern, u_int len) |
match_pattern_list(const char *string, const char *pattern, u_int len, |
|
int dolower) |
{ |
{ |
char sub[1024]; |
char sub[1024]; |
int negated; |
int negated; |
|
|
* subpattern to lowercase. |
* subpattern to lowercase. |
*/ |
*/ |
for (subi = 0; |
for (subi = 0; |
i < len && subi < sizeof(sub) - 1 && pattern[i] != ','; |
i < len && subi < sizeof(sub) - 1 && pattern[i] != ','; |
subi++, i++) |
subi++, i++) |
sub[subi] = isupper(pattern[i]) ? tolower(pattern[i]) : pattern[i]; |
sub[subi] = dolower && isupper(pattern[i]) ? |
|
tolower(pattern[i]) : pattern[i]; |
/* If subpattern too long, return failure (no match). */ |
/* If subpattern too long, return failure (no match). */ |
if (subi >= sizeof(sub) - 1) |
if (subi >= sizeof(sub) - 1) |
return 0; |
return 0; |
|
|
/* Null-terminate the subpattern. */ |
/* Null-terminate the subpattern. */ |
sub[subi] = '\0'; |
sub[subi] = '\0'; |
|
|
/* Try to match the subpattern against the host name. */ |
/* Try to match the subpattern against the string. */ |
if (match_pattern(host, sub)) { |
if (match_pattern(string, sub)) { |
if (negated) |
if (negated) |
return -1; /* Negative */ |
return -1; /* Negative */ |
else |
else |
|
|
} |
} |
|
|
/* |
/* |
|
* Tries to match the host name (which must be in all lowercase) against the |
|
* comma-separated sequence of subpatterns (each possibly preceded by ! to |
|
* indicate negation). Returns -1 if negation matches, 1 if there is |
|
* a positive match, 0 if there is no match at all. |
|
*/ |
|
int |
|
match_hostname(const char *host, const char *pattern, u_int len) |
|
{ |
|
return match_pattern_list(host, pattern, len, 1); |
|
} |
|
|
|
/* |
* returns 0 if we get a negative match for the hostname or the ip |
* returns 0 if we get a negative match for the hostname or the ip |
* or if we get no match at all. returns 1 otherwise. |
* or if we get no match at all. returns 1 otherwise. |
*/ |
*/ |
|
|
* Returns first item from client-list that is also supported by server-list, |
* Returns first item from client-list that is also supported by server-list, |
* caller must xfree() returned string. |
* caller must xfree() returned string. |
*/ |
*/ |
#define MAX_PROP 20 |
#define MAX_PROP 40 |
#define SEP "," |
#define SEP "," |
char * |
char * |
match_list(const char *client, const char *server, u_int *next) |
match_list(const char *client, const char *server, u_int *next) |
|
|
s = sp = xstrdup(server); |
s = sp = xstrdup(server); |
|
|
for ((p = strsep(&sp, SEP)), i=0; p && *p != '\0'; |
for ((p = strsep(&sp, SEP)), i=0; p && *p != '\0'; |
(p = strsep(&sp, SEP)), i++) { |
(p = strsep(&sp, SEP)), i++) { |
if (i < MAX_PROP) |
if (i < MAX_PROP) |
sproposals[i] = p; |
sproposals[i] = p; |
else |
else |
|
|
nproposals = i; |
nproposals = i; |
|
|
for ((p = strsep(&cp, SEP)), i=0; p && *p != '\0'; |
for ((p = strsep(&cp, SEP)), i=0; p && *p != '\0'; |
(p = strsep(&cp, SEP)), i++) { |
(p = strsep(&cp, SEP)), i++) { |
for (j = 0; j < nproposals; j++) { |
for (j = 0; j < nproposals; j++) { |
if (strcmp(p, sproposals[j]) == 0) { |
if (strcmp(p, sproposals[j]) == 0) { |
ret = xstrdup(p); |
ret = xstrdup(p); |