From: Lennart Poettering Date: Thu, 6 Jan 2011 23:18:51 +0000 (+0100) Subject: logger: when passing on PID info, fall back to our own if originating process is... X-Git-Tag: v16~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=2d011a7923a35d8aef49059c2e9010bf1d6a4bac;hp=e83c7c0ba480c6d37d6d586b9337b1ad32ee52ca logger: when passing on PID info, fall back to our own if originating process is already gone --- 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)))