Michal Schmidt e43452
From 58a06a6dfb11121bc1220c1c21fdf11ae65ac895 Mon Sep 17 00:00:00 2001
Michal Schmidt e43452
From: Michal Schmidt <mschmidt@redhat.com>
Michal Schmidt e43452
Date: Sun, 18 Dec 2011 14:57:54 +0100
Michal Schmidt e43452
Subject: [PATCH 087/126] log: never block on syslog in PID 1
Michal Schmidt e43452
Michal Schmidt e43452
Use a non-blocking syslog socket if logging from PID 1.
Michal Schmidt e43452
If sendmsg fails with EAGAIN, fall back to kmsg or console only for the
Michal Schmidt e43452
current message. Next message will try syslog again.
Michal Schmidt e43452
(cherry picked from commit 8f7f7a1bd3a26f501b2d6546cce1c669b59dcc87)
Michal Schmidt e43452
---
Michal Schmidt e43452
 src/log.c |   23 ++++++++++++++++-------
Michal Schmidt e43452
 1 files changed, 16 insertions(+), 7 deletions(-)
Michal Schmidt e43452
Michal Schmidt e43452
diff --git a/src/log.c b/src/log.c
Michal Schmidt e43452
index 5c5b734..4f57821 100644
Michal Schmidt e43452
--- a/src/log.c
Michal Schmidt e43452
+++ b/src/log.c
Michal Schmidt e43452
@@ -118,6 +118,9 @@ static int create_log_socket(int type) {
Michal Schmidt e43452
         struct timeval tv;
Michal Schmidt e43452
         int fd;
Michal Schmidt e43452
 
Michal Schmidt e43452
+        if (getpid() == 1)
Michal Schmidt e43452
+                /* systemd should not block on syslog */
Michal Schmidt e43452
+                type |= SOCK_NONBLOCK;
Michal Schmidt e43452
         if ((fd = socket(AF_UNIX, type|SOCK_CLOEXEC, 0)) < 0)
Michal Schmidt e43452
                 return -errno;
Michal Schmidt e43452
 
Michal Schmidt e43452
@@ -330,7 +333,8 @@ static int write_to_syslog(
Michal Schmidt e43452
         for (;;) {
Michal Schmidt e43452
                 ssize_t n;
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if ((n = sendmsg(syslog_fd, &msghdr, MSG_NOSIGNAL)) < 0)
Michal Schmidt e43452
+                n = sendmsg(syslog_fd, &msghdr, MSG_NOSIGNAL);
Michal Schmidt e43452
+                if (n < 0)
Michal Schmidt e43452
                         return -errno;
Michal Schmidt e43452
 
Michal Schmidt e43452
                 if (!syslog_is_stream ||
Michal Schmidt e43452
@@ -407,8 +411,10 @@ static int log_dispatch(
Michal Schmidt e43452
                     log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
Michal Schmidt e43452
                     log_target == LOG_TARGET_SYSLOG) {
Michal Schmidt e43452
 
Michal Schmidt e43452
-                        if ((k = write_to_syslog(level, file, line, func, buffer)) < 0) {
Michal Schmidt e43452
-                                log_close_syslog();
Michal Schmidt e43452
+                        k = write_to_syslog(level, file, line, func, buffer);
Michal Schmidt e43452
+                        if (k < 0) {
Michal Schmidt e43452
+                                if (k != -EAGAIN)
Michal Schmidt e43452
+                                        log_close_syslog();
Michal Schmidt e43452
                                 log_open_kmsg();
Michal Schmidt e43452
                         } else if (k > 0)
Michal Schmidt e43452
                                 r++;
Michal Schmidt e43452
@@ -419,16 +425,19 @@ static int log_dispatch(
Michal Schmidt e43452
                      log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
Michal Schmidt e43452
                      log_target == LOG_TARGET_KMSG)) {
Michal Schmidt e43452
 
Michal Schmidt e43452
-                        if ((k = write_to_kmsg(level, file, line, func, buffer)) < 0) {
Michal Schmidt e43452
+                        k = write_to_kmsg(level, file, line, func, buffer);
Michal Schmidt e43452
+                        if (k < 0) {
Michal Schmidt e43452
                                 log_close_kmsg();
Michal Schmidt e43452
                                 log_open_console();
Michal Schmidt e43452
                         } else if (k > 0)
Michal Schmidt e43452
                                 r++;
Michal Schmidt e43452
                 }
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if (k <= 0 &&
Michal Schmidt e43452
-                    (k = write_to_console(level, file, line, func, buffer)) < 0)
Michal Schmidt e43452
-                        return k;
Michal Schmidt e43452
+                if (k <= 0) {
Michal Schmidt e43452
+                        k = write_to_console(level, file, line, func, buffer);
Michal Schmidt e43452
+                        if (k < 0)
Michal Schmidt e43452
+                                return k;
Michal Schmidt e43452
+                }
Michal Schmidt e43452
 
Michal Schmidt e43452
                 buffer = e;
Michal Schmidt e43452
         } while (buffer);
Michal Schmidt e43452
-- 
Michal Schmidt e43452
1.7.7.5
Michal Schmidt e43452