summaryrefslogtreecommitdiff
path: root/match.c
diff options
context:
space:
mode:
Diffstat (limited to 'match.c')
-rw-r--r--match.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/match.c b/match.c
index 5386df6c4..b72efca7e 100644
--- a/match.c
+++ b/match.c
@@ -14,7 +14,7 @@
14 */ 14 */
15 15
16#include "includes.h" 16#include "includes.h"
17RCSID("$Id: match.c,v 1.3 1999/11/25 00:54:59 damien Exp $"); 17RCSID("$Id: match.c,v 1.4 2000/03/26 03:04:53 damien Exp $");
18 18
19#include "ssh.h" 19#include "ssh.h"
20 20
@@ -80,3 +80,62 @@ match_pattern(const char *s, const char *pattern)
80 } 80 }
81 /* NOTREACHED */ 81 /* NOTREACHED */
82} 82}
83
84/*
85 * Tries to match the host name (which must be in all lowercase) against the
86 * comma-separated sequence of subpatterns (each possibly preceded by ! to
87 * indicate negation). Returns true if there is a positive match; zero
88 * otherwise.
89 */
90
91int
92match_hostname(const char *host, const char *pattern, unsigned int len)
93{
94 char sub[1024];
95 int negated;
96 int got_positive;
97 unsigned int i, subi;
98
99 got_positive = 0;
100 for (i = 0; i < len;) {
101 /* Check if the subpattern is negated. */
102 if (pattern[i] == '!') {
103 negated = 1;
104 i++;
105 } else
106 negated = 0;
107
108 /*
109 * Extract the subpattern up to a comma or end. Convert the
110 * subpattern to lowercase.
111 */
112 for (subi = 0;
113 i < len && subi < sizeof(sub) - 1 && pattern[i] != ',';
114 subi++, i++)
115 sub[subi] = isupper(pattern[i]) ? tolower(pattern[i]) : pattern[i];
116 /* If subpattern too long, return failure (no match). */
117 if (subi >= sizeof(sub) - 1)
118 return 0;
119
120 /* If the subpattern was terminated by a comma, skip the comma. */
121 if (i < len && pattern[i] == ',')
122 i++;
123
124 /* Null-terminate the subpattern. */
125 sub[subi] = '\0';
126
127 /* Try to match the subpattern against the host name. */
128 if (match_pattern(host, sub)) {
129 if (negated)
130 return 0; /* Fail */
131 else
132 got_positive = 1;
133 }
134 }
135
136 /*
137 * Return success if got a positive match. If there was a negative
138 * match, we have already returned zero and never get here.
139 */
140 return got_positive;
141}