implement the LOG_CONS option in syslog
authorRich Felker <dalias@aerifal.cx>
Sat, 12 Jul 2014 01:59:49 +0000 (21:59 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 12 Jul 2014 01:59:49 +0000 (21:59 -0400)
this was previously a no-op, somewhat intentionally, because I failed
to understand that it only has an effect when sending to the logging
facility fails and thus is not the nuisance that it would be if always
sent output to the console.

src/misc/syslog.c

index 6d2a864aa1c1c39a515bda6d61013f1f68918c18..fdf90ba9fb074ddecb4353496dc12d579d84f601 100644 (file)
@@ -8,6 +8,7 @@
 #include <string.h>
 #include <pthread.h>
 #include <errno.h>
+#include <fcntl.h>
 #include "libc.h"
 #include "atomic.h"
 
@@ -81,6 +82,7 @@ static void _vsyslog(int priority, const char *message, va_list ap)
        int pid;
        int l, l2;
        int hlen;
+       int fd;
 
        if (log_fd < 0) __openlog();
 
@@ -99,7 +101,13 @@ static void _vsyslog(int priority, const char *message, va_list ap)
                if (l2 >= sizeof buf - l) l = sizeof buf - 1;
                else l += l2;
                if (buf[l-1] != '\n') buf[l++] = '\n';
-               send(log_fd, buf, l, 0);
+               if (send(log_fd, buf, l, 0) < 0 && (log_opt & LOG_CONS)) {
+                       fd = open("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+                       if (fd >= 0) {
+                               dprintf(fd, "%.*s", l-hlen, buf+hlen);
+                               close(fd);
+                       }
+               }
                if (log_opt & LOG_PERROR) dprintf(2, "%.*s", l-hlen, buf+hlen);
        }
 }