diff options
-rw-r--r-- | src/journal/journald-kmsg.c | 2 | ||||
-rw-r--r-- | src/journal/journald-syslog.c | 110 | ||||
-rw-r--r-- | src/journal/journald-syslog.h | 4 | ||||
-rw-r--r-- | src/shared/util.c | 128 | ||||
-rw-r--r-- | src/shared/util.h | 4 |
5 files changed, 112 insertions, 136 deletions
diff --git a/src/journal/journald-kmsg.c b/src/journal/journald-kmsg.c index 0c17eab5c7..aebca5dbed 100644 --- a/src/journal/journald-kmsg.c +++ b/src/journal/journald-kmsg.c @@ -274,7 +274,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) { if ((priority & LOG_FACMASK) == LOG_KERN) IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=kernel"); else { - syslog_read_identifier((const char**) &p, &identifier, &pid); + syslog_parse_identifier((const char**) &p, &identifier, &pid); /* Avoid any messages we generated ourselves via * log_info() and friends. */ diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c index 91664762e6..12c5b2849c 100644 --- a/src/journal/journald-syslog.c +++ b/src/journal/journald-syslog.c @@ -175,7 +175,7 @@ int syslog_fixup_facility(int priority) { return priority; } -void syslog_read_identifier(const char **buf, char **identifier, char **pid) { +void syslog_parse_identifier(const char **buf, char **identifier, char **pid) { const char *p; char *t; size_t l, e; @@ -225,6 +225,112 @@ void syslog_read_identifier(const char **buf, char **identifier, char **pid) { *buf += strspn(*buf, WHITESPACE); } +void syslog_parse_priority(char **p, int *priority) { + int a = 0, b = 0, c = 0; + int k; + + assert(p); + assert(*p); + assert(priority); + + if ((*p)[0] != '<') + return; + + if (!strchr(*p, '>')) + return; + + if ((*p)[2] == '>') { + c = undecchar((*p)[1]); + k = 3; + } else if ((*p)[3] == '>') { + b = undecchar((*p)[1]); + c = undecchar((*p)[2]); + k = 4; + } else if ((*p)[4] == '>') { + a = undecchar((*p)[1]); + b = undecchar((*p)[2]); + c = undecchar((*p)[3]); + k = 5; + } else + return; + + if (a < 0 || b < 0 || c < 0) + return; + + *priority = a*100+b*10+c; + *p += k; +} + +static void syslog_skip_date(char **buf) { + enum { + LETTER, + SPACE, + NUMBER, + SPACE_OR_NUMBER, + COLON + } sequence[] = { + LETTER, LETTER, LETTER, + SPACE, + SPACE_OR_NUMBER, NUMBER, + SPACE, + SPACE_OR_NUMBER, NUMBER, + COLON, + SPACE_OR_NUMBER, NUMBER, + COLON, + SPACE_OR_NUMBER, NUMBER, + SPACE + }; + + char *p; + unsigned i; + + assert(buf); + assert(*buf); + + p = *buf; + + for (i = 0; i < ELEMENTSOF(sequence); i++, p++) { + + if (!*p) + return; + + switch (sequence[i]) { + + case SPACE: + if (*p != ' ') + return; + break; + + case SPACE_OR_NUMBER: + if (*p == ' ') + break; + + /* fall through */ + + case NUMBER: + if (*p < '0' || *p > '9') + return; + + break; + + case LETTER: + if (!(*p >= 'A' && *p <= 'Z') && + !(*p >= 'a' && *p <= 'z')) + return; + + break; + + case COLON: + if (*p != ':') + return; + break; + + } + } + + *buf = p; +} + void server_process_syslog_message( Server *s, const char *buf, @@ -250,7 +356,7 @@ void server_process_syslog_message( forward_syslog_raw(s, priority, orig, ucred, tv); syslog_skip_date((char**) &buf); - syslog_read_identifier(&buf, &identifier, &pid); + syslog_parse_identifier(&buf, &identifier, &pid); if (s->forward_to_kmsg) server_forward_kmsg(s, priority, identifier, buf, ucred); diff --git a/src/journal/journald-syslog.h b/src/journal/journald-syslog.h index 7fb8e42946..8845d28df2 100644 --- a/src/journal/journald-syslog.h +++ b/src/journal/journald-syslog.h @@ -23,9 +23,11 @@ #include "journald.h" -void syslog_read_identifier(const char **buf, char **identifier, char **pid); int syslog_fixup_facility(int priority); +void syslog_parse_priority(char **p, int *priority); +void syslog_parse_identifier(const char **buf, char **identifier, char **pid); + void server_forward_syslog(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred, struct timeval *tv); void server_process_syslog_message(Server *s, const char *buf, struct ucred *ucred, struct timeval *tv, const char *label, size_t label_len); diff --git a/src/shared/util.c b/src/shared/util.c index 1c7e4c6a25..95b577be0e 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -4409,134 +4409,6 @@ bool plymouth_running(void) { return access("/run/plymouth/pid", F_OK) >= 0; } -void syslog_parse_priority(char **p, int *priority) { - int a = 0, b = 0, c = 0; - int k; - - assert(p); - assert(*p); - assert(priority); - - if ((*p)[0] != '<') - return; - - if (!strchr(*p, '>')) - return; - - if ((*p)[2] == '>') { - c = undecchar((*p)[1]); - k = 3; - } else if ((*p)[3] == '>') { - b = undecchar((*p)[1]); - c = undecchar((*p)[2]); - k = 4; - } else if ((*p)[4] == '>') { - a = undecchar((*p)[1]); - b = undecchar((*p)[2]); - c = undecchar((*p)[3]); - k = 5; - } else - return; - - if (a < 0 || b < 0 || c < 0) - return; - - *priority = a*100+b*10+c; - *p += k; -} - -void syslog_skip_pid(char **buf) { - char *p; - - assert(buf); - assert(*buf); - - p = *buf; - - if (*p != '[') - return; - - p++; - p += strspn(p, "0123456789"); - - if (*p != ']') - return; - - p++; - - *buf = p; -} - -void syslog_skip_date(char **buf) { - enum { - LETTER, - SPACE, - NUMBER, - SPACE_OR_NUMBER, - COLON - } sequence[] = { - LETTER, LETTER, LETTER, - SPACE, - SPACE_OR_NUMBER, NUMBER, - SPACE, - SPACE_OR_NUMBER, NUMBER, - COLON, - SPACE_OR_NUMBER, NUMBER, - COLON, - SPACE_OR_NUMBER, NUMBER, - SPACE - }; - - char *p; - unsigned i; - - assert(buf); - assert(*buf); - - p = *buf; - - for (i = 0; i < ELEMENTSOF(sequence); i++, p++) { - - if (!*p) - return; - - switch (sequence[i]) { - - case SPACE: - if (*p != ' ') - return; - break; - - case SPACE_OR_NUMBER: - if (*p == ' ') - break; - - /* fall through */ - - case NUMBER: - if (*p < '0' || *p > '9') - return; - - break; - - case LETTER: - if (!(*p >= 'A' && *p <= 'Z') && - !(*p >= 'a' && *p <= 'z')) - return; - - break; - - case COLON: - if (*p != ':') - return; - break; - - } - } - - *buf = p; -} - char* strshorten(char *s, size_t l) { assert(s); diff --git a/src/shared/util.h b/src/shared/util.h index 2a151ae26d..19edf98355 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -419,10 +419,6 @@ bool nulstr_contains(const char*nulstr, const char *needle); bool plymouth_running(void); -void syslog_parse_priority(char **p, int *priority); -void syslog_skip_pid(char **buf); -void syslog_skip_date(char **buf); - bool hostname_is_valid(const char *s); char* hostname_cleanup(char *s); |