diff options
author | Franck Bui <fbui@suse.com> | 2016-11-02 10:38:22 +0100 |
---|---|---|
committer | Franck Bui <fbui@suse.com> | 2016-11-17 18:16:16 +0100 |
commit | 7d5ceb641659b29204598fde9110913765c2aa9e (patch) | |
tree | f329f3b259df45c36ff4bcc0714ff6cc9e4c6d90 /src/core/manager.c | |
parent | 42bf1ae17bad7fafc4ee8e7b6a3052da6decb9f7 (diff) |
core: allow to redirect confirmation messages to a different console
It's rather hard to parse the confirmation messages (enabled with
systemd.confirm_spawn=true) amongst the status messages and the kernel
ones (if enabled).
This patch gives the possibility to the user to redirect the confirmation
message to a different virtual console, either by giving its name or its path,
so those messages are separated from the other ones and easier to read.
Diffstat (limited to 'src/core/manager.c')
-rw-r--r-- | src/core/manager.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/core/manager.c b/src/core/manager.c index d9f772d168..6ffbbd7389 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2974,7 +2974,7 @@ void manager_check_finished(Manager *m) { manager_close_idle_pipe(m); /* Turn off confirm spawn now */ - m->confirm_spawn = false; + m->confirm_spawn = NULL; /* No need to update ask password status when we're going non-interactive */ manager_close_ask_password(m); @@ -3159,6 +3159,49 @@ static bool manager_get_show_status(Manager *m, StatusType type) { return false; } +const char *manager_get_confirm_spawn(Manager *m) { + static int last_errno = 0; + const char *vc = m->confirm_spawn; + struct stat st; + int r; + + /* Here's the deal: we want to test the validity of the console but don't want + * PID1 to go through the whole console process which might block. But we also + * want to warn the user only once if something is wrong with the console so we + * cannot do the sanity checks after spawning our children. So here we simply do + * really basic tests to hopefully trap common errors. + * + * If the console suddenly disappear at the time our children will really it + * then they will simply fail to acquire it and a positive answer will be + * assumed. New children will fallback to /dev/console though. + * + * Note: TTYs are devices that can come and go any time, and frequently aren't + * available yet during early boot (consider a USB rs232 dongle...). If for any + * reason the configured console is not ready, we fallback to the default + * console. */ + + if (!vc || path_equal(vc, "/dev/console")) + return vc; + + r = stat(vc, &st); + if (r < 0) + goto fail; + + if (!S_ISCHR(st.st_mode)) { + errno = ENOTTY; + goto fail; + } + + last_errno = 0; + return vc; +fail: + if (last_errno != errno) { + last_errno = errno; + log_warning_errno(errno, "Failed to open %s: %m, using default console", vc); + } + return "/dev/console"; +} + void manager_set_first_boot(Manager *m, bool b) { assert(m); |