summaryrefslogtreecommitdiff
path: root/match.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2000-03-26 13:04:51 +1000
committerDamien Miller <djm@mindrot.org>2000-03-26 13:04:51 +1000
commit450a7a1ff40fe7c2d84c93b83cf2df53445d807d (patch)
treedb6d08bdea65edd34ba2e323a31e2b1ca5e5fbd4 /match.c
parent2c9279fa667827384fceb243f890cba1dbe480de (diff)
- OpenBSD CVS update
- [auth-krb4.c] -Wall - [auth-rh-rsa.c auth-rsa.c hostfile.c hostfile.h key.c key.h match.c] [match.h ssh.c ssh.h sshconnect.c sshd.c] initial support for DSA keys. ok deraadt@, niels@ - [cipher.c cipher.h] remove unused cipher_attack_detected code - [scp.1 ssh-add.1 ssh-agent.1 ssh-keygen.1 ssh.1 sshd.8] Fix some formatting problems I missed before. - [ssh.1 sshd.8] fix spelling errors, From: FreeBSD - [ssh.c] switch to raw mode only if he _get_ a pty (not if we _want_ a pty).
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}