firstboot/homectl: hide plymouth splashscreen when asking questions

When plymouth is enabled, the screen gets all garbled when firstboot
runs and asks questions. Disable the splash screen, but only when
actually asking questions.
This commit is contained in:
Luca Boccassi
2026-02-03 13:21:03 +01:00
parent 7f7622285d
commit 75cb25c0b9
4 changed files with 21 additions and 0 deletions
+5
View File
@@ -43,6 +43,7 @@
#include "parse-util.h"
#include "password-quality-util.h"
#include "path-util.h"
#include "plymouth-util.h"
#include "pretty-print.h"
#include "proc-cmdline.h"
#include "prompt-util.h"
@@ -110,6 +111,10 @@ static void print_welcome(int rfd, sd_varlink **mute_console_link) {
assert(rfd >= 0);
assert(mute_console_link);
/* Needs to be called before mute_console or it will garble the screen */
if (arg_welcome)
(void) plymouth_hide_splash();
if (!*mute_console_link && arg_mute_console)
(void) mute_console(mute_console_link);
+4
View File
@@ -48,6 +48,7 @@
#include "percent-util.h"
#include "pidref.h"
#include "pkcs11-util.h"
#include "plymouth-util.h"
#include "polkit-agent.h"
#include "pretty-print.h"
#include "proc-cmdline.h"
@@ -2891,6 +2892,9 @@ static int create_interactively(void) {
return 0;
}
/* Needs to be called before mute_console or it will garble the screen */
(void) plymouth_hide_splash();
_cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *mute_console_link = NULL;
(void) mute_console(&mute_console_link);
+11
View File
@@ -56,3 +56,14 @@ int plymouth_send_msg(const char *text, bool pause_spinner) {
return 0;
}
int plymouth_hide_splash(void) {
int r;
r = plymouth_send_raw("H\0", 2, SOCK_NONBLOCK);
if (r < 0)
return log_full_errno(ERRNO_IS_NO_PLYMOUTH(r) ? LOG_DEBUG : LOG_WARNING, r,
"Failed to communicate with plymouth: %m");
return 0;
}
+1
View File
@@ -7,6 +7,7 @@
int plymouth_connect(int flags);
int plymouth_send_raw(const void *raw, size_t size, int flags);
int plymouth_send_msg(const char *text, bool pause_spinner);
int plymouth_hide_splash(void);
static inline bool ERRNO_IS_NO_PLYMOUTH(int r) {
return IN_SET(ABS(r), EAGAIN, ENOENT) || ERRNO_IS_DISCONNECT(r);