aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Freeland <jfree@FreeBSD.org>2023-09-01 02:50:45 +0000
committerMark Johnston <markj@FreeBSD.org>2023-09-28 15:51:53 +0000
commitf4b4a10abb2688f0fef9a0cf15117b10a7f2d398 (patch)
tree6c3b65e631b563056c31f6d0bcc681f9292b53d9
parent688ecad8e197b1e1337de5160c56e4137276974b (diff)
downloadsrc-f4b4a10abb2688f0fef9a0cf15117b10a7f2d398.tar.gz
src-f4b4a10abb2688f0fef9a0cf15117b10a7f2d398.zip
syslogd: Move selector parsing into its own function
Clean up the cfline() function by moving selector parsing into its own function. Reviewed by: markj MFC after: 3 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D41374
-rw-r--r--usr.sbin/syslogd/syslogd.c210
1 files changed, 104 insertions, 106 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 40c233f02d7f..6c07d60b484f 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -2865,6 +2865,107 @@ error:
return (NULL);
}
+static const char *
+parse_selector(const char *p, struct filed *f)
+{
+ int i, pri;
+ int pri_done = 0, pri_cmp = 0, pri_invert = 0;
+ char *bp, buf[LINE_MAX], ebuf[100];
+ const char *q;
+
+ /* find the end of this facility name list */
+ for (q = p; *q && *q != '\t' && *q != ' ' && *q++ != '.';)
+ continue;
+
+ /* get the priority comparison */
+ if (*q == '!') {
+ pri_invert = 1;
+ q++;
+ }
+ while (!pri_done) {
+ switch (*q) {
+ case '<':
+ pri_cmp |= PRI_LT;
+ q++;
+ break;
+ case '=':
+ pri_cmp |= PRI_EQ;
+ q++;
+ break;
+ case '>':
+ pri_cmp |= PRI_GT;
+ q++;
+ break;
+ default:
+ pri_done++;
+ break;
+ }
+ }
+
+ /* collect priority name */
+ for (bp = buf; *q != '\0' && !strchr("\t,; ", *q); )
+ *bp++ = *q++;
+ *bp = '\0';
+
+ /* skip cruft */
+ while (strchr(",;", *q))
+ q++;
+
+ /* decode priority name */
+ if (*buf == '*') {
+ pri = LOG_PRIMASK;
+ pri_cmp = PRI_LT | PRI_EQ | PRI_GT;
+ } else {
+ /* Ignore trailing spaces. */
+ for (i = strlen(buf) - 1; i >= 0 && buf[i] == ' '; i--)
+ buf[i] = '\0';
+
+ pri = decode(buf, prioritynames);
+ if (pri < 0) {
+ errno = 0;
+ (void)snprintf(ebuf, sizeof ebuf,
+ "unknown priority name \"%s\"", buf);
+ logerror(ebuf);
+ free(f);
+ return (NULL);
+ }
+ }
+ if (!pri_cmp)
+ pri_cmp = UniquePriority ? PRI_EQ : (PRI_EQ | PRI_GT);
+ if (pri_invert)
+ pri_cmp ^= PRI_LT | PRI_EQ | PRI_GT;
+
+ /* scan facilities */
+ while (*p != '\0' && !strchr("\t.; ", *p)) {
+ for (bp = buf; *p != '\0' && !strchr("\t,;. ", *p); )
+ *bp++ = *p++;
+ *bp = '\0';
+
+ if (*buf == '*') {
+ for (i = 0; i < LOG_NFACILITIES; i++) {
+ f->f_pmask[i] = pri;
+ f->f_pcmp[i] = pri_cmp;
+ }
+ } else {
+ i = decode(buf, facilitynames);
+ if (i < 0) {
+ errno = 0;
+ (void)snprintf(ebuf, sizeof ebuf,
+ "unknown facility name \"%s\"",
+ buf);
+ logerror(ebuf);
+ free(f);
+ return (NULL);
+ }
+ f->f_pmask[i >> 3] = pri;
+ f->f_pcmp[i >> 3] = pri_cmp;
+ }
+ while (*p == ',' || *p == ' ')
+ p++;
+ }
+ return (q);
+}
+
/*
* Crack a configuration file line
*/
@@ -2874,9 +2975,8 @@ cfline(const char *line, const char *prog, const char *host,
{
struct filed *f;
struct addrinfo hints, *res;
- int error, i, pri;
+ int error, i;
const char *p, *q;
- char *bp, buf[LINE_MAX], ebuf[100];
bool syncfile;
dprintf("cfline(\"%s\", f, \"%s\", \"%s\", \"%s\")\n", line, prog,
@@ -2931,110 +3031,8 @@ cfline(const char *line, const char *prog, const char *host,
}
/* scan through the list of selectors */
- for (p = line; *p && *p != '\t' && *p != ' ';) {
- int pri_done;
- int pri_cmp;
- int pri_invert;
-
- /* find the end of this facility name list */
- for (q = p; *q && *q != '\t' && *q != ' ' && *q++ != '.'; )
- continue;
-
- /* get the priority comparison */
- pri_cmp = 0;
- pri_done = 0;
- pri_invert = 0;
- if (*q == '!') {
- pri_invert = 1;
- q++;
- }
- while (!pri_done) {
- switch (*q) {
- case '<':
- pri_cmp |= PRI_LT;
- q++;
- break;
- case '=':
- pri_cmp |= PRI_EQ;
- q++;
- break;
- case '>':
- pri_cmp |= PRI_GT;
- q++;
- break;
- default:
- pri_done++;
- break;
- }
- }
-
- /* collect priority name */
- for (bp = buf; *q && !strchr("\t,; ", *q); )
- *bp++ = *q++;
- *bp = '\0';
-
- /* skip cruft */
- while (strchr(",;", *q))
- q++;
-
- /* decode priority name */
- if (*buf == '*') {
- pri = LOG_PRIMASK;
- pri_cmp = PRI_LT | PRI_EQ | PRI_GT;
- } else {
- /* Ignore trailing spaces. */
- for (i = strlen(buf) - 1; i >= 0 && buf[i] == ' '; i--)
- buf[i] = '\0';
-
- pri = decode(buf, prioritynames);
- if (pri < 0) {
- errno = 0;
- (void)snprintf(ebuf, sizeof ebuf,
- "unknown priority name \"%s\"", buf);
- logerror(ebuf);
- free(f);
- return;
- }
- }
- if (!pri_cmp)
- pri_cmp = (UniquePriority)
- ? (PRI_EQ)
- : (PRI_EQ | PRI_GT)
- ;
- if (pri_invert)
- pri_cmp ^= PRI_LT | PRI_EQ | PRI_GT;
-
- /* scan facilities */
- while (*p && !strchr("\t.; ", *p)) {
- for (bp = buf; *p && !strchr("\t,;. ", *p); )
- *bp++ = *p++;
- *bp = '\0';
-
- if (*buf == '*') {
- for (i = 0; i < LOG_NFACILITIES; i++) {
- f->f_pmask[i] = pri;
- f->f_pcmp[i] = pri_cmp;
- }
- } else {
- i = decode(buf, facilitynames);
- if (i < 0) {
- errno = 0;
- (void)snprintf(ebuf, sizeof ebuf,
- "unknown facility name \"%s\"",
- buf);
- logerror(ebuf);
- free(f);
- return;
- }
- f->f_pmask[i >> 3] = pri;
- f->f_pcmp[i >> 3] = pri_cmp;
- }
- while (*p == ',' || *p == ' ')
- p++;
- }
-
- p = q;
- }
+ for (p = line; *p != '\0' && *p != '\t' && *p != ' ';)
+ p = parse_selector(p, f);
/* skip to action part */
while (*p == '\t' || *p == ' ')