import plymouth-0.9.3-16.el8
This commit is contained in:
parent
af8fa74de2
commit
547f311b21
@ -0,0 +1,489 @@
|
|||||||
|
From b5bacf2b5e5d9e58cbe96fda0a56baf5dfa11358 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Wed, 10 Oct 2018 20:07:37 +0100
|
||||||
|
Subject: [PATCH] device-manager: don't watch for udev events when deactivated
|
||||||
|
|
||||||
|
If a device gets added when we're already deactivated, plymouth shouldn't
|
||||||
|
process the device, since processing it effectively activates plymouth.
|
||||||
|
|
||||||
|
This commit pulls the udev monitor fd out of the event loop while
|
||||||
|
plymouth is deactivated so new events are deferred until reactivation.
|
||||||
|
|
||||||
|
Modified by Iain Lane <iain.lane@canonical.com>: Also deactivate the
|
||||||
|
timer that finds all devices known to udev after an interval, when
|
||||||
|
paused.
|
||||||
|
---
|
||||||
|
src/libply-splash-core/ply-device-manager.c | 74 +++++++++++++++++----
|
||||||
|
src/libply-splash-core/ply-device-manager.h | 2 +
|
||||||
|
src/main.c | 3 +
|
||||||
|
3 files changed, 67 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
|
||||||
|
index b637fb8..82f0137 100644
|
||||||
|
--- a/src/libply-splash-core/ply-device-manager.c
|
||||||
|
+++ b/src/libply-splash-core/ply-device-manager.c
|
||||||
|
@@ -36,74 +36,78 @@
|
||||||
|
|
||||||
|
#include "ply-logger.h"
|
||||||
|
#include "ply-event-loop.h"
|
||||||
|
#include "ply-hashtable.h"
|
||||||
|
#include "ply-list.h"
|
||||||
|
#include "ply-utils.h"
|
||||||
|
|
||||||
|
#define SUBSYSTEM_DRM "drm"
|
||||||
|
#define SUBSYSTEM_FRAME_BUFFER "graphics"
|
||||||
|
|
||||||
|
#ifdef HAVE_UDEV
|
||||||
|
static void create_devices_from_udev (ply_device_manager_t *manager);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static bool create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||||
|
const char *device_path,
|
||||||
|
ply_terminal_t *terminal,
|
||||||
|
ply_renderer_type_t renderer_type);
|
||||||
|
struct _ply_device_manager
|
||||||
|
{
|
||||||
|
ply_device_manager_flags_t flags;
|
||||||
|
ply_event_loop_t *loop;
|
||||||
|
ply_hashtable_t *terminals;
|
||||||
|
ply_hashtable_t *renderers;
|
||||||
|
ply_terminal_t *local_console_terminal;
|
||||||
|
ply_list_t *keyboards;
|
||||||
|
ply_list_t *text_displays;
|
||||||
|
ply_list_t *pixel_displays;
|
||||||
|
struct udev *udev_context;
|
||||||
|
struct udev_monitor *udev_monitor;
|
||||||
|
+ ply_fd_watch_t *fd_watch;
|
||||||
|
|
||||||
|
ply_keyboard_added_handler_t keyboard_added_handler;
|
||||||
|
ply_keyboard_removed_handler_t keyboard_removed_handler;
|
||||||
|
ply_pixel_display_added_handler_t pixel_display_added_handler;
|
||||||
|
ply_pixel_display_removed_handler_t pixel_display_removed_handler;
|
||||||
|
ply_text_display_added_handler_t text_display_added_handler;
|
||||||
|
ply_text_display_removed_handler_t text_display_removed_handler;
|
||||||
|
void *event_handler_data;
|
||||||
|
|
||||||
|
uint32_t local_console_managed : 1;
|
||||||
|
uint32_t local_console_is_text : 1;
|
||||||
|
uint32_t serial_consoles_detected : 1;
|
||||||
|
uint32_t renderers_activated : 1;
|
||||||
|
uint32_t keyboards_activated : 1;
|
||||||
|
+
|
||||||
|
+ uint32_t paused : 1;
|
||||||
|
+ uint32_t device_timeout_elapsed : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
detach_from_event_loop (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
assert (manager != NULL);
|
||||||
|
|
||||||
|
manager->loop = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
attach_to_event_loop (ply_device_manager_t *manager,
|
||||||
|
ply_event_loop_t *loop)
|
||||||
|
{
|
||||||
|
assert (manager != NULL);
|
||||||
|
assert (loop != NULL);
|
||||||
|
assert (manager->loop == NULL);
|
||||||
|
|
||||||
|
manager->loop = loop;
|
||||||
|
|
||||||
|
ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t)
|
||||||
|
detach_from_event_loop,
|
||||||
|
manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_displays_for_renderer (ply_device_manager_t *manager,
|
||||||
|
ply_renderer_t *renderer)
|
||||||
|
{
|
||||||
|
ply_list_node_t *node;
|
||||||
|
@@ -348,77 +352,92 @@ on_udev_event (ply_device_manager_t *manager)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (strcmp (action, "add") == 0) {
|
||||||
|
const char *subsystem;
|
||||||
|
|
||||||
|
subsystem = udev_device_get_subsystem (device);
|
||||||
|
|
||||||
|
if (strcmp (subsystem, SUBSYSTEM_DRM) == 0) {
|
||||||
|
if (manager->local_console_managed && manager->local_console_is_text)
|
||||||
|
ply_trace ("ignoring since we're already using text splash for local console");
|
||||||
|
else
|
||||||
|
create_devices_for_udev_device (manager, device);
|
||||||
|
} else {
|
||||||
|
ply_trace ("ignoring since we only handle subsystem %s devices after timeout", subsystem);
|
||||||
|
}
|
||||||
|
} else if (strcmp (action, "remove") == 0) {
|
||||||
|
free_devices_for_udev_device (manager, device);
|
||||||
|
}
|
||||||
|
|
||||||
|
udev_device_unref (device);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
watch_for_udev_events (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
assert (manager != NULL);
|
||||||
|
assert (manager->udev_monitor == NULL);
|
||||||
|
|
||||||
|
+ if (manager->fd_watch != NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
ply_trace ("watching for udev graphics device add and remove events");
|
||||||
|
|
||||||
|
- manager->udev_monitor = udev_monitor_new_from_netlink (manager->udev_context, "udev");
|
||||||
|
+ if (manager->udev_monitor == NULL) {
|
||||||
|
+ manager->udev_monitor = udev_monitor_new_from_netlink (manager->udev_context, "udev");
|
||||||
|
|
||||||
|
- udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_DRM, NULL);
|
||||||
|
- udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_FRAME_BUFFER, NULL);
|
||||||
|
- udev_monitor_filter_add_match_tag (manager->udev_monitor, "seat");
|
||||||
|
- udev_monitor_enable_receiving (manager->udev_monitor);
|
||||||
|
+ udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_DRM, NULL);
|
||||||
|
+ udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_FRAME_BUFFER, NULL);
|
||||||
|
+ udev_monitor_filter_add_match_tag (manager->udev_monitor, "seat");
|
||||||
|
+ udev_monitor_enable_receiving (manager->udev_monitor);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
fd = udev_monitor_get_fd (manager->udev_monitor);
|
||||||
|
- ply_event_loop_watch_fd (manager->loop,
|
||||||
|
- fd,
|
||||||
|
- PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
|
||||||
|
- (ply_event_handler_t)
|
||||||
|
- on_udev_event,
|
||||||
|
- NULL,
|
||||||
|
- manager);
|
||||||
|
+ manager->fd_watch = ply_event_loop_watch_fd (manager->loop,
|
||||||
|
+ fd,
|
||||||
|
+ PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
|
||||||
|
+ (ply_event_handler_t)
|
||||||
|
+ on_udev_event,
|
||||||
|
+ NULL,
|
||||||
|
+ manager);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+stop_watching_for_udev_events (ply_device_manager_t *manager)
|
||||||
|
+{
|
||||||
|
+ if (manager->fd_watch == NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ ply_event_loop_stop_watching_fd (manager->loop, manager->fd_watch);
|
||||||
|
+ manager->fd_watch = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_terminal (char *device,
|
||||||
|
ply_terminal_t *terminal,
|
||||||
|
ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
ply_hashtable_remove (manager->terminals, device);
|
||||||
|
|
||||||
|
ply_terminal_free (terminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_terminals (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
ply_hashtable_foreach (manager->terminals,
|
||||||
|
(ply_hashtable_foreach_func_t *)
|
||||||
|
free_terminal,
|
||||||
|
manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ply_terminal_t *
|
||||||
|
get_terminal (ply_device_manager_t *manager,
|
||||||
|
const char *device_name)
|
||||||
|
{
|
||||||
|
char *full_name = NULL;
|
||||||
|
ply_terminal_t *terminal;
|
||||||
|
|
||||||
|
if (strncmp (device_name, "/dev/", strlen ("/dev/")) == 0)
|
||||||
|
@@ -774,60 +793,67 @@ create_devices_from_terminals (ply_device_manager_t *manager)
|
||||||
|
|
||||||
|
if (has_serial_consoles) {
|
||||||
|
ply_trace ("serial consoles detected, managing them with details forced");
|
||||||
|
manager->serial_consoles_detected = true;
|
||||||
|
|
||||||
|
ply_hashtable_foreach (manager->terminals,
|
||||||
|
(ply_hashtable_foreach_func_t *)
|
||||||
|
create_devices_for_terminal,
|
||||||
|
manager);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
create_non_graphical_devices (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
create_devices_for_terminal_and_renderer_type (manager,
|
||||||
|
NULL,
|
||||||
|
manager->local_console_terminal,
|
||||||
|
PLY_RENDERER_TYPE_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_UDEV
|
||||||
|
static void
|
||||||
|
create_devices_from_udev (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
bool found_drm_device, found_fb_device;
|
||||||
|
|
||||||
|
+ manager->device_timeout_elapsed = true;
|
||||||
|
+
|
||||||
|
+ if (manager->paused) {
|
||||||
|
+ ply_trace ("create_devices_from_udev timeout elapsed while paused, deferring execution");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ply_trace ("Timeout elapsed, looking for devices from udev");
|
||||||
|
|
||||||
|
found_drm_device = create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
|
||||||
|
found_fb_device = create_devices_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
|
||||||
|
|
||||||
|
if (found_drm_device || found_fb_device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ply_trace ("Creating non-graphical devices, since there's no suitable graphics hardware");
|
||||||
|
create_non_graphical_devices (manager);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
create_fallback_devices (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
create_devices_for_terminal_and_renderer_type (manager,
|
||||||
|
NULL,
|
||||||
|
manager->local_console_terminal,
|
||||||
|
PLY_RENDERER_TYPE_AUTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ply_device_manager_watch_devices (ply_device_manager_t *manager,
|
||||||
|
double device_timeout,
|
||||||
|
ply_keyboard_added_handler_t keyboard_added_handler,
|
||||||
|
ply_keyboard_removed_handler_t keyboard_removed_handler,
|
||||||
|
ply_pixel_display_added_handler_t pixel_display_added_handler,
|
||||||
|
ply_pixel_display_removed_handler_t pixel_display_removed_handler,
|
||||||
|
ply_text_display_added_handler_t text_display_added_handler,
|
||||||
|
@@ -965,30 +991,54 @@ ply_device_manager_activate_keyboards (ply_device_manager_t *manager)
|
||||||
|
|
||||||
|
ply_keyboard_watch_for_input (keyboard);
|
||||||
|
|
||||||
|
node = next_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager->keyboards_activated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ply_device_manager_deactivate_keyboards (ply_device_manager_t *manager)
|
||||||
|
{
|
||||||
|
ply_list_node_t *node;
|
||||||
|
|
||||||
|
ply_trace ("deactivating keyboards");
|
||||||
|
node = ply_list_get_first_node (manager->keyboards);
|
||||||
|
while (node != NULL) {
|
||||||
|
ply_keyboard_t *keyboard;
|
||||||
|
ply_list_node_t *next_node;
|
||||||
|
|
||||||
|
keyboard = ply_list_node_get_data (node);
|
||||||
|
next_node = ply_list_get_next_node (manager->keyboards, node);
|
||||||
|
|
||||||
|
ply_keyboard_stop_watching_for_input (keyboard);
|
||||||
|
|
||||||
|
node = next_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager->keyboards_activated = false;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+ply_device_manager_pause (ply_device_manager_t *manager)
|
||||||
|
+{
|
||||||
|
+ ply_trace ("ply_device_manager_pause() called, stopping watching for udev events");
|
||||||
|
+ manager->paused = true;
|
||||||
|
+#ifdef HAVE_UDEV
|
||||||
|
+ stop_watching_for_udev_events (manager);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+ply_device_manager_unpause (ply_device_manager_t *manager)
|
||||||
|
+{
|
||||||
|
+ ply_trace ("ply_device_manager_unpause() called, resuming watching for udev events");
|
||||||
|
+ manager->paused = false;
|
||||||
|
+#ifdef HAVE_UDEV
|
||||||
|
+ if (manager->device_timeout_elapsed) {
|
||||||
|
+ ply_trace ("ply_device_manager_unpause(): timeout elapsed while paused, looking for udev devices");
|
||||||
|
+ create_devices_from_udev (manager);
|
||||||
|
+ }
|
||||||
|
+ watch_for_udev_events (manager);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
diff --git a/src/libply-splash-core/ply-device-manager.h b/src/libply-splash-core/ply-device-manager.h
|
||||||
|
index ad05897..389b636 100644
|
||||||
|
--- a/src/libply-splash-core/ply-device-manager.h
|
||||||
|
+++ b/src/libply-splash-core/ply-device-manager.h
|
||||||
|
@@ -28,46 +28,48 @@
|
||||||
|
#include "ply-text-display.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
PLY_DEVICE_MANAGER_FLAGS_NONE = 0,
|
||||||
|
PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES = 1 << 0,
|
||||||
|
PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV = 1 << 1,
|
||||||
|
PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS = 1 << 2
|
||||||
|
} ply_device_manager_flags_t;
|
||||||
|
|
||||||
|
typedef struct _ply_device_manager ply_device_manager_t;
|
||||||
|
typedef void (* ply_keyboard_added_handler_t) (void *, ply_keyboard_t *);
|
||||||
|
typedef void (* ply_keyboard_removed_handler_t) (void *, ply_keyboard_t *);
|
||||||
|
typedef void (* ply_pixel_display_added_handler_t) (void *, ply_pixel_display_t *);
|
||||||
|
typedef void (* ply_pixel_display_removed_handler_t) (void *, ply_pixel_display_t *);
|
||||||
|
typedef void (* ply_text_display_added_handler_t) (void *, ply_text_display_t *);
|
||||||
|
typedef void (* ply_text_display_removed_handler_t) (void *, ply_text_display_t *);
|
||||||
|
|
||||||
|
#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
|
||||||
|
ply_device_manager_t *ply_device_manager_new (const char *default_tty,
|
||||||
|
ply_device_manager_flags_t flags);
|
||||||
|
void ply_device_manager_watch_devices (ply_device_manager_t *manager,
|
||||||
|
double device_timeout,
|
||||||
|
ply_keyboard_added_handler_t keyboard_added_handler,
|
||||||
|
ply_keyboard_removed_handler_t keyboard_removed_handler,
|
||||||
|
ply_pixel_display_added_handler_t pixel_display_added_handler,
|
||||||
|
ply_pixel_display_removed_handler_t pixel_display_removed_handler,
|
||||||
|
ply_text_display_added_handler_t text_display_added_handler,
|
||||||
|
ply_text_display_removed_handler_t text_display_removed_handler,
|
||||||
|
void *data);
|
||||||
|
+void ply_device_manager_pause (ply_device_manager_t *manager);
|
||||||
|
+void ply_device_manager_unpause (ply_device_manager_t *manager);
|
||||||
|
bool ply_device_manager_has_serial_consoles (ply_device_manager_t *manager);
|
||||||
|
bool ply_device_manager_has_displays (ply_device_manager_t *manager);
|
||||||
|
ply_list_t *ply_device_manager_get_keyboards (ply_device_manager_t *manager);
|
||||||
|
ply_list_t *ply_device_manager_get_pixel_displays (ply_device_manager_t *manager);
|
||||||
|
ply_list_t *ply_device_manager_get_text_displays (ply_device_manager_t *manager);
|
||||||
|
void ply_device_manager_free (ply_device_manager_t *manager);
|
||||||
|
void ply_device_manager_activate_keyboards (ply_device_manager_t *manager);
|
||||||
|
void ply_device_manager_deactivate_keyboards (ply_device_manager_t *manager);
|
||||||
|
void ply_device_manager_activate_renderers (ply_device_manager_t *manager);
|
||||||
|
void ply_device_manager_deactivate_renderers (ply_device_manager_t *manager);
|
||||||
|
ply_terminal_t *ply_device_manager_get_default_terminal (ply_device_manager_t *manager);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
|
||||||
|
diff --git a/src/main.c b/src/main.c
|
||||||
|
index e44de7b..3253aa9 100644
|
||||||
|
--- a/src/main.c
|
||||||
|
+++ b/src/main.c
|
||||||
|
@@ -1305,94 +1305,97 @@ on_boot_splash_idle (state_t *state)
|
||||||
|
ply_trace ("quitting program");
|
||||||
|
quit_program (state);
|
||||||
|
} else if (state->deactivate_trigger != NULL) {
|
||||||
|
ply_trace ("deactivating splash");
|
||||||
|
deactivate_splash (state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_deactivate (state_t *state,
|
||||||
|
ply_trigger_t *deactivate_trigger)
|
||||||
|
{
|
||||||
|
if (state->is_inactive) {
|
||||||
|
ply_trigger_pull (deactivate_trigger, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->deactivate_trigger != NULL) {
|
||||||
|
ply_trigger_add_handler (state->deactivate_trigger,
|
||||||
|
(ply_trigger_handler_t)
|
||||||
|
ply_trigger_pull,
|
||||||
|
deactivate_trigger);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->deactivate_trigger = deactivate_trigger;
|
||||||
|
|
||||||
|
ply_trace ("deactivating");
|
||||||
|
cancel_pending_delayed_show (state);
|
||||||
|
|
||||||
|
+ ply_device_manager_pause (state->device_manager);
|
||||||
|
ply_device_manager_deactivate_keyboards (state->device_manager);
|
||||||
|
|
||||||
|
if (state->boot_splash != NULL) {
|
||||||
|
ply_boot_splash_become_idle (state->boot_splash,
|
||||||
|
(ply_boot_splash_on_idle_handler_t)
|
||||||
|
on_boot_splash_idle,
|
||||||
|
state);
|
||||||
|
} else {
|
||||||
|
ply_trace ("deactivating splash");
|
||||||
|
deactivate_splash (state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_reactivate (state_t *state)
|
||||||
|
{
|
||||||
|
if (!state->is_inactive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (state->local_console_terminal != NULL) {
|
||||||
|
ply_terminal_open (state->local_console_terminal);
|
||||||
|
ply_terminal_watch_for_vt_changes (state->local_console_terminal);
|
||||||
|
ply_terminal_set_unbuffered_input (state->local_console_terminal);
|
||||||
|
ply_terminal_ignore_mode_changes (state->local_console_terminal, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((state->session != NULL) && state->should_be_attached) {
|
||||||
|
ply_trace ("reactivating terminal session");
|
||||||
|
attach_to_running_session (state);
|
||||||
|
}
|
||||||
|
|
||||||
|
ply_device_manager_activate_keyboards (state->device_manager);
|
||||||
|
ply_device_manager_activate_renderers (state->device_manager);
|
||||||
|
|
||||||
|
+ ply_device_manager_unpause (state->device_manager);
|
||||||
|
+
|
||||||
|
state->is_inactive = false;
|
||||||
|
|
||||||
|
update_display (state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_quit (state_t *state,
|
||||||
|
bool retain_splash,
|
||||||
|
ply_trigger_t *quit_trigger)
|
||||||
|
{
|
||||||
|
ply_trace ("quitting (retain splash: %s)", retain_splash ? "true" : "false");
|
||||||
|
|
||||||
|
if (state->quit_trigger != NULL) {
|
||||||
|
ply_trace ("quit trigger already pending, so chaining to it");
|
||||||
|
ply_trigger_add_handler (state->quit_trigger,
|
||||||
|
(ply_trigger_handler_t)
|
||||||
|
ply_trigger_pull,
|
||||||
|
quit_trigger);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state->system_initialized) {
|
||||||
|
ply_trace ("system initialized so saving boot-duration file");
|
||||||
|
ply_create_directory (PLYMOUTH_TIME_DIRECTORY);
|
||||||
|
ply_progress_save_cache (state->progress,
|
||||||
|
get_cache_file_for_mode (state->mode));
|
||||||
|
} else {
|
||||||
|
ply_trace ("system not initialized so skipping saving boot-duration file");
|
||||||
|
}
|
||||||
|
state->quit_trigger = quit_trigger;
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
143
SOURCES/ship-label-plugin-in-initrd.patch
Normal file
143
SOURCES/ship-label-plugin-in-initrd.patch
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
From aa56c9bab334f6c97204e83e578c000db274a3c0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Mon, 17 Jun 2019 13:54:42 -0400
|
||||||
|
Subject: [PATCH] ship-label-plugin-in-initrd.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
scripts/plymouth-populate-initrd.in | 19 +++++++++++++++++++
|
||||||
|
1 file changed, 19 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in
|
||||||
|
index 5f3bb85..36600a7 100755
|
||||||
|
--- a/scripts/plymouth-populate-initrd.in
|
||||||
|
+++ b/scripts/plymouth-populate-initrd.in
|
||||||
|
@@ -1,47 +1,48 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# inst bits ruthlessly and viciously stolen from dracut
|
||||||
|
|
||||||
|
[ -z "$DESTDIR" ] || exit 0
|
||||||
|
|
||||||
|
[ -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
|
||||||
|
@@ -390,59 +391,77 @@ if [ -z "$PLYMOUTH_THEME_NAME" ]; then
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $THEME_OVERRIDE ]; then
|
||||||
|
conf=$INITRDDIR/${PLYMOUTH_CONFDIR}/plymouthd.conf
|
||||||
|
echo "modifying plymouthd.conf: Theme=$PLYMOUTH_THEME_NAME" > /dev/stderr
|
||||||
|
# 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_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ModuleName *= *//')
|
||||||
|
|
||||||
|
if [ ! -f ${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so ]; then
|
||||||
|
echo "The default plymouth plugin (${PLYMOUTH_MODULE_NAME}) doesn't exist" > /dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
inst ${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so $INITRDDIR
|
||||||
|
|
||||||
|
[ -f "${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_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME} ]; then
|
||||||
|
for x in ${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}/* ; do
|
||||||
|
[ ! -f "$x" ] && continue
|
||||||
|
inst $x $INITRDDIR
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
+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 "$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
|
||||||
|
|
@ -16,7 +16,7 @@
|
|||||||
Summary: Graphical Boot Animation and Logger
|
Summary: Graphical Boot Animation and Logger
|
||||||
Name: plymouth
|
Name: plymouth
|
||||||
Version: 0.9.3
|
Version: 0.9.3
|
||||||
Release: 15%{?snapshot_rel}%{?dist}
|
Release: 16%{?snapshot_rel}%{?dist}
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://www.freedesktop.org/wiki/Software/Plymouth
|
URL: http://www.freedesktop.org/wiki/Software/Plymouth
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
@ -54,7 +54,10 @@ Patch26: 0006-boot-server-free-the-argument-and-triggers.patch
|
|||||||
Patch31: 0001-logger-Add-a-separator-between-different-boot-logs.patch
|
Patch31: 0001-logger-Add-a-separator-between-different-boot-logs.patch
|
||||||
|
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1661880
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1661880
|
||||||
#Patch41: 0001-device-manager-don-t-watch-for-udev-events-when-deac.patch
|
Patch41: 0001-device-manager-don-t-watch-for-udev-events-when-deac.patch
|
||||||
|
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1702764
|
||||||
|
Patch51: ship-label-plugin-in-initrd.patch
|
||||||
|
|
||||||
BuildRequires: pkgconfig(libdrm)
|
BuildRequires: pkgconfig(libdrm)
|
||||||
BuildRequires: pkgconfig(libudev)
|
BuildRequires: pkgconfig(libudev)
|
||||||
@ -479,6 +482,11 @@ fi
|
|||||||
%files system-theme
|
%files system-theme
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Dec 10 2019 Ray Strode <rstrode@redhat.com> - 0.9.3-16
|
||||||
|
- ship fonts in initrd
|
||||||
|
Resolves: #1702764
|
||||||
|
- fix unapplied patch
|
||||||
|
|
||||||
* Fri Sep 06 2019 Ray Strode <rstrode@redhat.com> - 0.9.3-15
|
* Fri Sep 06 2019 Ray Strode <rstrode@redhat.com> - 0.9.3-15
|
||||||
- Fix udev activation race
|
- Fix udev activation race
|
||||||
Resolves: #1661880
|
Resolves: #1661880
|
||||||
|
Loading…
Reference in New Issue
Block a user