diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-05-30 15:42:35 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-05-30 15:42:35 +0200 |
commit | 6c3569e11aa1f658a9ef3f3c6efda4ae696e5aa8 (patch) | |
tree | da633a22df4419219291c9a55f0850fdc4b529bb /src/journal/journald.c | |
parent | e9d21f240704f87c6bb5f7fca1c5e6d0f31c84cd (diff) |
journald: ignore messages read from /proc/kmsg that we generated via /dev/kmsg
Avoid a busy loop.
Diffstat (limited to 'src/journal/journald.c')
-rw-r--r-- | src/journal/journald.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/journal/journald.c b/src/journal/journald.c index 7776c2a25c..5ecb7f72d3 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -1768,6 +1768,17 @@ static int parse_kernel_timestamp(char **_p, usec_t *t) { return 1; } +static bool is_us(const char *pid) { + pid_t t; + + assert(pid); + + if (parse_pid(pid, &t) < 0) + return false; + + return t == getpid(); +} + static void proc_kmsg_line(Server *s, const char *p) { struct iovec iovec[N_IOVEC_META_FIELDS + 7]; char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL; @@ -1807,6 +1818,11 @@ static void proc_kmsg_line(Server *s, const char *p) { } else { read_identifier(&p, &identifier, &pid); + /* Avoid any messages we generated ourselves via + * log_info() and friends. */ + if (is_us(pid)) + goto finish; + if (s->forward_to_syslog) forward_syslog(s, priority, identifier, p, NULL, NULL); @@ -1832,6 +1848,7 @@ static void proc_kmsg_line(Server *s, const char *p) { dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, priority); +finish: free(message); free(syslog_priority); free(syslog_identifier); |