|
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 |
|