version 1.6, 2000/04/14 10:30:31 |
version 1.6.2.4, 2001/03/12 15:44:12 |
|
|
/* |
/* |
* |
|
* match.c |
|
* |
|
* Author: Tatu Ylonen <ylo@cs.hut.fi> |
* Author: Tatu Ylonen <ylo@cs.hut.fi> |
* |
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
* All rights reserved |
* All rights reserved |
* |
|
* Created: Thu Jun 22 01:17:50 1995 ylo |
|
* |
|
* Simple pattern matching, with '*' and '?' as wildcards. |
* Simple pattern matching, with '*' and '?' as wildcards. |
* |
* |
|
* As far as I am concerned, the code I have written for this software |
|
* can be used freely for any purpose. Any derived versions of this |
|
* software must be clearly marked as such, and if the derived work is |
|
* incompatible with the protocol description in the RFC file, it must be |
|
* called by a name other than "ssh" or "Secure Shell". |
*/ |
*/ |
|
|
#include "includes.h" |
#include "includes.h" |
RCSID("$Id$"); |
RCSID("$OpenBSD$"); |
|
|
#include "ssh.h" |
#include "match.h" |
|
|
/* |
/* |
* Returns true if the given string matches the pattern (which may contain ? |
* Returns true if the given string matches the pattern (which may contain ? |
|
|
/* |
/* |
* Tries to match the host name (which must be in all lowercase) against the |
* Tries to match the host name (which must be in all lowercase) 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 true if there is a positive match; zero |
* indicate negation). Returns -1 if negation matches, 1 if there is |
* otherwise. |
* a positive match, 0 if there is no match at all. |
*/ |
*/ |
|
|
int |
int |
match_hostname(const char *host, const char *pattern, unsigned int len) |
match_hostname(const char *host, const char *pattern, u_int len) |
{ |
{ |
char sub[1024]; |
char sub[1024]; |
int negated; |
int negated; |
int got_positive; |
int got_positive; |
unsigned int i, subi; |
u_int i, subi; |
|
|
got_positive = 0; |
got_positive = 0; |
for (i = 0; i < len;) { |
for (i = 0; i < len;) { |
|
|
/* Try to match the subpattern against the host name. */ |
/* Try to match the subpattern against the host name. */ |
if (match_pattern(host, sub)) { |
if (match_pattern(host, sub)) { |
if (negated) |
if (negated) |
return 0; /* Fail */ |
return -1; /* Negative */ |
else |
else |
got_positive = 1; |
got_positive = 1; /* Positive */ |
} |
} |
} |
} |
|
|
/* |
/* |
* Return success if got a positive match. If there was a negative |
* Return success if got a positive match. If there was a negative |
* match, we have already returned zero and never get here. |
* match, we have already returned -1 and never get here. |
*/ |
*/ |
return got_positive; |
return got_positive; |
} |
} |