Marcus Meissner
779d27502d
Update to 0.9.2 OBS-URL: https://build.opensuse.org/request/show/351108 OBS-URL: https://build.opensuse.org/package/show/Base:System/plymouth?expand=0&rev=168
189 lines
7.0 KiB
Diff
189 lines
7.0 KiB
Diff
Related to bnc#892526 -- let plymouthd become a real daemon that
|
|
is it should use its own session with the help of the system call
|
|
setsid(2). Also avoid an EBUSY on ioctl TIOCCONS if a former
|
|
plymouthd had failed. And a crash or termination may restore not
|
|
only the current virtual console but also any serial console as
|
|
well restore the system console.
|
|
|
|
---
|
|
plymouth-0.9.0/src/libply-splash-core/ply-device-manager.c | 9 ++
|
|
plymouth-0.9.0/src/libply-splash-core/ply-device-manager.h | 1
|
|
plymouth-0.9.0/src/libply/ply-terminal-session.c | 7 ++
|
|
plymouth-0.9.0/src/libply/ply-utils.c | 2
|
|
plymouth-0.9.0/src/main.c | 42 +++++++------
|
|
5 files changed, 43 insertions(+), 18 deletions(-)
|
|
|
|
Index: plymouth-0.9.2/src/libply-splash-core/ply-device-manager.c
|
|
===================================================================
|
|
--- plymouth-0.9.2.orig/src/libply-splash-core/ply-device-manager.c
|
|
+++ plymouth-0.9.2/src/libply-splash-core/ply-device-manager.c
|
|
@@ -926,3 +926,12 @@ ply_device_manager_deactivate_keyboards
|
|
node = next_node;
|
|
}
|
|
}
|
|
+
|
|
+void
|
|
+ply_close_all_terminals (ply_device_manager_t *manager)
|
|
+{
|
|
+ ply_hashtable_foreach (manager->terminals,
|
|
+ (ply_hashtable_foreach_func_t *)
|
|
+ ply_terminal_close,
|
|
+ manager);
|
|
+}
|
|
Index: plymouth-0.9.2/src/libply-splash-core/ply-device-manager.h
|
|
===================================================================
|
|
--- plymouth-0.9.2.orig/src/libply-splash-core/ply-device-manager.h
|
|
+++ plymouth-0.9.2/src/libply-splash-core/ply-device-manager.h
|
|
@@ -52,6 +52,7 @@ void ply_device_manager_deactivate_keybo
|
|
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);
|
|
+void ply_close_all_terminals (ply_device_manager_t *manager);
|
|
|
|
#endif
|
|
|
|
Index: plymouth-0.9.2/src/libply/ply-utils.c
|
|
===================================================================
|
|
--- plymouth-0.9.2.orig/src/libply/ply-utils.c
|
|
+++ plymouth-0.9.2/src/libply/ply-utils.c
|
|
@@ -77,6 +77,7 @@
|
|
|
|
static int errno_stack[PLY_ERRNO_STACK_SIZE];
|
|
static int errno_stack_position = 0;
|
|
+static bool inChild = false;
|
|
|
|
bool
|
|
ply_open_unidirectional_pipe (int *sender_fd,
|
|
@@ -771,6 +772,7 @@ ply_create_daemon (void)
|
|
if (!ply_read (receiver_fd, &byte, sizeof(uint8_t))) {
|
|
int read_error = errno;
|
|
int status;
|
|
+ inChild = true;
|
|
|
|
if (waitpid (pid, &status, WNOHANG) <= 0)
|
|
ply_error ("failed to read status from child immediately after starting to daemonize: %s", strerror (read_error));
|
|
@@ -811,6 +813,9 @@ ply_detach_daemon (ply_daemon_handle_t *
|
|
close (sender_fd);
|
|
free (handle);
|
|
|
|
+ if (inChild)
|
|
+ setsid();
|
|
+
|
|
return true;
|
|
}
|
|
|
|
Index: plymouth-0.9.2/src/libply/ply-terminal-session.c
|
|
===================================================================
|
|
--- plymouth-0.9.2.orig/src/libply/ply-terminal-session.c
|
|
+++ plymouth-0.9.2/src/libply/ply-terminal-session.c
|
|
@@ -187,6 +187,12 @@ ply_terminal_session_redirect_console (p
|
|
|
|
assert (terminal_name != NULL);
|
|
|
|
+ fd = open ("/dev/console", O_RDWR | O_NOCTTY);
|
|
+ if (fd >= 0) {
|
|
+ ioctl (fd, TIOCCONS); /* Undo any current map if any */
|
|
+ close (fd);
|
|
+ }
|
|
+
|
|
fd = open (terminal_name, O_RDWR | O_NOCTTY);
|
|
|
|
if (fd < 0)
|
|
Index: plymouth-0.9.2/src/main.c
|
|
===================================================================
|
|
--- plymouth-0.9.2.orig/src/main.c
|
|
+++ plymouth-0.9.2/src/main.c
|
|
@@ -1026,6 +1026,7 @@ on_seat_added (state_t *state,
|
|
on_enter, state);
|
|
}
|
|
|
|
+static ply_device_manager_t *manager;
|
|
static void
|
|
load_devices (state_t *state,
|
|
ply_device_manager_flags_t flags)
|
|
@@ -1033,6 +1034,8 @@ load_devices (state_t
|
|
state->device_manager = ply_device_manager_new (state->default_tty, flags);
|
|
state->local_console_terminal = ply_device_manager_get_default_terminal (state->device_manager);
|
|
|
|
+ manager = state->device_manager;
|
|
+
|
|
ply_device_manager_watch_seats (state->device_manager,
|
|
(ply_seat_added_handler_t)
|
|
on_seat_added,
|
|
@@ -1058,6 +1061,7 @@ quit_splash (state_t *state)
|
|
ply_trace ("Not retaining splash, so deallocating VT");
|
|
ply_terminal_deactivate_vt (state->local_console_terminal);
|
|
ply_terminal_close (state->local_console_terminal);
|
|
+ ply_close_all_terminals (state->device_manager);
|
|
}
|
|
}
|
|
|
|
@@ -1974,25 +1978,20 @@ dump_debug_buffer_to_file (void)
|
|
#include <termios.h>
|
|
#include <unistd.h>
|
|
static void
|
|
-on_crash (int signum)
|
|
+dosigaction (int signum)
|
|
{
|
|
- struct termios term_attributes;
|
|
int fd;
|
|
|
|
- fd = open ("/dev/tty1", O_RDWR | O_NOCTTY);
|
|
- if (fd < 0) fd = open ("/dev/hvc0", O_RDWR | O_NOCTTY);
|
|
-
|
|
- ioctl (fd, KDSETMODE, KD_TEXT);
|
|
-
|
|
- tcgetattr (fd, &term_attributes);
|
|
-
|
|
- term_attributes.c_iflag |= BRKINT | IGNPAR | ICRNL | IXON;
|
|
- term_attributes.c_oflag |= OPOST;
|
|
- term_attributes.c_lflag |= ECHO | ICANON | ISIG | IEXTEN;
|
|
-
|
|
- tcsetattr (fd, TCSAFLUSH, &term_attributes);
|
|
+ if (manager) {
|
|
+ ply_device_manager_deactivate_keyboards (manager);
|
|
+ ply_close_all_terminals (manager);
|
|
+ }
|
|
|
|
- close (fd);
|
|
+ fd = open ("/dev/console", O_RDWR | O_NOCTTY);
|
|
+ if (fd >= 0) {
|
|
+ ioctl (fd, TIOCCONS); /* Undo any current map if any */
|
|
+ close (fd);
|
|
+ }
|
|
|
|
if (debug_buffer != NULL) {
|
|
dump_debug_buffer_to_file ();
|
|
@@ -2005,7 +2004,6 @@ on_crash (int signum)
|
|
pid_file = NULL;
|
|
}
|
|
|
|
- signal (signum, SIG_DFL);
|
|
raise (signum);
|
|
}
|
|
|
|
@@ -2039,6 +2037,7 @@ main (int argc,
|
|
char *kernel_command_line = NULL;
|
|
char *tty = NULL;
|
|
ply_device_manager_flags_t device_manager_flags = PLY_DEVICE_MANAGER_FLAGS_NONE;
|
|
+ struct sigaction sa;
|
|
|
|
state.start_time = ply_get_timestamp ();
|
|
state.command_parser = ply_command_parser_new ("plymouthd", "Splash server");
|
|
@@ -2141,8 +2140,13 @@ main (int argc,
|
|
if (debug)
|
|
debug_buffer = ply_buffer_new ();
|
|
|
|
- signal (SIGABRT, on_crash);
|
|
- signal (SIGSEGV, on_crash);
|
|
+ sigemptyset(&sa.sa_mask);
|
|
+ sa.sa_flags = SA_RESETHAND;
|
|
+ sa.sa_handler = dosigaction;
|
|
+ sigaction (SIGHUP, &sa, NULL);
|
|
+ sigaction (SIGTERM, &sa, NULL);
|
|
+ sigaction (SIGABRT, &sa, NULL);
|
|
+ sigaction (SIGSEGV, &sa, NULL);
|
|
|
|
/* before do anything we need to make sure we have a working
|
|
* environment.
|