summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-05-30 15:42:35 +0200
committerLennart Poettering <lennart@poettering.net>2012-05-30 15:42:35 +0200
commit6c3569e11aa1f658a9ef3f3c6efda4ae696e5aa8 (patch)
treeda633a22df4419219291c9a55f0850fdc4b529bb /src
parente9d21f240704f87c6bb5f7fca1c5e6d0f31c84cd (diff)
journald: ignore messages read from /proc/kmsg that we generated via /dev/kmsg
Avoid a busy loop.
Diffstat (limited to 'src')
-rw-r--r--src/journal/journald.c17
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);