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 #include #include +#ifdef HAVE_SYSV_COMPAT +# include +# include +# include +# include +# include +# 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,