chiark / gitweb /
journald: ignore messages read from /proc/kmsg that we generated via /dev/kmsg
authorLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 13:42:35 +0000 (15:42 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 13:42:35 +0000 (15:42 +0200)
Avoid a busy loop.

TODO
src/journal/journald.c

diff --git a/TODO b/TODO
index a9e38d34730f3f07dac358511d5e455d1da9f98b..434b66744eb80026ea491cb23217e911aefbef54 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,8 +6,6 @@ Fedora 18:
 * chrony/ntp target?
 
 Bugfixes:
-* log_warning() in journald gets looped back into journal via kmsg?
-
 * fix building of --disable-logind, hournald and coredunp pull-in parts of sd_login
 
 * remove MS_SHARED from src/core/execute.c and src/test/test-ns.c. They are always combined
index 7776c2a25c4e58a624b9a40a849e1fb154d9ebb2..5ecb7f72d34a4e80742d51b78a82938bfd584022 100644 (file)
@@ -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);