浏览代码

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.
Rich Felker 10 年之前
父节点
当前提交
781f26bc92
共有 1 个文件被更改,包括 9 次插入1 次删除
  1. 9 1
      src/misc/syslog.c

+ 9 - 1
src/misc/syslog.c

@@ -8,6 +8,7 @@
 #include <string.h>
 #include <string.h>
 #include <pthread.h>
 #include <pthread.h>
 #include <errno.h>
 #include <errno.h>
+#include <fcntl.h>
 #include "libc.h"
 #include "libc.h"
 #include "atomic.h"
 #include "atomic.h"
 
 
@@ -81,6 +82,7 @@ static void _vsyslog(int priority, const char *message, va_list ap)
 	int pid;
 	int pid;
 	int l, l2;
 	int l, l2;
 	int hlen;
 	int hlen;
+	int fd;
 
 
 	if (log_fd < 0) __openlog();
 	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;
 		if (l2 >= sizeof buf - l) l = sizeof buf - 1;
 		else l += l2;
 		else l += l2;
 		if (buf[l-1] != '\n') buf[l++] = '\n';
 		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);
 		if (log_opt & LOG_PERROR) dprintf(2, "%.*s", l-hlen, buf+hlen);
 	}
 	}
 }
 }