]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
main: start ply-kmsg-reader, and fix handling ESC key when there are no VTs
authorn3rdopolis <bluescreen_avenger@verizon.net>
Mon, 20 Mar 2023 02:40:18 +0000 (22:40 -0400)
committerRay Strode <rstrode@redhat.com>
Sat, 2 Dec 2023 23:19:33 +0000 (18:19 -0500)
src/main.c

index ae029bf0423660a2ad33c38e081144dfd44ead13..86a24aa9bc26938ac14254402f4fdabc2bce9bc2 100644 (file)
@@ -55,6 +55,7 @@
 #include "ply-trigger.h"
 #include "ply-utils.h"
 #include "ply-progress.h"
+#include "ply-kmsg-reader.h"
 
 #define BOOT_DURATION_FILE     PLYMOUTH_TIME_DIRECTORY "/boot-duration"
 #define SHUTDOWN_DURATION_FILE PLYMOUTH_TIME_DIRECTORY "/shutdown-duration"
@@ -79,6 +80,7 @@ typedef struct
         ply_event_loop_t       *loop;
         ply_boot_server_t      *boot_server;
         ply_boot_splash_t      *boot_splash;
+        ply_kmsg_reader_t      *kmsg_reader;
         ply_terminal_session_t *session;
         ply_buffer_t           *boot_buffer;
         ply_progress_t         *progress;
@@ -93,6 +95,7 @@ typedef struct
 
         ply_trigger_t          *deactivate_trigger;
         ply_trigger_t          *quit_trigger;
+        ply_trigger_t          *kmsg_trigger;
 
         double                  start_time;
         double                  splash_delay;
@@ -157,6 +160,8 @@ static void on_backspace (state_t *state);
 static void on_quit (state_t       *state,
                      bool           retain_splash,
                      ply_trigger_t *quit_trigger);
+static void on_new_kmsg_message (state_t        *state,
+                                 kmsg_message_t *kmsg_message);
 static bool sh_is_init (state_t *state);
 static void cancel_pending_delayed_show (state_t *state);
 static void prepare_logging (state_t *state);
@@ -1455,6 +1460,22 @@ on_quit (state_t       *state,
         }
 }
 
+void
+on_new_kmsg_message (state_t        *state,
+                     kmsg_message_t *kmsg_message)
+{
+        long size = strlen (kmsg_message->message) + 1;
+        char output[size];
+
+        strcpy (output, kmsg_message->message);
+        strcat (output, "\n");
+
+        ply_buffer_append_bytes (state->boot_buffer, output, size);
+
+        if (state->boot_splash != NULL)
+                ply_boot_splash_update_output (state->boot_splash, output, size);
+}
+
 static bool
 on_has_active_vt (state_t *state)
 {
@@ -1578,15 +1599,16 @@ static void
 on_escape_pressed (state_t *state)
 {
         ply_trace ("escape key pressed");
+        bool has_vt_consoles = true;
 
         if (state->local_console_terminal != NULL) {
                 if (!ply_terminal_is_vt (state->local_console_terminal))
-                        return;
+                        has_vt_consoles = false;
         } else {
-                return;
+                has_vt_consoles = false;
         }
 
-        if (validate_input (state, "", "\e"))
+        if (validate_input (state, "", "\e") && has_vt_consoles == true)
                 toggle_between_splash_and_details (state);
 }
 
@@ -1891,6 +1913,18 @@ attach_to_running_session (state_t *state)
                 return false;
         }
 
+        if (state->kmsg_reader == NULL) {
+                ply_trace ("Creating new kmsg reader");
+                state->kmsg_reader = ply_kmsg_reader_new ();
+
+                ply_kmsg_reader_watch_for_messages (state->kmsg_reader,
+                                                    (ply_kmsg_reader_message_handler_t)
+                                                    on_new_kmsg_message,
+                                                    state);
+        }
+
+        ply_kmsg_reader_start (state->kmsg_reader);
+
 #ifdef PLY_ENABLE_SYSTEMD_INTEGRATION
         tell_systemd_to_print_details (state);
 #endif
@@ -1915,6 +1949,9 @@ detach_from_running_session (state_t *state)
         tell_systemd_to_stop_printing_details (state);
 #endif
 
+        ply_trace ("stopping kmsg reader");
+        ply_kmsg_reader_stop (state->kmsg_reader);
+
         ply_trace ("detaching from terminal session");
         ply_terminal_session_detach (state->session);
         state->is_redirected = false;