Blob Blame History Raw
From be52bd06949cb2a386fda147d24155581708ef1a Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Fri, 10 Oct 2014 13:30:56 -0400
Subject: [PATCH] main: show splash when init=/bin/sh

but quit after switch root.  The keeps luks
working.
---
 src/main.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/main.c b/src/main.c
index fb91bf2..4101550 100644
--- a/src/main.c
+++ b/src/main.c
@@ -135,60 +135,64 @@ static ply_boot_splash_t *load_theme (state_t    *state,
 static ply_boot_splash_t *show_theme (state_t    *state,
                                       const char *theme_path);
 
 static void attach_splash_to_seats (state_t           *state,
                                     ply_boot_splash_t *splash);
 static bool attach_to_running_session (state_t *state);
 static void detach_from_running_session (state_t *state);
 static void on_escape_pressed (state_t *state);
 static void dump_details_and_quit_splash (state_t *state);
 static void update_display (state_t *state);
 
 static void on_error_message (ply_buffer_t *debug_buffer,
                               const void   *bytes,
                               size_t        number_of_bytes);
 static ply_buffer_t *debug_buffer;
 static char *debug_buffer_path = NULL;
 static char *pid_file = NULL;
 static void toggle_between_splash_and_details (state_t *state);
 #ifdef PLY_ENABLE_SYSTEMD_INTEGRATION
 static void tell_systemd_to_print_details (state_t *state);
 static void tell_systemd_to_stop_printing_details (state_t *state);
 #endif
 static const char * get_cache_file_for_mode (ply_mode_t mode);
 static void on_escape_pressed (state_t *state);
 static void on_enter (state_t    *state,
                       const char *line);
 static void on_keyboard_input (state_t    *state,
                                const char *keyboard_input,
                                size_t      character_size);
 static void on_backspace (state_t *state);
+static void on_quit (state_t       *state,
+                     bool           retain_splash,
+                     ply_trigger_t *quit_trigger);
+static bool sh_is_init (state_t *state);
 
 static void
 on_session_output (state_t    *state,
                    const char *output,
                    size_t      size)
 {
   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 void
 on_session_hangup (state_t *state)
 {
   ply_trace ("got hang up on terminal session fd");
 }
 
 static void
 on_update (state_t     *state,
            const char  *status)
 {
   ply_trace ("updating status to '%s'", status);
   ply_progress_status_update (state->progress,
                                status);
   if (state->boot_splash != NULL)
     ply_boot_splash_update_status (state->boot_splash,
                                    status);
 }
 
@@ -626,60 +630,67 @@ on_ignore_keystroke (state_t      *state,
     {
       ply_keystroke_watch_t* keystroke_trigger = ply_list_node_get_data (node);
       if ((!keystroke_trigger->keys && !keys) ||
           (keystroke_trigger->keys && keys && strcmp(keystroke_trigger->keys, keys)==0))
         {
           ply_trigger_pull (keystroke_trigger->trigger, NULL);
           ply_list_remove_node (state->keystroke_triggers, node);
           return;
         }
     }
 }
 
 static void
 on_progress_pause (state_t *state)
 {
   ply_trace ("pausing progress");
   ply_progress_pause (state->progress);
 }
 
 static void
 on_progress_unpause (state_t *state)
 {
   ply_trace ("unpausing progress");
   ply_progress_unpause (state->progress);
 }
 
 static void
 on_newroot (state_t    *state,
             const char *root_dir)
 {
+  if (sh_is_init (state))
+    {
+      ply_trace ("new root mounted at \"%s\", exiting since init= a shell", root_dir);
+      on_quit (state, false, ply_trigger_new (NULL));
+      return;
+    }
+
   ply_trace ("new root mounted at \"%s\", switching to it", root_dir);
   chdir(root_dir);
   chroot(".");
   chdir("/");
   ply_progress_load_cache (state->progress, get_cache_file_for_mode (state->mode));
   if (state->boot_splash != NULL)
     ply_boot_splash_root_mounted (state->boot_splash);
 }
 
 static const char *
 get_cache_file_for_mode (ply_mode_t mode)
 {
   const char *filename;
 
   switch ((int)mode)
     {
     case PLY_MODE_BOOT:
       filename = BOOT_DURATION_FILE;
       break;
     case PLY_MODE_SHUTDOWN:
       filename = SHUTDOWN_DURATION_FILE;
       break;
     case PLY_MODE_UPDATES:
       filename = NULL;
       break;
     default:
       ply_error ("Unhandled case in %s line %d\n", __FILE__, __LINE__);
       abort ();
       break;
     }
@@ -781,70 +792,76 @@ prepare_logging (state_t *state)
       if (state->number_of_errors > 0)
         spool_error (state);
     }
 }
 
 static void
 on_system_initialized (state_t *state)
 {
   ply_trace ("system now initialized, opening log");
   state->system_initialized = true;
 
   prepare_logging (state);
 }
 
 static void
 on_error (state_t *state)
 {
   ply_trace ("encountered error during boot up");
 
   if (state->system_initialized && state->number_of_errors == 0)
     spool_error (state);
   else
     ply_trace ("not spooling because number of errors %d", state->number_of_errors);
 
   state->number_of_errors++;
 }
 
 static bool
 plymouth_should_ignore_show_splash_calls (state_t *state)
 {
-  const char *init_string;
-  size_t length;
-
   ply_trace ("checking if plymouth should be running");
   if (state->mode != PLY_MODE_BOOT || command_line_has_argument (state->kernel_command_line, "plymouth.force-splash"))
       return false;
 
   if (command_line_has_argument (state->kernel_command_line, "plymouth.ignore-show-splash"))
       return true;
 
+  return false;
+}
+
+static bool
+sh_is_init (state_t *state)
+{
+  const char *init_string;
+  size_t length;
+
   init_string = command_line_get_string_after_prefix (state->kernel_command_line, "init=");
 
   if (init_string)
     {
       length = strcspn (init_string, " \n");
       if (length > 2 && ply_string_has_prefix (init_string + length - 2, "sh"))
         return true;
     }
 
   return false;
 }
 
 static bool
 plymouth_should_show_default_splash (state_t *state)
 {
   ply_trace ("checking if plymouth should show default splash");
 
   const char const *strings[] = {
       "single", "1", "s", "S", "-S", NULL
   };
   int i;
 
   if (state->should_force_details)
     return false;
 
   for (i = 0; strings[i] != NULL; i++)
     {
       if (command_line_has_argument (state->kernel_command_line, strings[i]))
         {
           ply_trace ("no default splash because kernel command line has option \"%s\"", strings[i]);
-- 
1.8.3.1