From 2d011a7923a35d8aef49059c2e9010bf1d6a4bac Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 7 Jan 2011 00:18:51 +0100 Subject: [PATCH] logger: when passing on PID info, fall back to our own if originating process is already gone --- TODO | 2 ++ src/logger.c | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 14685d233..9acf4dd39 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,5 @@ +* when launching pager, take number of columns first + * support remote/ssh systemctl/systemadm, and local privileged access * finish syslog socket stuff diff --git a/src/logger.c b/src/logger.c index 32c57f8f8..482ec4124 100644 --- a/src/logger.c +++ b/src/logger.c @@ -187,8 +187,28 @@ static int stream_log(Stream *s, char *p, usec_t ts) { for (;;) { ssize_t n; - if ((n = sendmsg(s->server->syslog_fd, &msghdr, MSG_NOSIGNAL)) < 0) + if ((n = sendmsg(s->server->syslog_fd, &msghdr, MSG_NOSIGNAL)) < 0) { + + if (errno == ESRCH) { + pid_t our_pid; + + /* Hmm, maybe the process this + * line originates from is + * dead? Then let's patch in + * our own pid and retry, + * since we have nothing + * better */ + + our_pid = getpid(); + + if (ucred->pid != our_pid) { + ucred->pid = our_pid; + continue; + } + } + return -errno; + } if (!s->server->syslog_is_stream || (size_t) n >= IOVEC_TOTAL_SIZE(iovec, ELEMENTSOF(iovec))) -- 2.30.2