diff options
Diffstat (limited to 'usr.sbin/syslogd/syslogd.c')
-rw-r--r-- | usr.sbin/syslogd/syslogd.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index f8fb385..92d1605 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -764,17 +764,38 @@ static time_t now; */ static int skip_message(const char *name, const char *spec) { + const char *s; + char prev, next; + int exclude = 0; + /* Behaviour on explicit match */ + if (spec == NULL) return 0; - - switch (spec[0]) { - case '+': - return (strcmp(name, spec + 1) != 0); + switch (*spec) { case '-': - return (strcmp(name, spec + 1) == 0); + exclude = 1; + /*FALLTHROUGH*/ + case '+': + spec++; + break; default: - return (strcmp(name, spec) != 0); + break; } + s = strstr (spec, name); + + if (s != NULL) { + prev = (s == spec ? ',' : *(s - 1)); + next = *(s + strlen (name)); + + if (prev == ',' && (next == '\0' || next == ',')) + /* Explicit match: skip iff the spec is an + exclusive one. */ + return exclude; + } + + /* No explicit match for this name: skip the message iff + the spec is an inclusive one. */ + return !exclude; } /* |