about summary refs log tree commit diff
path: root/src/misc/syslog.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-11 21:59:49 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-11 21:59:49 -0400
commit781f26bc92b0710ac025fae3be42f5575468f1a5 (patch)
treed9e4793b6c760b645d848aec0107e4dd8d706d35 /src/misc/syslog.c
parenta64a045d1dbff2a5776f411eaf58c4a40c067e67 (diff)
downloadmusl-781f26bc92b0710ac025fae3be42f5575468f1a5.tar.gz
musl-781f26bc92b0710ac025fae3be42f5575468f1a5.tar.xz
musl-781f26bc92b0710ac025fae3be42f5575468f1a5.zip
implement the LOG_CONS option in syslog
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.
Diffstat (limited to 'src/misc/syslog.c')
-rw-r--r--src/misc/syslog.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/misc/syslog.c b/src/misc/syslog.c
index 6d2a864a..fdf90ba9 100644
--- a/src/misc/syslog.c
+++ b/src/misc/syslog.c
@@ -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);
 	}
 }