Compare commits

..

No commits in common. "c8" and "a10s" have entirely different histories.
c8 ... a10s

21 changed files with 1518 additions and 3626 deletions

26
.gitignore vendored
View File

@ -1 +1,25 @@
SOURCES/plymouth-1e36e303e08ba425fecbcff4dde22c8ee936638c.tar.bz2
plymouth-0.8.4.tar.bz2
/plymouth-0.8.4.tar.bz2
/plymouth-0.8.5.tar.bz2
/plymouth-0.8.5.1.tar.bz2
/plymouth-0.8.6.tar.bz2
/plymouth-0.8.6.1.tar.bz2
/plymouth-0.8.6.2.tar.bz2
/plymouth-0.8.7.tar.bz2
/plymouth-0.8.8.tar.bz2
/plymouth-0.8.9.tar.bz2
/plymouth-0.9.3.tar.bz2
/plymouth-0.9.3.tar.xz
/plymouth-0.9.4.tar.xz
/plymouth-a8aad27.tar.gz
/plymouth-32c097c.tar.gz
/plymouth-58a7289.tar.gz
/plymouth-e31c81f.tar.gz
/plymouth-8a3c9bb.tar.gz
/plymouth-372b5f8.tar.gz
/plymouth-1ea1020.tar.gz
/plymouth-22.02.122.tar.bz2
/plymouth-23.356.9.tar.bz2
/plymouth-23.358.4.tar.bz2
/plymouth-23.360.11.tar.bz2
/plymouth-24.004.60.tar.bz2

View File

@ -1 +0,0 @@
7847967f397a536ccf5fb2d43aa561ac5e5dff6c SOURCES/plymouth-1e36e303e08ba425fecbcff4dde22c8ee936638c.tar.bz2

View File

@ -0,0 +1,58 @@
From e6f09b05707be8aec488d757c5abe56cb3060a75 Mon Sep 17 00:00:00 2001
From: Adam Williamson <awilliam@redhat.com>
Date: Sat, 16 Mar 2024 17:22:57 -0700
Subject: [PATCH] Revert "src: Hide console text when splash is requested"
This reverts commit 48881ba2ef3d25fd27fd150d4d5957d4df9868e0.
It breaks display entirely on minimal installs.
---
src/libply-splash-core/ply-terminal.c | 2 --
src/main.c | 12 ++++--------
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c
index 1a9ec353..2036e507 100644
--- a/src/libply-splash-core/ply-terminal.c
+++ b/src/libply-splash-core/ply-terminal.c
@@ -357,8 +357,6 @@ ply_terminal_write (ply_terminal_t *terminal,
assert (terminal != NULL);
assert (format != NULL);
- ply_terminal_set_mode (terminal, PLY_TERMINAL_MODE_TEXT);
-
string = NULL;
va_start (args, format);
size = vasprintf (&string, format, args);
diff --git a/src/main.c b/src/main.c
index 33fe51e0..81e34c54 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1000,14 +1000,6 @@ on_show_splash (state_t *state)
if (!state->is_attached && state->should_be_attached && has_displays)
attach_to_running_session (state);
- if (state->local_console_terminal != NULL)
- ply_terminal_set_mode (state->local_console_terminal, PLY_TERMINAL_MODE_GRAPHICS);
-
-#ifdef PLY_ENABLE_SYSTEMD_INTEGRATION
- if (state->is_attached)
- tell_systemd_to_print_details (state);
-#endif
-
if (has_displays) {
ply_trace ("at least one display already available, so loading splash");
show_splash (state);
@@ -1438,6 +1430,10 @@ on_quit (state_t *state,
state->quit_trigger = quit_trigger;
state->should_retain_splash = retain_splash;
+#ifdef PLY_ENABLE_SYSTEMD_INTEGRATION
+ tell_systemd_to_stop_printing_details (state);
+#endif
+
ply_trace ("closing log");
if (state->session != NULL)
ply_terminal_session_close_log (state->session);
--
2.44.0

View File

@ -0,0 +1,209 @@
From 2446472f9ac9246f2ee25a92e8ebb17c54b923bd Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
Date: Fri, 9 May 2025 14:44:24 -0400
Subject: [PATCH 1/3] utils: Don't lose log level when silencing kmsg
Once we disable kmsg logging to the console, the kernel will set the
console log level to the minimum log level (i.e. only logging kernel
panics). However the unintended side effect is that our own kmsg-reader
will start filtering out all kernel log messages, since we also respect
the kernel's console log level.
This change make it so that we keep using the original console log level
whenever we disable the kernel's output. This lets us keep forwarding
the kernel's kmsg output
---
src/libply/ply-utils.c | 79 +++++++++++++++++++++++++-----------------
1 file changed, 47 insertions(+), 32 deletions(-)
diff --git a/src/libply/ply-utils.c b/src/libply/ply-utils.c
index 6fa64975..782fadd8 100644
--- a/src/libply/ply-utils.c
+++ b/src/libply/ply-utils.c
@@ -89,6 +89,10 @@ static int overridden_device_scale = 0;
static char kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
static bool kernel_command_line_is_set;
+static int cached_current_log_level = 0;
+static int cached_default_log_level = 0;
+static double log_level_update_time = 0.0;
+
bool
ply_open_unidirectional_pipe (int *sender_fd,
int *receiver_fd)
@@ -673,20 +677,6 @@ ply_create_file_link (const char *source,
return true;
}
-void
-ply_show_new_kernel_messages (bool should_show)
-{
- int type;
-
- if (should_show)
- type = PLY_ENABLE_CONSOLE_PRINTK;
- else
- type = PLY_DISABLE_CONSOLE_PRINTK;
-
- if (klogctl (type, NULL, 0) < 0)
- ply_trace ("could not toggle printk visibility: %m");
-}
-
ply_daemon_handle_t *
ply_create_daemon (void)
{
@@ -1118,26 +1108,14 @@ int ply_guess_device_scale (uint32_t width,
return get_device_scale (width, height, 0, 0, true);
}
-void
-ply_get_kmsg_log_levels (int *current_log_level,
- int *default_log_level)
+static void
+ply_get_kmsg_log_levels_uncached (int *current_log_level,
+ int *default_log_level)
{
- static double last_update_time = 0;
- static int cached_current_log_level = 0;
- static int cached_default_log_level = 0;
char log_levels[4096] = "";
- double current_time;
char *field, *fields;
int fd;
- current_time = ply_get_timestamp ();
-
- if ((current_time - last_update_time) < 1.0) {
- *current_log_level = cached_current_log_level;
- *default_log_level = cached_default_log_level;
- return;
- }
-
ply_trace ("opening /proc/sys/kernel/printk");
fd = open ("/proc/sys/kernel/printk", O_RDONLY);
@@ -1171,11 +1149,48 @@ ply_get_kmsg_log_levels (int *current_log_level,
}
*default_log_level = atoi (field);
+}
- cached_current_log_level = *current_log_level;
- cached_default_log_level = *default_log_level;
+void
+ply_get_kmsg_log_levels (int *current_log_level,
+ int *default_log_level)
+{
+ double current_time;
+ bool no_cache;
+ bool cache_expired;
+
+ no_cache = cached_current_log_level == 0 || cached_default_log_level == 0;
+ current_time = ply_get_timestamp ();
+ cache_expired = log_level_update_time > 0.0 && (current_time - log_level_update_time) >= 1.0;
+
+ if (no_cache || cache_expired) {
+ ply_get_kmsg_log_levels_uncached (&cached_current_log_level, &cached_default_log_level);
+ log_level_update_time = current_time;
+ }
+
+ *current_log_level = cached_current_log_level;
+ *default_log_level = cached_default_log_level;
+}
+
+void
+ply_show_new_kernel_messages (bool should_show)
+{
+ int type;
+
+ if (should_show) {
+ type = PLY_ENABLE_CONSOLE_PRINTK;
+
+ cached_current_log_level = cached_default_log_level = 0;
+ log_level_update_time = 0.0;
+ } else {
+ type = PLY_DISABLE_CONSOLE_PRINTK;
+
+ ply_get_kmsg_log_levels_uncached (&cached_current_log_level, &cached_default_log_level);
+ log_level_update_time = -1.0; /* Disable expiration */
+ }
- last_update_time = current_time;
+ if (klogctl (type, NULL, 0) < 0)
+ ply_trace ("could not toggle printk visibility: %m");
}
static const char *
--
GitLab
From 6d7b3c3342e80f94410165c72bb2d907624e3fff Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
Date: Fri, 9 May 2025 15:17:48 -0400
Subject: [PATCH 2/3] details: Suppress kernel's own kmsg console output
Plymouth forwards /dev/console and /dev/kmsg to all consoles (and to the
graphical splash). With the details plugin, we would do this without
suppressing the kernel's own output first. This would lead to duplicate
log entries
---
src/plugins/splash/details/plugin.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/plugins/splash/details/plugin.c b/src/plugins/splash/details/plugin.c
index 9e150b5c..c7674fc0 100644
--- a/src/plugins/splash/details/plugin.c
+++ b/src/plugins/splash/details/plugin.c
@@ -308,6 +308,8 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin,
detach_from_event_loop,
plugin);
+ ply_show_new_kernel_messages (false);
+
if (boot_buffer) {
plugin->boot_buffer = boot_buffer;
@@ -350,6 +352,8 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin,
detach_from_event_loop,
plugin);
detach_from_event_loop (plugin);
+
+ ply_show_new_kernel_messages (true);
}
static void
--
GitLab
From a53065d0ce0b28a214b9088afc9d4d769c030d3b Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
Date: Fri, 9 May 2025 15:35:38 -0400
Subject: [PATCH 3/3] kmsg-reader: Seek to the end of the ringbuffer
Otherwise, whenever plymouth starts we'd replay all previous kmsg
entries, even if they've already been logged to the console. This leads
to duplicated log entires, and makes it hard to debug things.
With /dev/console, we only log what we capture while Plymouth is
running. Let's do the same with /dev/kmsg
---
src/libply-splash-core/ply-kmsg-reader.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/libply-splash-core/ply-kmsg-reader.c b/src/libply-splash-core/ply-kmsg-reader.c
index 439da415..9e9de214 100644
--- a/src/libply-splash-core/ply-kmsg-reader.c
+++ b/src/libply-splash-core/ply-kmsg-reader.c
@@ -204,6 +204,8 @@ ply_kmsg_reader_start (ply_kmsg_reader_t *kmsg_reader)
if (kmsg_reader->kmsg_fd < 0)
return;
+ lseek (kmsg_reader->kmsg_fd, 0, SEEK_END);
+
kmsg_reader->fd_watch = ply_event_loop_watch_fd (ply_event_loop_get_default (), kmsg_reader->kmsg_fd, PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
(ply_event_handler_t) handle_kmsg_message,
NULL,
--
GitLab

View File

@ -0,0 +1,37 @@
From 10ac8d2dc927b112ce6aeb06bc73d9c46550954c Mon Sep 17 00:00:00 2001
From: n3rdopolis <bluescreen_avenger@verizon.net>
Date: Tue, 6 Feb 2024 18:52:25 -0500
Subject: [PATCH] ply-boot-splash: Set unbuffered input when creating a text
display
---
src/libply-splash-core/ply-boot-splash.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/libply-splash-core/ply-boot-splash.c b/src/libply-splash-core/ply-boot-splash.c
index 12fb6c10..217f455e 100644
--- a/src/libply-splash-core/ply-boot-splash.c
+++ b/src/libply-splash-core/ply-boot-splash.c
@@ -173,6 +173,7 @@ ply_boot_splash_add_text_display (ply_boot_splash_t *splash,
ply_text_display_t *display)
{
int number_of_columns, number_of_rows;
+ ply_terminal_t *terminal;
if (splash->plugin_interface->add_text_display == NULL)
return;
@@ -183,6 +184,11 @@ ply_boot_splash_add_text_display (ply_boot_splash_t *splash,
ply_trace ("adding %dx%d text display", number_of_columns, number_of_rows);
splash->plugin_interface->add_text_display (splash->plugin, display);
+
+ terminal = ply_text_display_get_terminal (display);
+ if (terminal)
+ ply_terminal_set_unbuffered_input (terminal);
+
ply_list_append_data (splash->text_displays, display);
}
--
2.44.0

View File

@ -0,0 +1,52 @@
From 4a8c0a4231d35ac060f41b582596684cfba7c9ae Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 7 May 2024 12:42:10 +0200
Subject: [PATCH] ply-device-manager: Revert "Fall back to text plugin if no
renderers installed"
The drm renderer may fail to open /dev/dri/card# with -ENOENT when trying
to open/probe a simpledrm registered drm device and the open races with
that drm device being removed to be replaced by a new drm device registered
by the native GPU driver (e.g. i915 / amdgpu).
Switching to text mode immediately when this race gets hit is undesirable,
as it causes text mode on systems where plymouth would run in graphics
mode before. Remove the immediate switch to text mode on -ENOENT.
Delaying the switch to textmode until the timeout as before.
This reverts commit 03842d5201e4486fe62635c7b470eb94696f985d.
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2270030
---
src/libply-splash-core/ply-device-manager.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 59e579dd..d75ac6c5 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -52,7 +52,6 @@
static void create_devices_from_udev (ply_device_manager_t *manager);
#endif
-static void create_non_graphical_devices (ply_device_manager_t *manager);
static bool create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
const char *device_path,
ply_terminal_t *terminal,
@@ -1102,13 +1101,6 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
renderer = ply_renderer_new (renderer_type, device_path, terminal);
if (renderer != NULL && !ply_renderer_open (renderer)) {
- if (errno == ENOENT) {
- ply_trace ("No renderer plugins installed, creating non-graphical devices");
- ply_renderer_free (renderer);
- create_non_graphical_devices (manager);
- manager->device_timeout_elapsed = true;
- return false;
- }
ply_trace ("could not open renderer for %s", device_path);
ply_renderer_free (renderer);
renderer = NULL;
--
2.44.0

View File

@ -0,0 +1,108 @@
From 709f21e80199ee51badff2d9b5dc6bae8af2a1a1 Mon Sep 17 00:00:00 2001
From: n3rdopolis <bluescreen_avenger@verizon.net>
Date: Wed, 31 Jan 2024 08:38:38 -0500
Subject: [PATCH] renderers: Do not assume all keyboards have LEDs
This is an attempt to fix #245
---
src/plugins/renderers/drm/plugin.c | 22 +++++++++++++++++++--
src/plugins/renderers/frame-buffer/plugin.c | 22 +++++++++++++++++++--
2 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c
index 54cfe874..2fbb6b85 100644
--- a/src/plugins/renderers/drm/plugin.c
+++ b/src/plugins/renderers/drm/plugin.c
@@ -1972,6 +1972,17 @@ get_panel_properties (ply_renderer_backend_t *backend,
return true;
}
+static ply_input_device_t *
+get_any_input_device (ply_renderer_backend_t *backend)
+{
+ ply_list_node_t *node = ply_list_get_first_node (backend->input_source.input_devices);
+
+ if (node != NULL)
+ return ply_list_node_get_data (node);
+
+ return NULL;
+}
+
static ply_input_device_t *
get_any_input_device_with_leds (ply_renderer_backend_t *backend)
{
@@ -1994,6 +2005,9 @@ get_capslock_state (ply_renderer_backend_t *backend)
{
if (using_input_device (&backend->input_source)) {
ply_input_device_t *dev = get_any_input_device_with_leds (backend);
+ if (!dev)
+ return false;
+
return ply_input_device_get_capslock_state (dev);
}
if (!backend->terminal)
@@ -2006,8 +2020,12 @@ static const char *
get_keymap (ply_renderer_backend_t *backend)
{
if (using_input_device (&backend->input_source)) {
- ply_input_device_t *dev = get_any_input_device_with_leds (backend);
- const char *keymap = ply_input_device_get_keymap (dev);
+ const char *keymap;
+ ply_input_device_t *dev = get_any_input_device (backend);
+ if (!dev)
+ return NULL;
+
+ keymap = ply_input_device_get_keymap (dev);
if (keymap != NULL) {
return keymap;
}
diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c
index e57d0437..3d56116e 100644
--- a/src/plugins/renderers/frame-buffer/plugin.c
+++ b/src/plugins/renderers/frame-buffer/plugin.c
@@ -821,6 +821,17 @@ close_input_source (ply_renderer_backend_t *backend,
backend->input_source_is_open = false;
}
+static ply_input_device_t *
+get_any_input_device (ply_renderer_backend_t *backend)
+{
+ ply_list_node_t *node = ply_list_get_first_node (backend->input_source.input_devices);
+
+ if (node != NULL)
+ return ply_list_node_get_data (node);
+
+ return NULL;
+}
+
static ply_input_device_t *
get_any_input_device_with_leds (ply_renderer_backend_t *backend)
{
@@ -843,6 +854,9 @@ get_capslock_state (ply_renderer_backend_t *backend)
{
if (using_input_device (&backend->input_source)) {
ply_input_device_t *dev = get_any_input_device_with_leds (backend);
+ if (!dev)
+ return false;
+
return ply_input_device_get_capslock_state (dev);
}
if (!backend->terminal)
@@ -855,8 +869,12 @@ static const char *
get_keymap (ply_renderer_backend_t *backend)
{
if (using_input_device (&backend->input_source)) {
- ply_input_device_t *dev = get_any_input_device_with_leds (backend);
- const char *keymap = ply_input_device_get_keymap (dev);
+ const char *keymap;
+ ply_input_device_t *dev = get_any_input_device (backend);
+ if (!dev)
+ return NULL;
+
+ keymap = ply_input_device_get_keymap (dev);
if (keymap != NULL) {
return keymap;
}
--
2.46.1

View File

@ -1,871 +0,0 @@
From f55051678452647e035853ee94a89cb54ea2aa4a Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Fri, 17 Jul 2020 16:06:44 -0400
Subject: [PATCH] src: die during shutdown with everything else
plymouthd currently avoids getting killed at shutdown. This causes
filesystems to fail to remount read-only in some cases.
This commit changes things up so that plymouthd dies with everyone else,
but spawns a process to hold open the drm device that can keep the splash
up until the very end.
In order to keep this process alive until the very end, it gets run
from within the initramfs (if available). This requires adding service
files to jump back into the initramfs at shutdown
---
configure.ac | 1 +
scripts/plymouth-populate-initrd.in | 2 +
src/Makefile.am | 7 +++
src/main.c | 11 +++-
src/plugins/renderers/drm/Makefile.am | 3 +-
src/plugins/renderers/drm/plugin.c | 62 +++++++++++++++++++
src/plymouthd-drm-escrow.c | 18 ++++++
systemd-units/Makefile.am | 28 ++++++---
systemd-units/plymouth-halt.service.in | 1 +
systemd-units/plymouth-poweroff.service.in | 1 +
systemd-units/plymouth-reboot.service.in | 1 +
.../plymouth-switch-root-initramfs.service.in | 12 ++++
12 files changed, 134 insertions(+), 13 deletions(-)
create mode 100644 src/plymouthd-drm-escrow.c
create mode 100644 systemd-units/plymouth-switch-root-initramfs.service.in
diff --git a/configure.ac b/configure.ac
index 970e19f..1dc8cdb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -319,36 +319,37 @@ AC_CONFIG_FILES([Makefile po/Makefile.in
src/plugins/controls/label/Makefile
src/Makefile
src/client/ply-boot-client.pc
src/client/Makefile
src/upstart-bridge/Makefile
themes/Makefile
themes/spinfinity/Makefile
themes/fade-in/Makefile
themes/tribar/Makefile
themes/text/Makefile
themes/details/Makefile
themes/solar/Makefile
themes/glow/Makefile
themes/spinner/Makefile
themes/script/Makefile
themes/bgrt/Makefile
images/Makefile
scripts/plymouth-generate-initrd
scripts/plymouth-populate-initrd
scripts/plymouth-set-default-theme
scripts/Makefile
systemd-units/plymouth-halt.service
systemd-units/plymouth-kexec.service
systemd-units/plymouth-poweroff.service
systemd-units/plymouth-quit.service
systemd-units/plymouth-quit-wait.service
systemd-units/plymouth-read-write.service
systemd-units/plymouth-reboot.service
systemd-units/plymouth-start.service
systemd-units/plymouth-switch-root.service
+ systemd-units/plymouth-switch-root-initramfs.service
systemd-units/systemd-ask-password-plymouth.path
systemd-units/systemd-ask-password-plymouth.service
systemd-units/Makefile
docs/Makefile
])
AC_OUTPUT
diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in
index 60fd063..535a896 100755
--- a/scripts/plymouth-populate-initrd.in
+++ b/scripts/plymouth-populate-initrd.in
@@ -1,54 +1,55 @@
#!/bin/bash
#
# inst bits ruthlessly and viciously stolen from dracut
[ -z "$DESTDIR" ] || exit 0
# For running on a (cross-compiled) sysroot, the following
# settings are needed:
# PLYMOUTH_SYSROOT - the sysroot directory
# PLYMOUTH_LDD - an optional ldd command that works on foreign binaries
# PLYMOUTH_LDD_PATH - optional PATH ldd is run with
[ -z "$PLYMOUTH_LDD" ] && PLYMOUTH_LDD="ldd"
[ -z "$PLYMOUTH_LDD_PATH" ] && PLYMOUTH_LDD_PATH="$PATH"
[ -z "$PLYMOUTH_LIBEXECDIR" ] && PLYMOUTH_LIBEXECDIR="@PLYMOUTH_LIBEXECDIR@"
[ -z "$PLYMOUTH_DATADIR" ] && PLYMOUTH_DATADIR="@PLYMOUTH_DATADIR@"
[ -z "$PLYMOUTH_PLUGIN_PATH" ] && PLYMOUTH_PLUGIN_PATH="$(plymouth --get-splash-plugin-path)"
[ -z "$PLYMOUTH_LOGO_FILE" ] && PLYMOUTH_LOGO_FILE="@PLYMOUTH_LOGO_FILE@"
[ -n "$PLYMOUTH_THEME_NAME" ] && THEME_OVERRIDE=1
[ -z "$PLYMOUTH_THEME_NAME" ] && PLYMOUTH_THEME_NAME=$(plymouth-set-default-theme)
[ -z "$PLYMOUTH_CONFDIR" ] && PLYMOUTH_CONFDIR="@PLYMOUTH_CONF_DIR@"
[ -z "$PLYMOUTH_POLICYDIR" ] && PLYMOUTH_POLICYDIR="@PLYMOUTH_POLICY_DIR@"
[ -z "$PLYMOUTH_DAEMON_PATH" ] && PLYMOUTH_DAEMON_PATH="@PLYMOUTH_DAEMON_DIR@/plymouthd"
[ -z "$PLYMOUTH_CLIENT_PATH" ] && PLYMOUTH_CLIENT_PATH="@PLYMOUTH_CLIENT_DIR@/plymouth"
+[ -z "$PLYMOUTH_DRM_ESCROW_PATH" ] && PLYMOUTH_DRM_ESCROW_PATH="@PLYMOUTH_LIBEXECDIR@/plymouth/plymouth-drm-escrow"
[ -z "$SYSTEMD_UNIT_DIR" ] && SYSTEMD_UNIT_DIR="@SYSTEMD_UNIT_DIR@"
[ -z "$SUPPORTED_LANGUAGES" ] && SUPPORTED_LANGUAGES="pt fr de it ru es en zh ja ko zh as bn gu hi kn ml mr or pa ta te"
# Generic substring function. If $2 is in $1, return 0.
strstr() { [ "${1#*$2*}" != "$1" ]; }
ddebug() {
[ "$verbose" = "true" ] && echo "$@"
}
# normalize_path <path>
# Prints the normalized path, where it removes any duplicated
# and trailing slashes.
# Example:
# $ normalize_path ///test/test//
# /test/test
normalize_path() {
shopt -q -s extglob
set -- "${1//+(\/)//}"
shopt -q -u extglob
echo "${1%/}"
}
# convert_abs_rel <from> <to>
# Prints the relative path, when creating a symlink to <to> from <from>.
# Example:
# $ convert_abs_rel /usr/bin/test /bin/test-2
# ../../bin/test-2
# $ ln -s $(convert_abs_rel /usr/bin/test /bin/test-2) /usr/bin/test
convert_abs_rel() {
@@ -390,60 +391,61 @@ verbose=false
INITRDDIR=""
while [ $# -gt 0 ]; do
case $1 in
--verbose|-v)
verbose=true
;;
--targetdir|-t)
shift
INITRDDIR="$1"
;;
--help|-h)
usage normal
;;
*)
usage error
break
;;
esac
shift
done
[ -z "$INITRDDIR" ] && usage error
ddebug "Running with PLYMOUTH_SYSROOT=$PLYMOUTH_SYSROOT"
ddebug "Running with PLYMOUTH_LDD=$PLYMOUTH_LDD"
ddebug "Running with PLYMOUTH_LDD_PATH=$PLYMOUTH_LDD_PATH"
mkdir -p ${INITRDDIR}${PLYMOUTH_DATADIR}/plymouth/themes
inst ${PLYMOUTH_DAEMON_PATH} $INITRDDIR
inst ${PLYMOUTH_CLIENT_PATH} $INITRDDIR
+inst ${PLYMOUTH_DRM_ESCROW_PATH} $INITRDDIR
inst ${PLYMOUTH_DATADIR}/plymouth/themes/text/text.plymouth $INITRDDIR
inst ${PLYMOUTH_PLUGIN_PATH}/text.so $INITRDDIR
inst ${PLYMOUTH_DATADIR}/plymouth/themes/details/details.plymouth $INITRDDIR
inst ${PLYMOUTH_PLUGIN_PATH}/details.so $INITRDDIR
inst ${PLYMOUTH_LOGO_FILE} $INITRDDIR
inst @RELEASE_FILE@ $INITRDDIR
inst ${PLYMOUTH_POLICYDIR}/plymouthd.defaults $INITRDDIR
inst ${PLYMOUTH_CONFDIR}/plymouthd.conf $INITRDDIR
if [ -z "$PLYMOUTH_THEME_NAME" ]; then
echo "No default plymouth plugin is set" >&2
exit 1
fi
if [ $THEME_OVERRIDE ]; then
conf=$INITRDDIR/${PLYMOUTH_CONFDIR}/plymouthd.conf
echo "modifying plymouthd.conf: Theme=$PLYMOUTH_THEME_NAME" >&2
# make sure the section and key exist so we can modify them
grep -q "^ *\[Daemon\]" $conf || echo "[Daemon]" >> $conf
grep -q "^ *Theme *=" $conf || echo "Theme=fade-in" >> $conf
sed -i "s/^ *Theme *=.*/# theme modified by plymouth-populate-initrd\nTheme=$PLYMOUTH_THEME_NAME/" $conf
fi
PLYMOUTH_MODULE_NAME=$(grep "ModuleName *= *" ${PLYMOUTH_SYSROOT}${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ModuleName *= *//')
PLYMOUTH_THEME_DIR="${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}"
PLYMOUTH_IMAGE_DIR=$(grep "ImageDir *= *" ${PLYMOUTH_SYSROOT}${PLYMOUTH_THEME_DIR}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ImageDir *= *//')
if [ ! -f ${PLYMOUTH_SYSROOT}${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so ]; then
echo "The default plymouth plugin (${PLYMOUTH_MODULE_NAME}) doesn't exist" >&2
exit 1
diff --git a/src/Makefile.am b/src/Makefile.am
index 95ed019..78f3f78 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,52 +1,59 @@
SUBDIRS = libply libply-splash-core libply-splash-graphics . plugins client
if ENABLE_UPSTART_MONITORING
SUBDIRS += upstart-bridge
endif
AM_CPPFLAGS = -I$(top_srcdir) \
-I$(srcdir)/libply \
-I$(srcdir)/libply-splash-core \
-I$(srcdir) \
+ -DPLYMOUTH_DRM_ESCROW_DIRECTORY=\"$(libexecdir)/plymouth\" \
-DPLYMOUTH_LOG_DIRECTORY=\"$(localstatedir)/log\" \
-DPLYMOUTH_SPOOL_DIRECTORY=\"$(localstatedir)/spool/plymouth\" \
-DPLYMOUTH_TIME_DIRECTORY=\"$(localstatedir)/lib/plymouth/\" \
-DPLYMOUTH_LOGO_FILE=\"$(logofile)\"
plymouthdbindir = $(plymouthdaemondir)
plymouthdbin_PROGRAMS = plymouthd
plymouthd_CFLAGS = $(PLYMOUTH_CFLAGS) \
-rdynamic \
-DPLYMOUTH_PLUGIN_PATH=\"$(PLYMOUTH_PLUGIN_PATH)\" \
-DPLYMOUTH_THEME_PATH=\"$(PLYMOUTH_THEME_PATH)/\" \
-DPLYMOUTH_POLICY_DIR=\"$(PLYMOUTH_POLICY_DIR)/\" \
-DPLYMOUTH_RUNTIME_DIR=\"$(PLYMOUTH_RUNTIME_DIR)\" \
-DPLYMOUTH_CONF_DIR=\"$(PLYMOUTH_CONF_DIR)/\" \
-DPLYMOUTH_RUNTIME_THEME_PATH=\"$(PLYMOUTH_RUNTIME_THEME_PATH)/\"
plymouthd_LDADD = $(PLYMOUTH_LIBS) libply/libply.la libply-splash-core/libply-splash-core.la
plymouthd_SOURCES = \
ply-boot-protocol.h \
ply-boot-server.h \
ply-boot-server.c \
plugins/splash/details/plugin.c \
main.c
+escrowdir = $(libexecdir)/plymouth
+escrow_PROGRAMS = plymouthd-drm-escrow
+
+plymouthd_drm_escrow_LDFLAGS = -all-static
+plymouthd_drm_escrow_SOURCES = plymouthd-drm-escrow.c
+
plymouthdrundir = $(localstatedir)/run/plymouth
plymouthdspooldir = $(localstatedir)/spool/plymouth
plymouthdtimedir = $(localstatedir)/lib/plymouth
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = ply-splash-core.pc ply-splash-graphics.pc
plymouthd_defaultsdir = $(PLYMOUTH_POLICY_DIR)
dist_plymouthd_defaults_DATA = plymouthd.defaults
plymouthd_confdir = $(PLYMOUTH_CONF_DIR)
dist_plymouthd_conf_DATA = plymouthd.conf
install-data-hook:
-mkdir -p $(DESTDIR)$(plymouthdrundir)
-mkdir -p $(DESTDIR)$(plymouthdspooldir)
-mkdir -p $(DESTDIR)$(plymouthdtimedir)
EXTRA_DIST = ply-splash-core.pc.in ply-splash-graphics.pc.in
MAINTAINERCLEANFILES = Makefile.in
diff --git a/src/main.c b/src/main.c
index 8848ad0..8372f2f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2181,65 +2181,70 @@ main (int argc,
if (daemon_handle == NULL) {
ply_error ("plymouthd: cannot daemonize: %m");
return EX_UNAVAILABLE;
}
}
if (debug)
debug_buffer = ply_buffer_new ();
signal (SIGABRT, on_crash);
signal (SIGSEGV, on_crash);
/* before do anything we need to make sure we have a working
* environment.
*/
if (!initialize_environment (&state)) {
if (errno == 0) {
if (daemon_handle != NULL)
ply_detach_daemon (daemon_handle, 0);
return 0;
}
ply_error ("plymouthd: could not setup basic operating environment: %m");
if (daemon_handle != NULL)
ply_detach_daemon (daemon_handle, EX_OSERR);
return EX_OSERR;
}
/* Make the first byte in argv be '@' so that we can survive systemd's killing
- * spree when going from initrd to /, and so we stay alive all the way until
- * the power is killed at shutdown.
+ * spree when going from initrd to /
* http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
+ *
+ * If the system is shutting down, we let systemd slay us because otherwise we
+ * may prevent the root fs from getting remounted read-only.
*/
- argv[0][0] = '@';
+ if (state.mode != PLY_BOOT_SPLASH_MODE_SHUTDOWN &&
+ state.mode != PLY_BOOT_SPLASH_MODE_REBOOT) {
+ argv[0][0] = '@';
+ }
state.boot_server = start_boot_server (&state);
if (state.boot_server == NULL) {
ply_trace ("plymouthd is already running");
if (daemon_handle != NULL)
ply_detach_daemon (daemon_handle, EX_OK);
return EX_OK;
}
state.boot_buffer = ply_buffer_new ();
if (attach_to_session) {
state.should_be_attached = attach_to_session;
if (!attach_to_running_session (&state)) {
ply_trace ("could not redirect console session: %m");
if (!no_daemon)
ply_detach_daemon (daemon_handle, EX_UNAVAILABLE);
return EX_UNAVAILABLE;
}
}
state.progress = ply_progress_new ();
state.splash_delay = NAN;
state.device_timeout = NAN;
ply_progress_load_cache (state.progress,
get_cache_file_for_mode (state.mode));
diff --git a/src/plugins/renderers/drm/Makefile.am b/src/plugins/renderers/drm/Makefile.am
index 271b17f..22a819b 100644
--- a/src/plugins/renderers/drm/Makefile.am
+++ b/src/plugins/renderers/drm/Makefile.am
@@ -1,23 +1,24 @@
if ENABLE_DRM_RENDERER
AM_CPPFLAGS = -I$(top_srcdir) \
-I$(srcdir)/../../../libply \
-I$(srcdir)/../../../libply-splash-core \
-I$(srcdir)/../../.. \
-I$(srcdir)/../.. \
-I$(srcdir)/.. \
- -I$(srcdir)
+ -I$(srcdir) \
+ -DPLYMOUTH_DRM_ESCROW_DIRECTORY=\"$(libexecdir)/plymouth\"
plugindir = $(libdir)/plymouth/renderers
plugin_LTLIBRARIES = drm.la
drm_la_CFLAGS = $(PLYMOUTH_CFLAGS) $(DRM_CFLAGS)
drm_la_LDFLAGS = -module -avoid-version -export-dynamic
drm_la_LIBADD = $(PLYMOUTH_LIBS) $(DRM_LIBS) \
../../../libply/libply.la \
../../../libply-splash-core/libply-splash-core.la
drm_la_SOURCES = $(srcdir)/plugin.c
endif
MAINTAINERCLEANFILES = Makefile.in
diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c
index 4dbf8da..38bae36 100644
--- a/src/plugins/renderers/drm/plugin.c
+++ b/src/plugins/renderers/drm/plugin.c
@@ -131,73 +131,79 @@ typedef struct
bool connected;
bool uses_hw_rotation;
} ply_output_t;
struct _ply_renderer_backend
{
ply_event_loop_t *loop;
ply_terminal_t *terminal;
int device_fd;
char *device_name;
drmModeRes *resources;
ply_renderer_input_source_t input_source;
ply_list_t *heads;
ply_hashtable_t *heads_by_controller_id;
ply_hashtable_t *output_buffers;
ply_output_t *outputs;
int outputs_len;
int connected_count;
int32_t dither_red;
int32_t dither_green;
int32_t dither_blue;
uint32_t is_active : 1;
uint32_t requires_explicit_flushing : 1;
uint32_t use_preferred_mode : 1;
+ uint32_t watching_for_termination : 1;
int panel_width;
int panel_height;
ply_pixel_buffer_rotation_t panel_rotation;
int panel_scale;
};
ply_renderer_plugin_interface_t *ply_renderer_backend_get_interface (void);
static bool open_input_source (ply_renderer_backend_t *backend,
ply_renderer_input_source_t *input_source);
static void flush_head (ply_renderer_backend_t *backend,
ply_renderer_head_t *head);
+static void close_device (ply_renderer_backend_t *backend);
+
+static void watch_for_termination (ply_renderer_backend_t *backend);
+static void stop_watching_for_termination (ply_renderer_backend_t *backend);
+
/* A small helper to determine if we should try to keep the current mode
* or pick the best mode ourselves, we keep the current mode only if the
* user specified a specific mode using video= on the commandline.
*/
static bool
should_use_preferred_mode (void)
{
bool use_preferred_mode = true;
if (ply_kernel_command_line_get_string_after_prefix ("video="))
use_preferred_mode = false;
ply_trace ("should_use_preferred_mode: %d", use_preferred_mode);
return use_preferred_mode;
}
static bool
ply_renderer_buffer_map (ply_renderer_backend_t *backend,
ply_renderer_buffer_t *buffer)
{
struct drm_mode_map_dumb map_dumb_buffer_request;
void *map_address;
if (buffer->map_address != MAP_FAILED) {
buffer->map_count++;
return true;
}
memset (&map_dumb_buffer_request, 0, sizeof(struct drm_mode_map_dumb));
@@ -918,158 +924,214 @@ static void
destroy_backend (ply_renderer_backend_t *backend)
{
ply_trace ("destroying renderer backend for device %s", backend->device_name);
free_heads (backend);
free (backend->device_name);
ply_hashtable_free (backend->output_buffers);
ply_hashtable_free (backend->heads_by_controller_id);
free (backend->outputs);
free (backend);
}
static void
activate (ply_renderer_backend_t *backend)
{
ply_renderer_head_t *head;
ply_list_node_t *node;
ply_trace ("taking master and scanning out");
backend->is_active = true;
drmSetMaster (backend->device_fd);
node = ply_list_get_first_node (backend->heads);
while (node != NULL) {
head = (ply_renderer_head_t *) ply_list_node_get_data (node);
/* Flush out any pending drawing to the buffer */
flush_head (backend, head);
node = ply_list_get_next_node (backend->heads, node);
}
+
+ watch_for_termination (backend);
}
static void
deactivate (ply_renderer_backend_t *backend)
{
ply_trace ("dropping master");
drmDropMaster (backend->device_fd);
backend->is_active = false;
+
+ stop_watching_for_termination (backend);
}
static void
on_active_vt_changed (ply_renderer_backend_t *backend)
{
if (ply_terminal_is_active (backend->terminal)) {
ply_trace ("activating on vt change");
activate (backend);
} else {
ply_trace ("deactivating on vt change");
deactivate (backend);
}
}
static bool
load_driver (ply_renderer_backend_t *backend)
{
int device_fd;
ply_trace ("Opening '%s'", backend->device_name);
device_fd = open (backend->device_name, O_RDWR);
if (device_fd < 0) {
ply_trace ("open failed: %m");
return false;
}
backend->device_fd = device_fd;
drmDropMaster (device_fd);
return true;
}
static void
unload_backend (ply_renderer_backend_t *backend)
{
if (backend == NULL)
return;
ply_trace ("unloading backend");
if (backend->device_fd >= 0) {
drmClose (backend->device_fd);
backend->device_fd = -1;
}
destroy_backend (backend);
backend = NULL;
}
+static void
+on_term_signal (ply_renderer_backend_t *backend)
+{
+ pid_t pid;
+
+ ply_trace ("got SIGTERM, launching drm escrow to protect splash, and dying");
+
+ pid = fork();
+
+ if (pid == 0) {
+ const char *argv[] = { PLYMOUTH_DRM_ESCROW_DIRECTORY "/plymouthd-drm-escrow", NULL };
+
+ dup (backend->device_fd);
+ execve (argv[0], (char * const *) argv, NULL);
+
+ ply_trace ("could not launch drm escrow process: %m");
+
+ _exit (1);
+ }
+
+
+ close_device (backend);
+
+ exit (0);
+}
+
+static void
+watch_for_termination (ply_renderer_backend_t *backend)
+{
+ if (backend->watching_for_termination)
+ return;
+
+ ply_trace ("watching for termination signal");
+ ply_event_loop_watch_signal (backend->loop, SIGTERM, (ply_event_handler_t) on_term_signal, backend);
+ backend->watching_for_termination = true;
+}
+
+static void
+stop_watching_for_termination (ply_renderer_backend_t *backend)
+{
+ if (!backend->watching_for_termination)
+ return;
+
+ ply_trace ("stopping watching for termination signal");
+ ply_event_loop_stop_watching_signal (backend->loop, SIGTERM);
+ backend->watching_for_termination = false;
+}
+
static bool
open_device (ply_renderer_backend_t *backend)
{
assert (backend != NULL);
assert (backend->device_name != NULL);
if (!load_driver (backend))
return false;
if (backend->terminal == NULL)
return true;
if (!ply_terminal_open (backend->terminal)) {
ply_trace ("could not open terminal: %m");
return false;
}
if (!ply_terminal_is_vt (backend->terminal)) {
ply_trace ("terminal is not a VT");
ply_terminal_close (backend->terminal);
return false;
}
ply_terminal_watch_for_active_vt_change (backend->terminal,
(ply_terminal_active_vt_changed_handler_t)
on_active_vt_changed,
backend);
+ watch_for_termination (backend);
+
return true;
}
static void
close_device (ply_renderer_backend_t *backend)
{
ply_trace ("closing device");
free_heads (backend);
+ stop_watching_for_termination (backend);
+
if (backend->terminal != NULL) {
ply_terminal_stop_watching_for_active_vt_change (backend->terminal,
(ply_terminal_active_vt_changed_handler_t)
on_active_vt_changed,
backend);
}
unload_backend (backend);
}
static void
output_get_controller_info (ply_renderer_backend_t *backend,
drmModeConnector *connector,
ply_output_t *output)
{
int i;
drmModeEncoder *encoder;
assert (backend != NULL);
output->possible_controllers = 0xffffffff;
for (i = 0; i < connector->count_encoders; i++) {
encoder = drmModeGetEncoder (backend->device_fd,
connector->encoders[i]);
if (encoder == NULL)
continue;
if (encoder->encoder_id == connector->encoder_id && encoder->crtc_id) {
diff --git a/src/plymouthd-drm-escrow.c b/src/plymouthd-drm-escrow.c
new file mode 100644
index 0000000..9097db9
--- /dev/null
+++ b/src/plymouthd-drm-escrow.c
@@ -0,0 +1,18 @@
+#include <signal.h>
+#include <unistd.h>
+
+int
+main(int argc, char **argv)
+{
+ signal (SIGTERM, SIG_IGN);
+
+ /* Make the first byte in argv be '@' so that we can survive systemd's killing
+ * spree until the power is killed at shutdown.
+ * http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
+ */
+ argv[0][0] = '@';
+
+ while (pause());
+
+ return 0;
+}
diff --git a/systemd-units/Makefile.am b/systemd-units/Makefile.am
index b1d843b..bfede17 100644
--- a/systemd-units/Makefile.am
+++ b/systemd-units/Makefile.am
@@ -1,78 +1,88 @@
systemd_unit_templates = \
plymouth-switch-root.service.in \
+ plymouth-switch-root-initramfs.service.in \
plymouth-start.service.in \
plymouth-read-write.service.in \
plymouth-quit.service.in \
plymouth-quit-wait.service.in \
plymouth-reboot.service.in \
plymouth-kexec.service.in \
plymouth-poweroff.service.in \
plymouth-halt.service.in \
systemd-ask-password-plymouth.path.in \
systemd-ask-password-plymouth.service.in
if ENABLE_SYSTEMD_INTEGRATION
systemdunitdir=$(SYSTEMD_UNIT_DIR)
systemdunit_DATA = $(systemd_unit_templates:.in=)
install-data-hook:
$(MKDIR_P) -m 0755 \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/initrd-switch-root.target.wants\
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/sysinit.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/initrd-switch-root.target.wants && \
rm -f plymouth-start.service plymouth-switch-root.service && \
$(LN_S) ../plymouth-start.service && \
$(LN_S) ../plymouth-switch-root.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/sysinit.target.wants && \
rm -f plymouth-start.service plymouth-read-write.service && \
$(LN_S) ../plymouth-start.service && \
$(LN_S) ../plymouth-read-write.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants && \
rm -f plymouth-quit.service plymouth-quit-wait.service && \
$(LN_S) ../plymouth-quit.service && \
$(LN_S) ../plymouth-quit-wait.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants && \
- rm -f plymouth-reboot.service && \
- $(LN_S) ../plymouth-reboot.service)
+ rm -f plymouth-reboot.service \
+ plymouth-switch-root-initramfs.service && \
+ $(LN_S) ../plymouth-reboot.service && \
+ $(LN_S) ../plymouth-switch-root-initramfs.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants && \
rm -f plymouth-kexec.service && \
$(LN_S) ../plymouth-kexec.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants && \
- rm -f plymouth-poweroff.service && \
- $(LN_S) ../plymouth-poweroff.service)
+ rm -f plymouth-poweroff.service \
+ plymouth-switch-root-initramfs.service && \
+ $(LN_S) ../plymouth-poweroff.service && \
+ $(LN_S) ../plymouth-switch-root-initramfs.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants && \
- rm -f plymouth-halt.service && \
- $(LN_S) ../plymouth-halt.service)
+ rm -f plymouth-halt.service \
+ plymouth-switch-root-initramfs.service && \
+ $(LN_S) ../plymouth-halt.service && \
+ $(LN_S) ../plymouth-switch-root-initramfs.service)
uninstall-hook:
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/initrd-switch-root.target.wants && \
rm -f plymouth-start.service plymouth-switch-root.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/sysinit.target.wants && \
rm -f plymouth-start.service plymouth-read-write.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants && \
rm -f plymouth-quit.service plymouth-quit-wait.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants && \
- rm -f plymouth-reboot.service)
+ rm -f plymouth-reboot.service \
+ plymouth-switch-root-initramfs.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants && \
rm -f plymouth-kexec.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants && \
- rm -f plymouth-poweroff.service)
+ rm -f plymouth-poweroff.service \
+ plymouth-switch-root-initramfs.service)
(cd $(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants && \
- rm -f plymouth-halt.service)
+ rm -f plymouth-halt.service \
+ plymouth-switch-root-initramfs.service)
rmdir --ignore-fail-on-non-empty \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/sysinit.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/multi-user.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/reboot.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/kexec.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/poweroff.target.wants \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/halt.target.wants
endif
EXTRA_DIST = $(systemd_unit_templates) $(systemdunit_DATA)
DISTCLEANFILES=$(systemdunit_DATA)
diff --git a/systemd-units/plymouth-halt.service.in b/systemd-units/plymouth-halt.service.in
index cb87c1f..00f7eed 100644
--- a/systemd-units/plymouth-halt.service.in
+++ b/systemd-units/plymouth-halt.service.in
@@ -1,13 +1,14 @@
[Unit]
Description=Show Plymouth Halt Screen
After=getty@tty1.service display-manager.service plymouth-start.service
Before=systemd-halt.service
DefaultDependencies=no
ConditionKernelCommandLine=!plymouth.enable=0
ConditionVirtualization=!container
[Service]
ExecStart=@PLYMOUTH_DAEMON_DIR@/plymouthd --mode=shutdown --attach-to-session
ExecStartPost=-@PLYMOUTH_CLIENT_DIR@/plymouth show-splash
+KillMode=none
Type=forking
RemainAfterExit=yes
diff --git a/systemd-units/plymouth-poweroff.service.in b/systemd-units/plymouth-poweroff.service.in
index cf05e47..a1f78eb 100644
--- a/systemd-units/plymouth-poweroff.service.in
+++ b/systemd-units/plymouth-poweroff.service.in
@@ -1,13 +1,14 @@
[Unit]
Description=Show Plymouth Power Off Screen
After=getty@tty1.service display-manager.service plymouth-start.service
Before=systemd-poweroff.service
DefaultDependencies=no
ConditionKernelCommandLine=!plymouth.enable=0
ConditionVirtualization=!container
[Service]
ExecStart=@PLYMOUTH_DAEMON_DIR@/plymouthd --mode=shutdown --attach-to-session
ExecStartPost=-@PLYMOUTH_CLIENT_DIR@/plymouth show-splash
+KillMode=none
Type=forking
RemainAfterExit=yes
diff --git a/systemd-units/plymouth-reboot.service.in b/systemd-units/plymouth-reboot.service.in
index 3624550..8fff576 100644
--- a/systemd-units/plymouth-reboot.service.in
+++ b/systemd-units/plymouth-reboot.service.in
@@ -1,13 +1,14 @@
[Unit]
Description=Show Plymouth Reboot Screen
After=getty@tty1.service display-manager.service plymouth-start.service
Before=systemd-reboot.service
DefaultDependencies=no
ConditionKernelCommandLine=!plymouth.enable=0
ConditionVirtualization=!container
[Service]
ExecStart=@PLYMOUTH_DAEMON_DIR@/plymouthd --mode=reboot --attach-to-session
ExecStartPost=-@PLYMOUTH_CLIENT_DIR@/plymouth show-splash
+KillMode=none
Type=forking
RemainAfterExit=yes
diff --git a/systemd-units/plymouth-switch-root-initramfs.service.in b/systemd-units/plymouth-switch-root-initramfs.service.in
new file mode 100644
index 0000000..cb20459
--- /dev/null
+++ b/systemd-units/plymouth-switch-root-initramfs.service.in
@@ -0,0 +1,12 @@
+[Unit]
+Description=Tell Plymouth To Jump To initramfs
+DefaultDependencies=no
+After=plymouth-halt.service plymouth-reboot.service plymouth-poweroff.service dracut-shutdown.service
+ConditionPathExists=/run/initramfs/bin/sh
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=-@PLYMOUTH_CLIENT_DIR@/plymouth update-root-fs --new-root-dir=/run/initramfs
+Type=oneshot
+RemainAfterExit=yes
--
2.26.0

View File

@ -1,142 +0,0 @@
From b9faf90fe5939fedfd710e1e8385f4d5c12e1df7 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 15 Jun 2020 10:35:45 -0400
Subject: [PATCH 2/2] throbgress: update for api change
---
src/plugins/splash/throbgress/plugin.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/plugins/splash/throbgress/plugin.c b/src/plugins/splash/throbgress/plugin.c
index 86be064..68cca70 100644
--- a/src/plugins/splash/throbgress/plugin.c
+++ b/src/plugins/splash/throbgress/plugin.c
@@ -715,61 +715,61 @@ update_status (ply_boot_splash_plugin_t *plugin,
}
static void
on_boot_progress (ply_boot_splash_plugin_t *plugin,
double duration,
double percent_done)
{
ply_list_node_t *node;
double total_duration;
if (plugin->mode == PLY_BOOT_SPLASH_MODE_UPDATES ||
plugin->mode == PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE ||
plugin->mode == PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE)
return;
total_duration = duration / percent_done;
/* Fun made-up smoothing function to make the growth asymptotic:
* fraction(time,estimate)=1-2^(-(time^1.45)/estimate) */
percent_done = 1.0 - pow (2.0, -pow (duration, 1.45) / total_duration) * (1.0 - percent_done);
node = ply_list_get_first_node (plugin->views);
while (node != NULL) {
ply_list_node_t *next_node;
view_t *view;
view = ply_list_node_get_data (node);
next_node = ply_list_get_next_node (plugin->views, node);
- ply_progress_bar_set_percent_done (view->progress_bar, percent_done);
+ ply_progress_bar_set_fraction_done (view->progress_bar, percent_done);
node = next_node;
}
}
static void
hide_splash_screen (ply_boot_splash_plugin_t *plugin,
ply_event_loop_t *loop)
{
assert (plugin != NULL);
ply_trace ("hiding splash");
if (plugin->loop != NULL) {
stop_animation (plugin, NULL);
ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t)
detach_from_event_loop,
plugin);
detach_from_event_loop (plugin);
}
plugin->is_visible = false;
}
static void
show_password_prompt (ply_boot_splash_plugin_t *plugin,
const char *text,
int number_of_bullets)
{
ply_list_node_t *node;
@@ -920,61 +920,61 @@ display_question (ply_boot_splash_plugin_t *plugin,
show_prompt (plugin, prompt, entry_text);
redraw_views (plugin);
unpause_views (plugin);
}
static void
display_message (ply_boot_splash_plugin_t *plugin,
const char *message)
{
show_message (plugin, message);
}
static void
system_update (ply_boot_splash_plugin_t *plugin,
int progress)
{
ply_list_node_t *node;
if (plugin->mode != PLY_BOOT_SPLASH_MODE_UPDATES &&
plugin->mode != PLY_BOOT_SPLASH_MODE_SYSTEM_UPGRADE &&
plugin->mode != PLY_BOOT_SPLASH_MODE_FIRMWARE_UPGRADE)
return;
node = ply_list_get_first_node (plugin->views);
while (node != NULL) {
ply_list_node_t *next_node;
view_t *view;
view = ply_list_node_get_data (node);
next_node = ply_list_get_next_node (plugin->views, node);
- ply_progress_bar_set_percent_done (view->progress_bar, (double) progress / 100.f);
+ ply_progress_bar_set_fraction_done (view->progress_bar, (double) progress / 100.f);
node = next_node;
}
}
ply_boot_splash_plugin_interface_t *
ply_boot_splash_plugin_get_interface (void)
{
static ply_boot_splash_plugin_interface_t plugin_interface =
{
.create_plugin = create_plugin,
.destroy_plugin = destroy_plugin,
.add_pixel_display = add_pixel_display,
.remove_pixel_display = remove_pixel_display,
.show_splash_screen = show_splash_screen,
.update_status = update_status,
.on_boot_progress = on_boot_progress,
.hide_splash_screen = hide_splash_screen,
.on_root_mounted = on_root_mounted,
.become_idle = become_idle,
.display_normal = display_normal,
.display_password = display_password,
.display_question = display_question,
.display_message = display_message,
.system_update = system_update,
};
return &plugin_interface;
}
/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
--
2.21.0

View File

@ -1,39 +0,0 @@
0.222:RCkernelparam
0.223:RChostname
0.238:RCmountfs
0.275:RCswap
0.330:microcode_ctl
0.357:cpuspeed
0.365:ip6tables
0.380:iptables
0.385:isdn
0.504:auditd
0.508:restorecond
0.523:rsyslog
0.530:irqbalance
0.533:rpcbind
0.549:nfslock
0.561:mdmonitor
0.563:rpcidmapd
0.578:rpcgssd
0.579:messagebus
0.580:fuse
0.594:netfs
0.600:acpid
0.611:haldaemon
0.660:pcscd
0.691:udev-post
0.703:portreserve
0.712:setroubleshoot
0.749:bluetooth
0.738:sshd
0.763:ntpd
0.807:sendmail
0.876:crond
0.902:kerneloops
0.907:smolt
0.915:atd
0.927:avahi-daemon
0.941:cups
0.983:anacron
0.992:local

View File

@ -1,8 +0,0 @@
/var/log/boot.log
{
missingok
daily
copytruncate
rotate 7
notifempty
}

View File

@ -1,2 +0,0 @@
#!/bin/bash
dracut -f

View File

@ -1,154 +0,0 @@
From f72cdd6969c483d7811e5684fa3143deff55a0c7 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 17 Jun 2019 13:54:42 -0400
Subject: [PATCH] populate-initrd: ship label plugin
This gives us font rendering at early boot.
---
scripts/plymouth-populate-initrd.in | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in
index 616ecc4..60fd063 100755
--- a/scripts/plymouth-populate-initrd.in
+++ b/scripts/plymouth-populate-initrd.in
@@ -1,55 +1,56 @@
#!/bin/bash
#
# inst bits ruthlessly and viciously stolen from dracut
[ -z "$DESTDIR" ] || exit 0
# For running on a (cross-compiled) sysroot, the following
# settings are needed:
# PLYMOUTH_SYSROOT - the sysroot directory
# PLYMOUTH_LDD - an optional ldd command that works on foreign binaries
# PLYMOUTH_LDD_PATH - optional PATH ldd is run with
[ -z "$PLYMOUTH_LDD" ] && PLYMOUTH_LDD="ldd"
[ -z "$PLYMOUTH_LDD_PATH" ] && PLYMOUTH_LDD_PATH="$PATH"
[ -z "$PLYMOUTH_LIBEXECDIR" ] && PLYMOUTH_LIBEXECDIR="@PLYMOUTH_LIBEXECDIR@"
[ -z "$PLYMOUTH_DATADIR" ] && PLYMOUTH_DATADIR="@PLYMOUTH_DATADIR@"
[ -z "$PLYMOUTH_PLUGIN_PATH" ] && PLYMOUTH_PLUGIN_PATH="$(plymouth --get-splash-plugin-path)"
[ -z "$PLYMOUTH_LOGO_FILE" ] && PLYMOUTH_LOGO_FILE="@PLYMOUTH_LOGO_FILE@"
[ -n "$PLYMOUTH_THEME_NAME" ] && THEME_OVERRIDE=1
[ -z "$PLYMOUTH_THEME_NAME" ] && PLYMOUTH_THEME_NAME=$(plymouth-set-default-theme)
[ -z "$PLYMOUTH_CONFDIR" ] && PLYMOUTH_CONFDIR="@PLYMOUTH_CONF_DIR@"
[ -z "$PLYMOUTH_POLICYDIR" ] && PLYMOUTH_POLICYDIR="@PLYMOUTH_POLICY_DIR@"
[ -z "$PLYMOUTH_DAEMON_PATH" ] && PLYMOUTH_DAEMON_PATH="@PLYMOUTH_DAEMON_DIR@/plymouthd"
[ -z "$PLYMOUTH_CLIENT_PATH" ] && PLYMOUTH_CLIENT_PATH="@PLYMOUTH_CLIENT_DIR@/plymouth"
[ -z "$SYSTEMD_UNIT_DIR" ] && SYSTEMD_UNIT_DIR="@SYSTEMD_UNIT_DIR@"
+[ -z "$SUPPORTED_LANGUAGES" ] && SUPPORTED_LANGUAGES="pt fr de it ru es en zh ja ko zh as bn gu hi kn ml mr or pa ta te"
# Generic substring function. If $2 is in $1, return 0.
strstr() { [ "${1#*$2*}" != "$1" ]; }
ddebug() {
[ "$verbose" = "true" ] && echo "$@"
}
# normalize_path <path>
# Prints the normalized path, where it removes any duplicated
# and trailing slashes.
# Example:
# $ normalize_path ///test/test//
# /test/test
normalize_path() {
shopt -q -s extglob
set -- "${1//+(\/)//}"
shopt -q -u extglob
echo "${1%/}"
}
# convert_abs_rel <from> <to>
# Prints the relative path, when creating a symlink to <to> from <from>.
# Example:
# $ convert_abs_rel /usr/bin/test /bin/test-2
# ../../bin/test-2
# $ ln -s $(convert_abs_rel /usr/bin/test /bin/test-2) /usr/bin/test
convert_abs_rel() {
local __current __absolute __abssize __cursize __newpath
local -i __i __level
@@ -434,59 +435,77 @@ if [ $THEME_OVERRIDE ]; then
conf=$INITRDDIR/${PLYMOUTH_CONFDIR}/plymouthd.conf
echo "modifying plymouthd.conf: Theme=$PLYMOUTH_THEME_NAME" >&2
# make sure the section and key exist so we can modify them
grep -q "^ *\[Daemon\]" $conf || echo "[Daemon]" >> $conf
grep -q "^ *Theme *=" $conf || echo "Theme=fade-in" >> $conf
sed -i "s/^ *Theme *=.*/# theme modified by plymouth-populate-initrd\nTheme=$PLYMOUTH_THEME_NAME/" $conf
fi
PLYMOUTH_MODULE_NAME=$(grep "ModuleName *= *" ${PLYMOUTH_SYSROOT}${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ModuleName *= *//')
PLYMOUTH_THEME_DIR="${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}"
PLYMOUTH_IMAGE_DIR=$(grep "ImageDir *= *" ${PLYMOUTH_SYSROOT}${PLYMOUTH_THEME_DIR}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ImageDir *= *//')
if [ ! -f ${PLYMOUTH_SYSROOT}${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so ]; then
echo "The default plymouth plugin (${PLYMOUTH_MODULE_NAME}) doesn't exist" >&2
exit 1
fi
inst ${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so $INITRDDIR
[ -f "${PLYMOUTH_SYSROOT}${PLYMOUTH_PLUGIN_PATH}/renderers/drm.so" ] && inst ${PLYMOUTH_PLUGIN_PATH}/renderers/drm.so $INITRDDIR
inst ${PLYMOUTH_PLUGIN_PATH}/renderers/frame-buffer.so $INITRDDIR
if [ -d "${PLYMOUTH_SYSROOT}${PLYMOUTH_THEME_DIR}" ]; then
inst_recur "${PLYMOUTH_THEME_DIR}"
fi
if [ "${PLYMOUTH_IMAGE_DIR}" != "${PLYMOUTH_THEME_DIR}" -a -d "${PLYMOUTH_SYSROOT}${PLYMOUTH_IMAGE_DIR}" ]; then
inst_recur "${PLYMOUTH_IMAGE_DIR}"
fi
-if [ -L ${PLYMOUTH_SYSROOT}${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth ]; then
- cp -a ${PLYMOUTH_SYSROOT}${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth $INITRDDIR${PLYMOUTH_DATADIR}/plymouth/themes
+fonts=""
+needs_graphics="$(find ${INITRDDIR} -name 'libply-splash-graphics.so*' -print -quit | grep -q libply-splash-graphics.so && echo -n 1)"
+
+if [ -n "$needs_graphics" ]; then
+ for lang in $SUPPORTED_LANGUAGES; do
+ font=$(fc-match "":lang="$lang" file | awk -F= '{ print $2}')
+ echo $fonts | grep -q "$font" && continue
+ fonts="$fonts $font"
+ done
+
+ if [ -n "$fonts" ]; then
+ inst ${PLYMOUTH_PLUGIN_PATH}/label.so $INITRDDIR
+ for font in $fonts; do
+ inst $font $INITRDDIR
+ done
+ fi
+fi
+
+if [ -L ${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth ]; then
+ cp -a ${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth $INITRDDIR${PLYMOUTH_DATADIR}/plymouth/themes
fi
if [ -n "$SYSTEMD_UNIT_DIR" -a -d "${PLYMOUTH_SYSROOT}$SYSTEMD_UNIT_DIR" ]; then
inst $SYSTEMD_UNIT_DIR/systemd-ask-password-plymouth.path $INITRDDIR
inst $SYSTEMD_UNIT_DIR/systemd-ask-password-plymouth.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-switch-root.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-start.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-quit.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-quit-wait.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-reboot.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-kexec.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-poweroff.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/plymouth-halt.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/initrd-switch-root.target.wants/plymouth-switch-root.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/initrd-switch-root.target.wants/plymouth-start.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/sysinit.target.wants/plymouth-start.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/multi-user.target.wants/plymouth-quit.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/multi-user.target.wants/plymouth-quit-wait.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/reboot.target.wants/plymouth-reboot.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/kexec.target.wants/plymouth-kexec.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/poweroff.target.wants/plymouth-poweroff.service $INITRDDIR
inst $SYSTEMD_UNIT_DIR/halt.target.wants/plymouth-halt.service $INITRDDIR
fi
# vim:ts=8:sw=4:sts=4:et
--
2.21.0

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
[Plymouth Theme]
Name=Charge
Description=A theme that features a stylized 8 and spinner
Description=A theme that features the shadowy hull of a Fedora logo charge up and and finally burst into into full form.
ModuleName=two-step
[two-step]
ImageDir=/usr/share/plymouth/themes/charge
HorizontalAlignment=.5
VerticalAlignment=.75
VerticalAlignment=.5
Transition=none
TransitionDuration=0.0
BackgroundStartColor=0x202020

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-10
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional}

View File

@ -0,0 +1,556 @@
From 64379c1100a0177f52e130601d44a7ffe0fdedf1 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 4 Jun 2024 21:09:00 +0200
Subject: [PATCH 1/9] ply-utils: Add ply_string_has_suffix () helper function
Add a ply_string_has_suffix () helper function to match the existing
ply_string_has_prefix () helper function.
---
src/libply/ply-utils.c | 18 ++++++++++++++++++
src/libply/ply-utils.h | 2 ++
2 files changed, 20 insertions(+)
diff --git a/src/libply/ply-utils.c b/src/libply/ply-utils.c
index 0e317b67..d6d127f1 100644
--- a/src/libply/ply-utils.c
+++ b/src/libply/ply-utils.c
@@ -473,6 +473,24 @@ ply_string_has_prefix (const char *str,
return strncmp (str, prefix, strlen (prefix)) == 0;
}
+bool
+ply_string_has_suffix (const char *str,
+ const char *suffix)
+{
+ size_t str_len, suffix_len;
+
+ if (str == NULL || suffix == NULL)
+ return false;
+
+ str_len = strlen (str);
+ suffix_len = strlen (suffix);
+
+ if (suffix_len > str_len)
+ return false;
+
+ return strcmp (str + (str_len - suffix_len), suffix) == 0;
+}
+
double
ply_get_timestamp (void)
{
diff --git a/src/libply/ply-utils.h b/src/libply/ply-utils.h
index 7cbbb2f4..86d66384 100644
--- a/src/libply/ply-utils.h
+++ b/src/libply/ply-utils.h
@@ -109,6 +109,8 @@ char **ply_copy_string_array (const char *const *array);
void ply_free_string_array (char **array);
bool ply_string_has_prefix (const char *str,
const char *prefix);
+bool ply_string_has_suffix (const char *str,
+ const char *suffix);
double ply_get_timestamp (void);
void ply_save_errno (void);
--
2.45.1
From 1c3ff0338c80a831b2f0ea63a57e20c9013ddb52 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 4 Jun 2024 21:16:31 +0200
Subject: [PATCH 2/9] ply-device-manager: Add syspath_is_simpledrm () helper
Add a helper to determine if a udev syspath is a simpledrm device.
This is a preparation patch to for making simpledrm devices their
own renderer-type.
---
src/libply-splash-core/ply-device-manager.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index d75ac6c5..4c48f606 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -339,11 +339,15 @@ remove_input_device_from_renderers (ply_device_manager_t *manager,
ply_hashtable_foreach (manager->renderers, (ply_hashtable_foreach_func_t *) on_each_input_device_remove_from_renderer, input_device);
}
+static bool
+syspath_is_simpledrm (const char *syspath)
+{
+ return ply_string_has_suffix (syspath, "simple-framebuffer.0/drm/card0");
+}
+
static bool
verify_drm_device (struct udev_device *device)
{
- const char *id_path;
-
/*
* Simple-framebuffer devices driven by simpledrm lack information
* like panel-rotation info and physical size, causing the splash
@@ -352,8 +356,7 @@ verify_drm_device (struct udev_device *device)
* To avoid this treat simpledrm devices as fbdev devices and only
* use them after the timeout.
*/
- id_path = udev_device_get_property_value (device, "ID_PATH");
- if (!ply_string_has_prefix (id_path, "platform-simple-framebuffer"))
+ if (!syspath_is_simpledrm (udev_device_get_syspath (device)))
return true; /* Not a SimpleDRM device */
/*
--
2.45.1
From 19d49a42fcc3cf9d3ee62a572eec24e8b73f9799 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 4 Jun 2024 21:24:22 +0200
Subject: [PATCH 3/9] ply-renderer: Add new PLY_RENDERER_TYPE_SIMPLEDRM
renderer-type
Add a new PLY_RENDERER_TYPE_SIMPLEDRM renderer-type to help differentiate
the simpledrm case from the regular drm device case.
simpledrm devices require some special handling in the device-manager,
this is a preparation patch for improving the simpledrm handling
in ply-device-manager.
---
src/libply-splash-core/ply-device-manager.c | 11 ++++++++---
src/libply-splash-core/ply-renderer.c | 1 +
src/libply-splash-core/ply-renderer.h | 1 +
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 4c48f606..256b38d0 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -380,7 +380,7 @@ static bool
create_devices_for_udev_device (ply_device_manager_t *manager,
struct udev_device *device)
{
- const char *device_path, *device_sysname;
+ const char *device_path, *device_sysname, *device_syspath;
bool created = false;
bool force_fb = false;
@@ -389,6 +389,7 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
device_path = udev_device_get_devnode (device);
device_sysname = udev_device_get_sysname (device);
+ device_syspath = udev_device_get_syspath (device);
if (device_path != NULL) {
const char *subsystem;
@@ -403,7 +404,10 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
return false;
}
ply_trace ("found DRM device %s", device_path);
- renderer_type = PLY_RENDERER_TYPE_DRM;
+ if (syspath_is_simpledrm (device_syspath))
+ renderer_type = PLY_RENDERER_TYPE_SIMPLEDRM;
+ else
+ renderer_type = PLY_RENDERER_TYPE_DRM;
} else if (strcmp (subsystem, SUBSYSTEM_FRAME_BUFFER) == 0) {
ply_trace ("found frame buffer device %s", device_path);
if (!fb_device_has_drm_device (manager, device))
@@ -446,7 +450,8 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
terminal,
renderer_type);
if (created) {
- if (renderer_type == PLY_RENDERER_TYPE_DRM)
+ if (renderer_type == PLY_RENDERER_TYPE_DRM ||
+ renderer_type == PLY_RENDERER_TYPE_SIMPLEDRM)
manager->found_drm_device = 1;
if (renderer_type == PLY_RENDERER_TYPE_FRAME_BUFFER)
manager->found_fb_device = 1;
diff --git a/src/libply-splash-core/ply-renderer.c b/src/libply-splash-core/ply-renderer.c
index 40a2c813..6a7aff96 100644
--- a/src/libply-splash-core/ply-renderer.c
+++ b/src/libply-splash-core/ply-renderer.c
@@ -269,6 +269,7 @@ ply_renderer_open (ply_renderer_t *renderer)
{
{ PLY_RENDERER_TYPE_X11, PLYMOUTH_PLUGIN_PATH "renderers/x11.so" },
{ PLY_RENDERER_TYPE_DRM, PLYMOUTH_PLUGIN_PATH "renderers/drm.so" },
+ { PLY_RENDERER_TYPE_SIMPLEDRM, PLYMOUTH_PLUGIN_PATH "renderers/drm.so" },
{ PLY_RENDERER_TYPE_FRAME_BUFFER, PLYMOUTH_PLUGIN_PATH "renderers/frame-buffer.so" },
{ PLY_RENDERER_TYPE_NONE, NULL }
};
diff --git a/src/libply-splash-core/ply-renderer.h b/src/libply-splash-core/ply-renderer.h
index 5fbf819d..34ff5886 100644
--- a/src/libply-splash-core/ply-renderer.h
+++ b/src/libply-splash-core/ply-renderer.h
@@ -41,6 +41,7 @@ typedef enum
PLY_RENDERER_TYPE_NONE = -1,
PLY_RENDERER_TYPE_AUTO,
PLY_RENDERER_TYPE_DRM,
+ PLY_RENDERER_TYPE_SIMPLEDRM,
PLY_RENDERER_TYPE_FRAME_BUFFER,
PLY_RENDERER_TYPE_X11
} ply_renderer_type_t;
--
2.45.1
From 188a4393b11fdb25f1fcc7e1ca763d62374b3d70 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 4 Jun 2024 22:05:20 +0200
Subject: [PATCH 4/9] ply-renderer: Add ply_renderer_get_type ()
Add a ply_renderer_get_type () helper function to get the type of
a renderer.
---
src/libply-splash-core/ply-renderer.c | 6 ++++++
src/libply-splash-core/ply-renderer.h | 1 +
2 files changed, 7 insertions(+)
diff --git a/src/libply-splash-core/ply-renderer.c b/src/libply-splash-core/ply-renderer.c
index 6a7aff96..61c59ccc 100644
--- a/src/libply-splash-core/ply-renderer.c
+++ b/src/libply-splash-core/ply-renderer.c
@@ -102,6 +102,12 @@ ply_renderer_get_device_name (ply_renderer_t *renderer)
return renderer->device_name;
}
+ply_renderer_type_t
+ply_renderer_get_type (ply_renderer_t *renderer)
+{
+ return renderer->type;
+}
+
static bool
ply_renderer_load_plugin (ply_renderer_t *renderer,
const char *module_path)
diff --git a/src/libply-splash-core/ply-renderer.h b/src/libply-splash-core/ply-renderer.h
index 34ff5886..cfd4f2dd 100644
--- a/src/libply-splash-core/ply-renderer.h
+++ b/src/libply-splash-core/ply-renderer.h
@@ -63,6 +63,7 @@ void ply_renderer_activate (ply_renderer_t *renderer);
void ply_renderer_deactivate (ply_renderer_t *renderer);
bool ply_renderer_is_active (ply_renderer_t *renderer);
const char *ply_renderer_get_device_name (ply_renderer_t *renderer);
+ply_renderer_type_t ply_renderer_get_type (ply_renderer_t *renderer);
ply_list_t *ply_renderer_get_heads (ply_renderer_t *renderer);
ply_pixel_buffer_t *ply_renderer_get_buffer_for_head (ply_renderer_t *renderer,
ply_renderer_head_t *head);
--
2.45.1
From 9096b304f6bec090ed53aa280f234c2b4fd18828 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 5 Jun 2024 21:31:55 +0200
Subject: [PATCH 5/9] ply-device-manager: Skip /dev/dri/render nodes
DRM render nodes do not support KMS and trying to probe them just
slows things down, so skip them.
---
src/libply-splash-core/ply-device-manager.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 256b38d0..51990b7c 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -403,6 +403,10 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
ply_trace ("ignoring since we only handle SimpleDRM devices after timeout");
return false;
}
+ if (ply_string_has_prefix (device_path, "/dev/dri/render")) {
+ ply_trace ("ignoring since it is a render node");
+ return false;
+ }
ply_trace ("found DRM device %s", device_path);
if (syspath_is_simpledrm (device_syspath))
renderer_type = PLY_RENDERER_TYPE_SIMPLEDRM;
--
2.45.1
From eb5abda0c2fbcd88892f2fbd346a1ac2413cc8ad Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 5 Jun 2024 21:38:43 +0200
Subject: [PATCH 6/9] ply-device-manager: Move local_console_terminal handling
for DRM/FB renderers
create_devices_for_terminal_and_renderer_type () only ever gets called with
a NULL terminal parameter when create_devices_for_udev_device () is calling
it to create a DRM or FB renderer.
Move the use of local_console_terminal as terminal for the first DRM / FB
renderer created from create_devices_for_udev_device () to
create_devices_for_terminal_and_renderer_type () with an extra !terminal
check.
This is a preparation patch for fixing an issue where the local_console
is managed by a simpledrm renderer and the remove event for that gets
processed after the add event of the normal drm device which leaves
the local_console unmanaged breaking legacy input support.
---
src/libply-splash-core/ply-device-manager.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 51990b7c..65504e93 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -441,17 +441,9 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
}
if (renderer_type != PLY_RENDERER_TYPE_NONE) {
- ply_terminal_t *terminal = NULL;
-
- if (!manager->local_console_managed &&
- manager->local_console_terminal != NULL &&
- ply_terminal_is_vt (manager->local_console_terminal)) {
- terminal = manager->local_console_terminal;
- }
-
created = create_devices_for_terminal_and_renderer_type (manager,
device_path,
- terminal,
+ NULL,
renderer_type);
if (created) {
if (renderer_type == PLY_RENDERER_TYPE_DRM ||
@@ -1105,6 +1097,11 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
return true;
}
+ if (!terminal && !manager->local_console_managed &&
+ manager->local_console_terminal != NULL &&
+ ply_terminal_is_vt (manager->local_console_terminal))
+ terminal = manager->local_console_terminal;
+
ply_trace ("creating devices for %s (renderer type: %u) (terminal: %s)",
device_path ? : "", renderer_type, terminal ? ply_terminal_get_name (terminal) : "none");
--
2.45.1
From 8c0d5965030aae11249cbe1e42decc0654005c39 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 5 Jun 2024 21:52:19 +0200
Subject: [PATCH 7/9] ply-device-manager: Remove simpledrm renderers before
adding normal drm renderers
udev remove events for simpledrm udev devices may arrive after the udev add
event for a normal drm udev device which is replacing the simpledrm device.
When the local_console is managed by a simpledrm renderer and the remove
event for the simpledrm renderer is received after the add event of
the normal drm device, the local_console is left unmanaged breaking legacy
input support.
When this scenario gets hit it breaks entering disk unlock passwords.
Add code to remove simpledrm renderers before adding normal drm renderers
to avoid this.
---
src/libply-splash-core/ply-device-manager.c | 24 +++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 65504e93..1c9560d7 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -1080,6 +1080,18 @@ create_text_displays_for_terminal (ply_device_manager_t *manager,
manager->text_display_added_handler (manager->event_handler_data, display);
}
+static void
+free_simpledrm_renderer (char *device_path,
+ ply_renderer_t *renderer,
+ ply_device_manager_t *manager)
+{
+ if (ply_renderer_get_type (renderer) != PLY_RENDERER_TYPE_SIMPLEDRM)
+ return;
+
+ ply_trace ("removing simpledrm renderer %s", device_path);
+ free_devices_from_device_path (manager, device_path, true);
+}
+
static bool
create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
const char *device_path,
@@ -1097,6 +1109,18 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
return true;
}
+ /*
+ * simpledrm udev remove events may arrive after normal drm device add
+ * events, leaving the local_console unmanaged breaking legacy input.
+ * Remove simpledrm renderers before adding drm renderers to avoid this.
+ */
+ if (renderer_type == PLY_RENDERER_TYPE_DRM) {
+ ply_hashtable_foreach (manager->renderers,
+ (ply_hashtable_foreach_func_t *)
+ free_simpledrm_renderer,
+ manager);
+ }
+
if (!terminal && !manager->local_console_managed &&
manager->local_console_terminal != NULL &&
ply_terminal_is_vt (manager->local_console_terminal))
--
2.45.1
From 2f8b64ea4c6cefca6569ab94dc37d436a3fbf048 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 4 Jun 2024 23:07:19 +0200
Subject: [PATCH 8/9] ply-device-manager: Create renderer for simpledrm devices
right away
Often when plymouth starts and enumerates udev devices which are already
present at start (coldplug detection), udev is still initializing all
the devices and it reports 0 for udev_device_get_is_initialized ().
It may take a long time for the state of the simpledrm udev device
to change to initialized and for a udev add event to be send.
Especially when the amdgpu kernel module is involved which is very
large for a kernel module and can take op to 7 seconds to load.
In this case it is even possible for plymouth's default DeviceTimeout
of 8 seconds to trigger before the simpledrm device is considered
initialized. See for example these lines extracted from the plymouth-debug
log attached to: https://bugzilla.redhat.com/show_bug.cgi?id=2183743
00:00:02.909 ../src/libply-splash-core/ply-device-manager.c:498:create_devi: found device /sys/devices/pci0000:00/0000:00:01.0/simple-framebuffer.0/drm/card0
00:00:02.910 ../src/libply-splash-core/ply-device-manager.c:513:create_devi: it's not initialized
00:00:10.917 ../src/libply-splash-core/ply-device-manager.c:1237:create_dev: Timeout elapsed, looking for devices from udev
00:00:10.918 ../src/libply-splash-core/ply-device-manager.c:498:create_devi: found device /sys/devices/pci0000:00/0000:00:01.0/simple-framebuffer.0/drm/card0
00:00:10.918 ../src/libply-splash-core/ply-device-manager.c:513:create_devi: it's not initialized
This leads to plymouth falling back to the text splash even when
plymouth.use-simpledrm is passed on the kernel commandline.
Add a special case for simpledrm devices and add these during coldboot
even if they are not initialized yet.
---
src/libply-splash-core/ply-device-manager.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 1c9560d7..90a60661 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -490,6 +490,7 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
udev_list_entry_foreach (entry, udev_enumerate_get_list_entry (matches)){
struct udev_device *device = NULL;
const char *path, *node;
+ int initialized;
path = udev_list_entry_get_name (entry);
@@ -502,10 +503,11 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
device = udev_device_new_from_syspath (manager->udev_context, path);
- /* if device isn't fully initialized, we'll get an add event later
- */
- if (udev_device_get_is_initialized (device)) {
- ply_trace ("device is initialized");
+ /* If device isn't fully initialized, we'll get an add event later */
+ initialized = udev_device_get_is_initialized (device);
+ /* Simpledrm can be handled uninitialized and this shows the splash sooner */
+ if (initialized || syspath_is_simpledrm (path)) {
+ ply_trace ("device is initialized %d", initialized);
node = udev_device_get_devnode (device);
if (node != NULL) {
--
2.45.1
From 12fdedb4efb0b7e04c74f43917a180a20e54ea24 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 5 Jun 2024 22:07:32 +0200
Subject: [PATCH 9/9] ply-device-manager: Make create_devices_for_subsystem ()
return void
Make create_devices_for_subsystem () return void. Its callers do not care
about the return value and currently the return value is not always correct
since if a device is found, found may later become false again if
a subsequent create_devices_for_udev_device () call fails.
---
src/libply-splash-core/ply-device-manager.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index 90a60661..1f41e1b2 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -458,23 +458,22 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
return created;
}
-static bool
+static void
create_devices_for_subsystem (ply_device_manager_t *manager,
const char *subsystem)
{
struct udev_enumerate *matches;
struct udev_list_entry *entry;
- bool found_device = false;
if (strcmp (subsystem, SUBSYSTEM_INPUT) == 0) {
if (ply_kernel_command_line_has_argument ("plymouth.use-legacy-input")) {
ply_trace ("Not creating devices for subsystem " SUBSYSTEM_INPUT " because plymouth.use-legacy-input on command line");
- return false;
+ return;
}
if (manager->xkb_keymap == NULL) {
ply_trace ("Not creating devices for subsystem " SUBSYSTEM_INPUT " because there is no configure XKB layout");
- return false;
+ return;
}
}
@@ -512,7 +511,7 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
node = udev_device_get_devnode (device);
if (node != NULL) {
ply_trace ("found node %s", node);
- found_device = create_devices_for_udev_device (manager, device);
+ create_devices_for_udev_device (manager, device);
}
} else {
ply_trace ("it's not initialized");
@@ -522,8 +521,6 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
}
udev_enumerate_unref (matches);
-
- return found_device;
}
static void
--
2.45.1
From f8043095b8a2eb69b18947d925b30cee95e4c1fe Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
Date: Tue, 29 Apr 2025 14:44:48 -0400
Subject: [PATCH] Fix ABI incompatibility
A previous commit in this patch series accidentally introduced an ABI
incompatiblity: PLY_RENRERER_TYPE_{FRAME_BUFFER,X11} changed their values.
Let's undo that.
---
src/libply-splash-core/ply-renderer.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/libply-splash-core/ply-renderer.h b/src/libply-splash-core/ply-renderer.h
index cfd4f2dd..b667ff6d 100644
--- a/src/libply-splash-core/ply-renderer.h
+++ b/src/libply-splash-core/ply-renderer.h
@@ -41,9 +41,9 @@ typedef enum
PLY_RENDERER_TYPE_NONE = -1,
PLY_RENDERER_TYPE_AUTO,
PLY_RENDERER_TYPE_DRM,
- PLY_RENDERER_TYPE_SIMPLEDRM,
PLY_RENDERER_TYPE_FRAME_BUFFER,
- PLY_RENDERER_TYPE_X11
+ PLY_RENDERER_TYPE_X11,
+ PLY_RENDERER_TYPE_SIMPLEDRM
} ply_renderer_type_t;
typedef void (*ply_renderer_input_source_handler_t) (void *user_data,
--
2.47.1

16
plymouth.rpmlintrc Normal file
View File

@ -0,0 +1,16 @@
addFilter("incorrect-fsf-address")
addFilter("no-manual-page-for-binary")
addFilter("no-documentation")
# Spinfinity has a symlink to /usr/share/pixmaps/system-logo-white.png
addFilter("dangling-symlink")
# Suppress the error from the ghosted /var/lib/plymouth/boot-duration file
addFilter("non-readable")
# Upstream (and RHEL) has named the logrotate file after the logfilename
# rather then after the package-name
addFilter("incoherent-logrotate-file")
# No provides, the throbgress plugin has been removed upstream
addFilter("obsolete-not-provided plymouth-plugin-throbgress")
# Some files are shared between themes
addFilter("files-duplicate")
# Some of our packages have no binaries, this is fine
addFilter("no-binary")

448
plymouth.spec Normal file
View File

@ -0,0 +1,448 @@
Summary: Graphical Boot Animation and Logger
Name: plymouth
Version: 24.004.60
Release: %autorelease
License: GPL-2.0-or-later
URL: http://www.freedesktop.org/wiki/Software/Plymouth
Source0: https://gitlab.freedesktop.org/plymouth/plymouth/-/archive/%{version}/%{name}-%{version}.tar.bz2
Source2: charge.plymouth
# Revert https://gitlab.freedesktop.org/plymouth/plymouth/-/commit/48881ba
# to fix console display on minimal installs
# https://bugzilla.redhat.com/show_bug.cgi?id=2269385
Patch: 0001-Revert-src-Hide-console-text-when-splash-is-requeste.patch
# https://gitlab.freedesktop.org/plymouth/plymouth/-/commit/10ac8d2dc927b112ce6aeb06bc73d9c46550954c
# Fix encryption passphrase appearing in plain text in text mode
# https://bugzilla.redhat.com/show_bug.cgi?id=2271337
Patch: 0001-ply-boot-splash-Set-unbuffered-input-when-creating-a.patch
# Revert patch to immediately switch to text mode on first renderer plugin error
# Fixes unwanted text mode when drm-plugin init races with simpledrm unregistration
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/319
# https://bugzilla.redhat.com/show_bug.cgi?id=2270030
Patch: 0001-ply-device-manager-Revert-Fall-back-to-text-plugin-i.patch
# Probe simpledrm immediately instead of waiting for udev_device_get_is_initialized ()
# to return true. This fixes users getting the text splash on laptops with somewhat
# slower CPUs combined with loading the amdgpu module which may take 7+ seconds
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/323/
# https://bugzilla.redhat.com/show_bug.cgi?id=2183743
# https://bugzilla.redhat.com/show_bug.cgi?id=2274770
Patch: plymouth-24.004.60-immediately-probe-simpledrm.patch
# Backport of upstream commit 709f21e80199ee51badff2d9b5dc6bae8af2a1a1
# "renderers: Do not assume all keyboards have LEDs"
# This fixes:
# https://bugzilla.redhat.com/show_bug.cgi?id=2282384
Patch: 0001-renderers-Do-not-assume-all-keyboards-have-LEDs.patch
Patch: 0001-details-dont-duplicate-output-on-console.patch
BuildRequires: meson
BuildRequires: system-logos
BuildRequires: gcc libtool git
BuildRequires: pkgconfig(libdrm)
BuildRequires: pkgconfig(libevdev)
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(xkeyboard-config)
BuildRequires: kernel-headers
BuildRequires: libpng-devel
BuildRequires: libxslt, docbook-style-xsl
BuildRequires: pkgconfig(gtk+-3.0)
BuildRequires: pango-devel >= 1.21.0
BuildRequires: cairo-devel
BuildRequires: gettext-devel
BuildRequires: intltool
# for /usr/bin/systemd-tty-ask-password-agent
BuildRequires: systemd
# for _unitdir macro
BuildRequires: systemd-rpm-macros
Requires: %{name}-core-libs = %{version}-%{release}
Requires: %{name}-scripts = %{version}-%{release}
# For keyboard layouts
Requires: xkeyboard-config
Suggests: logrotate
%description
Plymouth provides an attractive graphical boot animation in
place of the text messages that normally get shown. Text
messages are instead redirected to a log file for viewing
after boot.
%package system-theme
Summary: Plymouth default theme
Requires: plymouth(system-theme) = %{version}-%{release}
%description system-theme
This meta-package tracks the current distribution default theme.
%package core-libs
Summary: Plymouth core libraries
%description core-libs
This package contains the core libraries used by Plymouth.
%package graphics-libs
Summary: Plymouth graphics libraries
Requires: %{name}-core-libs = %{version}-%{release}
Requires: system-logos
%description graphics-libs
This package contains the libraries used by graphical Plymouth splashes.
%package devel
Summary: Libraries and headers for writing Plymouth splash plugins
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
Requires: pkgconfig
%description devel
This package contains the libraries and headers needed to develop
3rd party splash plugins for Plymouth.
%package scripts
Summary: Plymouth related scripts
Requires: findutils, coreutils, gzip, cpio, dracut
Requires: xkeyboard-config
Requires: %{name} = %{version}-%{release}
%description scripts
This package contains scripts that help integrate Plymouth with
the system.
%package plugin-label
Summary: Plymouth label plugin
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
%description plugin-label
This package contains the label control plugin for Plymouth.
It provides the ability to render text on graphical boot splashes.
%package plugin-script
Summary: Plymouth "script" plugin
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
%description plugin-script
This package contains the "script" boot splash plugin for
Plymouth. It features an extensible boot splash language that
allows writing new plugins as scripts, simplifying the process
of designing custom boot splash themes.
%package plugin-fade-throbber
Summary: Plymouth "Fade-Throbber" plugin
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
%description plugin-fade-throbber
This package contains the "Fade-In" boot splash plugin for
Plymouth. It features a centered image that fades in and out
while other images pulsate around during system boot up.
%package plugin-space-flares
Summary: Plymouth "space-flares" plugin
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
Requires: plymouth-plugin-label = %{version}-%{release}
%description plugin-space-flares
This package contains the "space-flares" boot splash plugin for
Plymouth. It features a corner image with animated flares.
%package plugin-two-step
Summary: Plymouth "two-step" plugin
Requires: %{name} = %{version}-%{release}
Requires: %{name}-graphics-libs = %{version}-%{release}
Requires: plymouth-plugin-label = %{version}-%{release}
# Spinifinity like themes should now use two-step instead of throbgress
# No provides, the throbgress plugin has been removed upstream
Obsoletes: %{name}-plugin-throbgress < %{version}-%{release}
%description plugin-two-step
This package contains the "two-step" boot splash plugin for
Plymouth. It features a two phased boot process that starts with
a progressing animation synced to boot time and finishes with a
short, fast one-shot animation.
# Don't build charge theme in ELN/RHEL as it's Fedora specific
%if ! 0%{?rhel}
%package theme-charge
Summary: Plymouth "Charge" plugin
Requires: %{name}-plugin-two-step = %{version}-%{release}
Requires: fedora-logos-classic
Requires(post): plymouth-scripts
%description theme-charge
This package contains the "charge" boot splash theme for
Plymouth. It features the shadowy hull of a Fedora logo charge up and
and finally burst into full form.
%endif
%package theme-fade-in
Summary: Plymouth "Fade-In" theme
Requires: %{name}-plugin-fade-throbber = %{version}-%{release}
Requires(post): plymouth-scripts
%description theme-fade-in
This package contains the "Fade-In" boot splash theme for
Plymouth. It features a centered logo that fades in and out
while stars twinkle around the logo during system boot up.
%package theme-script
Summary: Plymouth "Script" plugin
Requires: %{name}-plugin-script = %{version}-%{release}
Requires(post): plymouth-scripts
%description theme-script
This package contains the "script" boot splash theme for
Plymouth. It it is a simple example theme the uses the "script"
plugin.
%package theme-solar
Summary: Plymouth "Solar" theme
Requires: %{name}-plugin-space-flares = %{version}-%{release}
Requires(post): plymouth-scripts
%description theme-solar
This package contains the "Solar" boot splash theme for
Plymouth. It features a blue flamed sun with animated solar flares.
%package theme-spinfinity
Summary: Plymouth "Spinfinity" theme
Requires: %{name}-plugin-two-step = %{version}-%{release}
Requires(post): plymouth-scripts
%description theme-spinfinity
This package contains the "Spinfinity" boot splash theme for
Plymouth. It features a centered logo and animated spinner that
spins in the shape of an infinity sign.
%package theme-spinner
Summary: Plymouth "Spinner" theme
Requires: %{name}-plugin-two-step = %{version}-%{release}
%if 0%{?rhel} > 9
Requires: redhat-mono-vf-fonts
Requires: redhat-text-vf-fonts
%else
Requires: font(cantarell) font(cantarelllight)
%endif
Requires(post): plymouth-scripts
Provides: plymouth(system-theme) = %{version}-%{release}
%description theme-spinner
This package contains the "spinner" boot splash theme for
Plymouth. It features a small spinner on a dark background.
%prep
%autosetup -p1
# Change the default theme
sed -i -e 's/spinner/bgrt/g' src/plymouthd.defaults
%if 0%{?rhel} > 9
find -type f -exec sed -i -e 's/Cantarell/Red Hat Text/g' {} \;
%endif
%build
%meson -Dtracing=true \
-Dlogo=%{_datadir}/pixmaps/system-logo-white.png \
-Dbackground-start-color-stop=0x0073B3 \
-Dbackground-end-color-stop=0x00457E \
-Dbackground-color=0x3391cd
%meson_build
%install
%meson_install
%find_lang %{name}
find $RPM_BUILD_ROOT -name '*.la' -delete
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/plymouth
%if ! 0%{?rhel}
# Add charge, our old default
mkdir -p $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge
cp %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge
cp $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/glow/{box,bullet,entry,lock}.png $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge
%endif
# Drop glow, it's not very Fedora-y
rm -rf $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/glow
# add in the watermark to spinner and bgrt
(cd $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/spinner; ln -sf ../../../pixmaps/fedora-gdm-logo.png watermark.png)
%ldconfig_scriptlets core-libs
%ldconfig_scriptlets graphics-libs
%if ! 0%{?rhel}
%postun theme-charge
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
if [ $1 -eq 0 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "charge" ]; then
%{_sbindir}/plymouth-set-default-theme --reset
fi
fi
%endif
%postun theme-fade-in
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
if [ $1 -eq 0 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "fade-in" ]; then
%{_sbindir}/plymouth-set-default-theme --reset
fi
fi
%postun theme-solar
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
if [ $1 -eq 0 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "solar" ]; then
%{_sbindir}/plymouth-set-default-theme --reset
fi
fi
%postun theme-spinfinity
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
if [ $1 -eq 0 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "spinfinity" ]; then
%{_sbindir}/plymouth-set-default-theme --reset
fi
fi
%post theme-spinner
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
# On upgrades replace charge with the new bgrt default
if [ $1 -eq 2 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "charge" ]; then
%{_sbindir}/plymouth-set-default-theme bgrt
fi
fi
%postun theme-spinner
export PLYMOUTH_PLUGIN_PATH=%{_libdir}/plymouth/
if [ $1 -eq 0 ]; then
if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "bgrt" -o \
"$(%{_sbindir}/plymouth-set-default-theme)" == "spinner" ]; then
%{_sbindir}/plymouth-set-default-theme --reset
fi
fi
%files -f %{name}.lang
%license COPYING
%doc AUTHORS README.md
%dir %{_datadir}/plymouth
%dir %{_datadir}/plymouth/themes
%dir %{_datadir}/plymouth/themes/details
%dir %{_datadir}/plymouth/themes/text
%dir %{_libexecdir}/plymouth
%dir %{_localstatedir}/lib/plymouth
%dir %{_libdir}/plymouth/renderers
%dir %{_sysconfdir}/plymouth
%config(noreplace) %{_sysconfdir}/plymouth/plymouthd.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/bootlog
%{_sbindir}/plymouthd
%{_libexecdir}/plymouth/plymouthd-fd-escrow
%{_bindir}/plymouth
%{_libdir}/plymouth/details.so
%{_libdir}/plymouth/text.so
%{_libdir}/plymouth/tribar.so
%{_datadir}/plymouth/themes/details/details.plymouth
%{_datadir}/plymouth/themes/text/text.plymouth
%{_datadir}/plymouth/themes/tribar/tribar.plymouth
%{_datadir}/plymouth/plymouthd.defaults
%{_localstatedir}/spool/plymouth
%{_mandir}/man?/*
%ghost %verify(not mode) %{_localstatedir}/lib/plymouth/boot-duration
%{_unitdir}/
%files devel
%{_libdir}/libply.so
%{_libdir}/libply-splash-core.so
%{_libdir}/libply-boot-client.so
%{_libdir}/libply-splash-graphics.so
%{_libdir}/pkgconfig/ply-splash-core.pc
%{_libdir}/pkgconfig/ply-splash-graphics.pc
%{_libdir}/pkgconfig/ply-boot-client.pc
%{_libdir}/plymouth/renderers/x11*
%{_includedir}/plymouth-1
%files core-libs
%{_libdir}/libply.so.*
%{_libdir}/libply-splash-core.so.*
%{_libdir}/libply-boot-client.so.*
%dir %{_libdir}/plymouth
%files graphics-libs
%{_libdir}/libply-splash-graphics.so.*
%{_libdir}/plymouth/renderers/drm*
%{_libdir}/plymouth/renderers/frame-buffer*
%files scripts
%{_sbindir}/plymouth-set-default-theme
%{_libexecdir}/plymouth/plymouth-update-initrd
%{_libexecdir}/plymouth/plymouth-generate-initrd
%{_libexecdir}/plymouth/plymouth-populate-initrd
%files plugin-label
%{_libdir}/plymouth/label-freetype.so
%{_libdir}/plymouth/label-pango.so
%files plugin-script
%{_libdir}/plymouth/script.so
%files plugin-fade-throbber
%{_libdir}/plymouth/fade-throbber.so
%files plugin-space-flares
%{_libdir}/plymouth/space-flares.so
%files plugin-two-step
%{_libdir}/plymouth/two-step.so
%if ! 0%{?rhel}
%files theme-charge
%{_datadir}/plymouth/themes/charge
%endif
%files theme-fade-in
%{_datadir}/plymouth/themes/fade-in
%files theme-script
%{_datadir}/plymouth/themes/script
%files theme-solar
%{_datadir}/plymouth/themes/solar
%files theme-spinfinity
%{_datadir}/plymouth/themes/spinfinity
%files theme-spinner
# bgrt is a variant of spinner with different settings in its .plymouth file
%{_datadir}/plymouth/themes/bgrt
%{_datadir}/plymouth/themes/spinner
%files system-theme
%changelog
%autochangelog

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (plymouth-24.004.60.tar.bz2) = c6787ae5705d6954a73ef7f3f65cecf3d36af1bb6b6fbfc68871062cace71245a569b1b5fe8b8014418c2657739a413bf9eb65f0bc3e6e293505d1052c9a5352