Use and set default logging console for both journald and kernel messages

---
 src/journal/journald-console.c |   96 +++++++++++++++++++++++++++++++++++++++++
 src/journal/journald-console.h |    4 +
 src/journal/journald-server.c  |    5 ++
 3 files changed, 105 insertions(+)

Index: src/journal/journald-console.c
===================================================================
--- src/journal/journald-console.c.orig
+++ src/journal/journald-console.c
@@ -23,6 +23,14 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/socket.h>
+#ifdef HAVE_SYSV_COMPAT
+# include <linux/tiocl.h>
+# include <linux/vt.h>
+# include <sys/ioctl.h>
+# include <sys/klog.h>
+# include <errno.h>
+# include "util.h"
+#endif
 
 #include "fileio.h"
 #include "journald-server.h"
@@ -43,6 +51,74 @@ static bool prefix_timestamp(void) {
         return cached_printk_time;
 }
 
+#ifdef HAVE_SYSV_COMPAT
+void defaul_tty_path(Server *s)
+{
+        static const char list[] = "/dev/tty10\0" "/dev/console\0";
+        const char *vc;
+
+        if (s->tty_path)
+                return;
+
+        NULSTR_FOREACH(vc, list) {
+                _cleanup_close_ int fd = -1;
+
+                if (access(vc, F_OK) < 0)
+                        continue;
+
+                fd = open_terminal(vc, O_WRONLY|O_NOCTTY|O_CLOEXEC);
+                if (fd < 0)
+                        continue;
+
+                s->tty_path = strdup(vc);
+                break;
+        }
+}
+
+void klogconsole(Server *s)
+{
+        _cleanup_free_ char *klogconsole_params = NULL;
+        _cleanup_close_ int fd = -1;
+        const char *vc = s->tty_path;
+        const char *num;
+        int tiocl[2];
+        int r;
+
+        if (!vc || *vc == 0 || !strneq("/dev/tty", vc, 8))
+                return;
+
+        num = vc + strcspn(vc, "0123456789");
+        if (safe_atoi(num, &r) < 0)
+                return;
+
+        if (access(vc, F_OK) < 0)
+                return;
+
+        fd = open_terminal(vc, O_RDWR|O_NOCTTY|O_CLOEXEC);
+        if (fd < 0)
+                return;
+
+        tiocl[0] = TIOCL_SETKMSGREDIRECT;
+        tiocl[1] = r;
+
+        if (ioctl(fd, TIOCLINUX, tiocl) < 0)
+                return;
+
+        zero(klogconsole_params);
+        r = parse_env_file("/etc/sysconfig/boot", NEWLINE,
+                           "KLOGCONSOLE_PARAMS", &klogconsole_params,
+                           NULL);
+        if (r < 0)
+                return;
+        if (!klogconsole_params || *klogconsole_params == 0)
+                return;
+
+        num = klogconsole_params + strcspn(klogconsole_params, "0123456789");
+        if (safe_atoi(num, &r) == 0)
+                klogctl(8, 0, r);
+}
+#endif
+
 void server_forward_console(
                 Server *s,
                 int priority,
@@ -64,6 +140,10 @@ void server_forward_console(
         if (LOG_PRI(priority) > s->max_level_console)
                 return;
 
+        /* Do not write security/authorization (private) messages to console */
+        if (priority & LOG_AUTHPRIV)
+                return;
+
         /* First: timestamp */
         if (prefix_timestamp()) {
                 assert_se(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
@@ -101,7 +181,23 @@ void server_forward_console(
         fd = open_terminal(tty, O_WRONLY|O_NOCTTY|O_CLOEXEC);
         if (fd < 0) {
                 log_debug("Failed to open %s for logging: %m", tty);
+#ifdef HAVE_SYSV_COMPAT
+                if (fd != -ENOENT && fd != -ENODEV)
+                        return;
+                if (tty != s->tty_path)
+                        return;
+                if (!streq("/dev/console", tty)) {
+                        if (s->tty_path)
+                                free(s->tty_path);
+                        s->tty_path = NULL;
+                        tty = "/dev/console";
+                        fd = open_terminal(tty, O_WRONLY|O_NOCTTY|O_CLOEXEC);
+                        if (fd < 0)
+                                return;
+                }
+#else
                 return;
+#endif
         }
 
         if (writev(fd, iovec, n) < 0)
Index: src/journal/journald-console.h
===================================================================
--- src/journal/journald-console.h.orig
+++ src/journal/journald-console.h
@@ -24,3 +24,7 @@
 #include "journald-server.h"
 
 void server_forward_console(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred);
+#ifdef HAVE_SYSV_COMPAT
+void klogconsole(Server *s);
+void defaul_tty_path(Server *s);
+#endif
Index: src/journal/journald-server.c
===================================================================
--- src/journal/journald-server.c.orig
+++ src/journal/journald-server.c
@@ -1509,6 +1509,11 @@ int server_init(Server *s) {
 
         server_parse_config_file(s);
         server_parse_proc_cmdline(s);
+        defaul_tty_path(s);
+
+        if (s->tty_path)
+                klogconsole(s);
+
         if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
                 log_debug("Setting both rate limit interval and burst from %llu,%u to 0,0",
                           (long long unsigned) s->rate_limit_interval,
