import plymouth-0.9.4-7.20200615git1e36e30.el8
parent
547f311b21
commit
989df77e5d
|
@ -1 +1 @@
|
|||
SOURCES/plymouth-0.9.3.tar.xz
|
||||
SOURCES/plymouth-1e36e303e08ba425fecbcff4dde22c8ee936638c.tar.bz2
|
||||
|
|
|
@ -1 +1 @@
|
|||
1a07c8bc7d3625e93c5c15b1b0943c0e3a054808 SOURCES/plymouth-0.9.3.tar.xz
|
||||
7847967f397a536ccf5fb2d43aa561ac5e5dff6c SOURCES/plymouth-1e36e303e08ba425fecbcff4dde22c8ee936638c.tar.bz2
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,489 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From 6e9e95dc0fe89a3c52f50e44ff0096a6e65e46a6 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 20 Dec 2017 10:49:19 -0500
|
||||
Subject: [PATCH 1/6] device-manager: drop superfluous
|
||||
create_pixel_displays_for_renderer call
|
||||
|
||||
commit 29e27637694eefc962d53333c729e6cac1c66518 tried to move
|
||||
create_pixel_displays_for_renderer down a couple of lines, but it
|
||||
inadvertently copied it instead of moved it.
|
||||
|
||||
This commit fixes that.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=104353
|
||||
---
|
||||
src/libply-splash-core/ply-device-manager.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
|
||||
index cf56f4e..fbf4723 100644
|
||||
--- a/src/libply-splash-core/ply-device-manager.c
|
||||
+++ b/src/libply-splash-core/ply-device-manager.c
|
||||
@@ -713,7 +713,6 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||
if (manager->keyboard_added_handler != NULL)
|
||||
manager->keyboard_added_handler (manager->event_handler_data, keyboard);
|
||||
|
||||
- create_pixel_displays_for_renderer (manager, renderer);
|
||||
ply_hashtable_insert (manager->renderers, strdup (ply_renderer_get_device_name (renderer)), renderer);
|
||||
create_pixel_displays_for_renderer (manager, renderer);
|
||||
|
||||
--
|
||||
2.17.0
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
From bdfcf889f8cda47190d98fa8a3e401a1db38074c Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 7 Nov 2017 13:49:30 -0500
|
||||
Subject: [PATCH] device-manager: fall back to text mode if graphical devices
|
||||
fail
|
||||
|
||||
Right now we assume if we find a /dev/dri/card0 that it will work.
|
||||
That may not be true. The proprietary nvidia driver, for instance,
|
||||
provides /dev/dri/card0 but disables modesetting by default.
|
||||
|
||||
This commit makes sure we fall back to text mode if /dev/dri/card0
|
||||
is insufficient for our needs.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=103612
|
||||
---
|
||||
src/libply-splash-core/ply-device-manager.c | 26 ++++++++++++---------
|
||||
1 file changed, 15 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
|
||||
index b4c33d4..cf56f4e 100644
|
||||
--- a/src/libply-splash-core/ply-device-manager.c
|
||||
+++ b/src/libply-splash-core/ply-device-manager.c
|
||||
@@ -47,7 +47,7 @@
|
||||
static void create_devices_from_udev (ply_device_manager_t *manager);
|
||||
#endif
|
||||
|
||||
-static void create_devices_for_terminal_and_renderer_type (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,
|
||||
ply_renderer_type_t renderer_type);
|
||||
@@ -212,11 +212,12 @@ fb_device_has_drm_device (ply_device_manager_t *manager,
|
||||
return has_drm_device;
|
||||
}
|
||||
|
||||
-static void
|
||||
+static bool
|
||||
create_devices_for_udev_device (ply_device_manager_t *manager,
|
||||
struct udev_device *device)
|
||||
{
|
||||
const char *device_path;
|
||||
+ bool created = false;
|
||||
|
||||
device_path = udev_device_get_devnode (device);
|
||||
|
||||
@@ -245,12 +246,14 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
|
||||
terminal = manager->local_console_terminal;
|
||||
}
|
||||
|
||||
- create_devices_for_terminal_and_renderer_type (manager,
|
||||
- device_path,
|
||||
- terminal,
|
||||
- renderer_type);
|
||||
+ created = create_devices_for_terminal_and_renderer_type (manager,
|
||||
+ device_path,
|
||||
+ terminal,
|
||||
+ renderer_type);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ return created;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -310,8 +313,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 = true;
|
||||
- create_devices_for_udev_device (manager, device);
|
||||
+ found_device = create_devices_for_udev_device (manager, device);
|
||||
}
|
||||
} else {
|
||||
ply_trace ("device doesn't have a devices tag");
|
||||
@@ -656,7 +658,7 @@ create_text_displays_for_terminal (ply_device_manager_t *manager,
|
||||
manager->text_display_added_handler (manager->event_handler_data, display);
|
||||
}
|
||||
|
||||
-static void
|
||||
+static bool
|
||||
create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||
const char *device_path,
|
||||
ply_terminal_t *terminal,
|
||||
@@ -670,7 +672,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||
|
||||
if (renderer != NULL) {
|
||||
ply_trace ("ignoring device %s since it's already managed", device_path);
|
||||
- return;
|
||||
+ return true;
|
||||
}
|
||||
|
||||
ply_trace ("creating devices for %s (renderer type: %u) (terminal: %s)",
|
||||
@@ -686,7 +688,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||
renderer = NULL;
|
||||
|
||||
if (renderer_type != PLY_RENDERER_TYPE_AUTO)
|
||||
- return;
|
||||
+ return false;
|
||||
}
|
||||
|
||||
if (renderer != NULL) {
|
||||
@@ -743,6 +745,8 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
|
||||
ply_trace ("activating keyboards");
|
||||
ply_keyboard_watch_for_input (keyboard);
|
||||
}
|
||||
+
|
||||
+ return true;
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
2.17.1
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
From 014c2158898067176738ec36c9c90cc266a7e35b Mon Sep 17 00:00:00 2001
|
||||
From: Adam Williamson <awilliam@redhat.com>
|
||||
Date: Wed, 6 Jun 2018 17:06:14 -0700
|
||||
Subject: [PATCH] device-manager: skip graphical renderer setup when details
|
||||
forced
|
||||
|
||||
If neither "rhgb" nor "splash" is on the kernel cmdline, then
|
||||
plymouth forces the "details" splash. This splash is merely
|
||||
a passthrough plugin, where it makes boot looks like plymouth
|
||||
isn't even running.
|
||||
|
||||
In this case, the code sets PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV.
|
||||
The idea is to not bother waiting for udev events notifying
|
||||
plymouth when graphics devices show up, since it doesn't need
|
||||
to use the grpahics devices directly anyway.
|
||||
|
||||
Unfortunately, it does still erroneously try to setup graphical
|
||||
renderers in this case, including the /dev/fb renderer.
|
||||
|
||||
Before commit e4f86e3c, these graphical renderers failed because
|
||||
they were given the wrong device name, but since that fix, they're
|
||||
suceeding. We definitely don't want the /dev/fb renderer to
|
||||
load if we're ignoring udev on efi systems, since during very
|
||||
early boot /dev/fb is backed by efifb, something we never want to
|
||||
use. efifb is supposed to get replaced during the boot process
|
||||
by other fb implementations like say radeondrmfb, virtiodrmfb or
|
||||
bochsdrmfb, and some of those implementations can't handle the
|
||||
transition if /dev/fb is open at switchover time.
|
||||
|
||||
This commit adds a new flag to tell the device manager to
|
||||
not bother trying to setup graphical renderers when details are
|
||||
forced.
|
||||
|
||||
http://bugzilla.redhat.com/1518464
|
||||
---
|
||||
src/libply-splash-core/ply-device-manager.c | 20 ++++++++++++++++----
|
||||
src/libply-splash-core/ply-device-manager.h | 3 ++-
|
||||
src/main.c | 4 +++-
|
||||
3 files changed, 21 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
|
||||
index fbf4723..b637fb8 100644
|
||||
--- a/src/libply-splash-core/ply-device-manager.c
|
||||
+++ b/src/libply-splash-core/ply-device-manager.c
|
||||
@@ -786,6 +786,15 @@ create_devices_from_terminals (ply_device_manager_t *manager)
|
||||
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)
|
||||
@@ -801,10 +810,7 @@ create_devices_from_udev (ply_device_manager_t *manager)
|
||||
return;
|
||||
|
||||
ply_trace ("Creating non-graphical devices, since there's no suitable graphics hardware");
|
||||
- create_devices_for_terminal_and_renderer_type (manager,
|
||||
- NULL,
|
||||
- manager->local_console_terminal,
|
||||
- PLY_RENDERER_TYPE_NONE);
|
||||
+ create_non_graphical_devices (manager);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -845,6 +851,12 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager,
|
||||
if (done_with_initial_devices_setup)
|
||||
return;
|
||||
|
||||
+ if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS)) {
|
||||
+ ply_trace ("Creating non-graphical devices, since renderers are being explicitly skipped");
|
||||
+ create_non_graphical_devices (manager);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV)) {
|
||||
ply_trace ("udev support disabled, creating fallback devices");
|
||||
create_fallback_devices (manager);
|
||||
diff --git a/src/libply-splash-core/ply-device-manager.h b/src/libply-splash-core/ply-device-manager.h
|
||||
index 058f6e8..ad05897 100644
|
||||
--- a/src/libply-splash-core/ply-device-manager.h
|
||||
+++ b/src/libply-splash-core/ply-device-manager.h
|
||||
@@ -31,7 +31,8 @@ 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_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;
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index f1e0fa7..841fe6b 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -2358,7 +2358,9 @@ main (int argc,
|
||||
device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV;
|
||||
|
||||
if (!plymouth_should_show_default_splash (&state)) {
|
||||
- /* don't bother listening for udev events if we're forcing details */
|
||||
+ /* don't bother listening for udev events or setting up a graphical renderer
|
||||
+ * if we're forcing details */
|
||||
+ device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS;
|
||||
device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV;
|
||||
|
||||
/* don't ever delay showing the detailed splash */
|
||||
--
|
||||
2.17.1
|
||||
|
|
@ -1,181 +0,0 @@
|
|||
From 5fc9f555176bbbc354d651e6e31f618aea0b2b7d Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 17 Jul 2018 09:46:12 +0200
|
||||
Subject: [PATCH] logger: Add a separator between different boot logs
|
||||
|
||||
Since we concatenate boot logs one after the other in /var/log/boot.log
|
||||
it is hard to tell where the logs from one boot end the next boot starts.
|
||||
|
||||
This commit makes plymouth write out a separator including a time + date
|
||||
of the date, when the log file gets opened to add new boot messages to it.
|
||||
|
||||
Note ply_logger_open_file() is only called from ply_terminal_session_open_log()
|
||||
which in turn is only used for /var/log/boot.log, so this only effects
|
||||
/var/log/boot.log.
|
||||
|
||||
Closes #29
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
src/libply/ply-logger.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/src/libply/ply-logger.c b/src/libply/ply-logger.c
|
||||
index 1b56ea8..3dbc3ca 100644
|
||||
--- a/src/libply/ply-logger.c
|
||||
+++ b/src/libply/ply-logger.c
|
||||
@@ -7,60 +7,61 @@
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Written by: Ray Strode <rstrode@redhat.com>
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "ply-logger.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
+#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ply-utils.h"
|
||||
#include "ply-list.h"
|
||||
|
||||
#ifndef PLY_LOGGER_OPEN_FLAGS
|
||||
#define PLY_LOGGER_OPEN_FLAGS (O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_CLOEXEC)
|
||||
#endif
|
||||
|
||||
#ifndef PLY_LOGGER_MAX_INJECTION_SIZE
|
||||
#define PLY_LOGGER_MAX_INJECTION_SIZE 4096
|
||||
#endif
|
||||
|
||||
#ifndef PLY_LOGGER_MAX_BUFFER_CAPACITY
|
||||
#define PLY_LOGGER_MAX_BUFFER_CAPACITY (8 * 4096)
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ply_logger_filter_handler_t handler;
|
||||
void *user_data;
|
||||
} ply_logger_filter_t;
|
||||
|
||||
struct _ply_logger
|
||||
{
|
||||
int output_fd;
|
||||
char *filename;
|
||||
|
||||
char *buffer;
|
||||
size_t buffer_size;
|
||||
@@ -285,77 +286,89 @@ ply_logger_free_filters (ply_logger_t *logger)
|
||||
free (filter);
|
||||
node = next_node;
|
||||
}
|
||||
|
||||
ply_list_free (logger->filters);
|
||||
}
|
||||
|
||||
void
|
||||
ply_logger_free (ply_logger_t *logger)
|
||||
{
|
||||
if (logger == NULL)
|
||||
return;
|
||||
|
||||
if (logger->output_fd >= 0) {
|
||||
if (ply_logger_is_logging (logger))
|
||||
ply_logger_flush (logger);
|
||||
close (logger->output_fd);
|
||||
}
|
||||
|
||||
ply_logger_free_filters (logger);
|
||||
|
||||
free (logger->filename);
|
||||
free (logger->buffer);
|
||||
free (logger);
|
||||
}
|
||||
|
||||
bool
|
||||
ply_logger_open_file (ply_logger_t *logger,
|
||||
const char *filename)
|
||||
{
|
||||
+ char header[80];
|
||||
+ struct tm* tm;
|
||||
+ time_t t;
|
||||
int fd;
|
||||
mode_t mode;
|
||||
|
||||
assert (logger != NULL);
|
||||
assert (filename != NULL);
|
||||
|
||||
fd = open (filename, PLY_LOGGER_OPEN_FLAGS, 0600);
|
||||
|
||||
if (fd < 0)
|
||||
return false;
|
||||
|
||||
ply_logger_set_output_fd (logger, fd);
|
||||
|
||||
free (logger->filename);
|
||||
|
||||
logger->filename = strdup (filename);
|
||||
|
||||
+ time (&t);
|
||||
+ tm = localtime (&t);
|
||||
+ if (tm) {
|
||||
+ /* This uses uname -v date format */
|
||||
+ strftime (header, sizeof(header),
|
||||
+ "------------ %a %b %d %T %Z %Y ------------\n", tm);
|
||||
+ ply_logger_write (logger, header, strlen(header), true);
|
||||
+ }
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
ply_logger_close_file (ply_logger_t *logger)
|
||||
{
|
||||
assert (logger != NULL);
|
||||
|
||||
if (logger->output_fd < 0)
|
||||
return;
|
||||
|
||||
close (logger->output_fd);
|
||||
ply_logger_set_output_fd (logger, -1);
|
||||
}
|
||||
|
||||
void
|
||||
ply_logger_set_output_fd (ply_logger_t *logger,
|
||||
int fd)
|
||||
{
|
||||
assert (logger != NULL);
|
||||
|
||||
logger->output_fd = fd;
|
||||
}
|
||||
|
||||
int
|
||||
ply_logger_get_output_fd (ply_logger_t *logger)
|
||||
{
|
||||
assert (logger != NULL);
|
||||
|
||||
return logger->output_fd;
|
||||
--
|
||||
2.18.1
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
From f31312257094b3336c38cc8bdce1ded9188d37c3 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 15 Oct 2018 21:02:50 -0400
|
||||
Subject: [PATCH 1/6] populate-initrd: drop unused local variable
|
||||
|
||||
the inst_library function declares a variable `_lib`
|
||||
that's completely unused.
|
||||
|
||||
This commit removes the declaration.
|
||||
---
|
||||
scripts/plymouth-populate-initrd.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in
|
||||
index e3326e9..5f3bb85 100755
|
||||
--- a/scripts/plymouth-populate-initrd.in
|
||||
+++ b/scripts/plymouth-populate-initrd.in
|
||||
@@ -141,61 +141,61 @@ inst_simple() {
|
||||
|
||||
# find symlinks linked to given library file
|
||||
# $1 = library file
|
||||
# Function searches for symlinks by stripping version numbers appended to
|
||||
# library filename, checks if it points to the same target and finally
|
||||
# prints the list of symlinks to stdout.
|
||||
#
|
||||
# Example:
|
||||
# rev_lib_symlinks libfoo.so.8.1
|
||||
# output: libfoo.so.8 libfoo.so
|
||||
# (Only if libfoo.so.8 and libfoo.so exists on host system.)
|
||||
rev_lib_symlinks() {
|
||||
[[ ! $1 ]] && return 0
|
||||
|
||||
local fn="$1" orig="$(readlink -f "$1")" links=''
|
||||
|
||||
[[ ${fn} =~ .*\.so\..* ]] || return 1
|
||||
|
||||
until [[ ${fn##*.} == so ]]; do
|
||||
fn="${fn%.*}"
|
||||
[[ -L ${fn} && $(readlink -f "${fn}") == ${orig} ]] && links+=" ${fn}"
|
||||
done
|
||||
|
||||
echo "${links}"
|
||||
}
|
||||
|
||||
# Same as above, but specialized to handle dynamic libraries.
|
||||
# It handles making symlinks according to how the original library
|
||||
# is referenced.
|
||||
inst_library() {
|
||||
- local _src="$1" _dest=${2:-$1} _lib _reallib _symlink
|
||||
+ local _src="$1" _dest=${2:-$1} _reallib _symlink
|
||||
strstr "$1" "/" || return 1
|
||||
[[ -e $initdir/$_dest ]] && return 0
|
||||
if [[ -L $_src ]]; then
|
||||
# install checksum files also
|
||||
if [[ -e "${_src%/*}/.${_src##*/}.hmac" ]]; then
|
||||
inst "${_src%/*}/.${_src##*/}.hmac" "${_dest%/*}/.${_dest##*/}.hmac"
|
||||
fi
|
||||
_reallib=$(readlink -f "$_src")
|
||||
inst_simple "$_reallib" "$_reallib"
|
||||
inst_dir "${_dest%/*}"
|
||||
[[ -d "${_dest%/*}" ]] && _dest=$(readlink -f "${_dest%/*}")/${_dest##*/}
|
||||
ln -sfn $(convert_abs_rel "${_dest}" "${_reallib}") "${initdir}/${_dest}"
|
||||
else
|
||||
inst_simple "$_src" "$_dest"
|
||||
fi
|
||||
|
||||
# Create additional symlinks. See rev_symlinks description.
|
||||
for _symlink in $(rev_lib_symlinks $_src) $(rev_lib_symlinks $_reallib); do
|
||||
[[ ! -e $initdir/$_symlink ]] && {
|
||||
ddebug "Creating extra symlink: $_symlink"
|
||||
inst_symlink $_symlink
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
# find a binary. If we were not passed the full path directly,
|
||||
# search in the usual places to find the binary.
|
||||
find_binary() {
|
||||
if [[ -z ${1##/*} ]]; then
|
||||
if [[ -x $1 ]] || { strstr "$1" ".so" && ldd $1 &>/dev/null; }; then
|
||||
--
|
||||
2.17.1
|
||||
|
|
@ -0,0 +1,871 @@
|
|||
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 && \
|
||||