46cdc41
diff --git a/src/client/ply-boot-client.c b/src/client/ply-boot-client.c
46cdc41
index 2b1d075..c6b3075 100644
46cdc41
--- a/src/client/ply-boot-client.c
46cdc41
+++ b/src/client/ply-boot-client.c
46cdc41
@@ -282,6 +282,10 @@ ply_boot_client_process_incoming_replies (ply_boot_client_t *client)
46cdc41
 
46cdc41
       ((ply_boot_client_answer_handler_t) request->handler) (request->user_data, answer, client);
46cdc41
     }
46cdc41
+  else if (memcmp (byte, PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NO_ANSWER, sizeof (uint8_t)) == 0)
46cdc41
+    {
46cdc41
+      ((ply_boot_client_answer_handler_t) request->handler) (request->user_data, NULL, client);
46cdc41
+    }
46cdc41
   else
46cdc41
     goto out;
46cdc41
 
46cdc41
diff --git a/src/client/plymouth.c b/src/client/plymouth.c
46cdc41
index c343378..33deb24 100644
46cdc41
--- a/src/client/plymouth.c
46cdc41
+++ b/src/client/plymouth.c
46cdc41
@@ -102,9 +102,16 @@ answer_via_command (answer_state_t *answer_state,
46cdc41
   pid_t pid;
46cdc41
   int command_input_sender_fd, command_input_receiver_fd;
46cdc41
 
46cdc41
+  /* answer may be NULL which means,
46cdc41
+   * "The daemon can't ask the user questions,
46cdc41
+   *   do all the prompting from the client"
46cdc41
+   */
46cdc41
+
46cdc41
   gave_answer = false;
46cdc41
-  if (!ply_open_unidirectional_pipe (&command_input_sender_fd,
46cdc41
-                                     &command_input_receiver_fd))  return false;
46cdc41
+  if (answer != NULL &&
46cdc41
+    !ply_open_unidirectional_pipe (&command_input_sender_fd,
46cdc41
+                                   &command_input_receiver_fd))
46cdc41
+    return false;
46cdc41
 
46cdc41
   pid = fork (); 
46cdc41
 
46cdc41
@@ -114,21 +121,29 @@ answer_via_command (answer_state_t *answer_state,
46cdc41
   if (pid == 0)
46cdc41
     {
46cdc41
       char **args;
46cdc41
-      close (command_input_sender_fd);
46cdc41
       args = split_string (answer_state->command, ' ');
46cdc41
-      dup2 (command_input_receiver_fd, STDIN_FILENO);
46cdc41
+      if (answer != NULL)
46cdc41
+        {
46cdc41
+          close (command_input_sender_fd);
46cdc41
+          dup2 (command_input_receiver_fd, STDIN_FILENO);
46cdc41
+        }
46cdc41
       execvp (args[0], args); 
46cdc41
       ply_trace ("could not run command: %m");
46cdc41
       _exit (127);
46cdc41
     }
46cdc41
-  close (command_input_receiver_fd);
46cdc41
 
46cdc41
-  if (write (command_input_sender_fd, answer, strlen (answer)) < 0)
46cdc41
-    goto out;
46cdc41
+  if (answer != NULL)
46cdc41
+    {
46cdc41
+      close (command_input_receiver_fd);
46cdc41
+
46cdc41
+      if (write (command_input_sender_fd, answer, strlen (answer)) < 0)
46cdc41
+        goto out;
46cdc41
+    }
46cdc41
 
46cdc41
   gave_answer = true;
46cdc41
 out:
46cdc41
-  close (command_input_sender_fd);
46cdc41
+  if (answer != NULL)
46cdc41
+    close (command_input_sender_fd);
46cdc41
   waitpid (pid, exit_status, 0); 
46cdc41
 
46cdc41
   return gave_answer;
46cdc41
diff --git a/src/libplybootsplash/ply-answer.c b/src/libplybootsplash/ply-answer.c
46cdc41
index 9213875..24a56f6 100644
46cdc41
--- a/src/libplybootsplash/ply-answer.c
46cdc41
+++ b/src/libplybootsplash/ply-answer.c
46cdc41
@@ -69,6 +69,15 @@ ply_answer_with_string (ply_answer_t *answer,
46cdc41
 
46cdc41
 }
46cdc41
 
46cdc41
+void
46cdc41
+ply_answer_unknown (ply_answer_t *answer)
46cdc41
+{
46cdc41
+  assert (answer != NULL);
46cdc41
+
46cdc41
+  if (answer->handler != NULL)
46cdc41
+    answer->handler (answer->user_data, NULL, answer);
46cdc41
+}
46cdc41
+
46cdc41
 #ifdef PLY_ANSWER_ENABLE_TEST
46cdc41
 
46cdc41
 #include <stdio.h>
46cdc41
diff --git a/src/libplybootsplash/ply-answer.h b/src/libplybootsplash/ply-answer.h
46cdc41
index 4e04a75..3da41f3 100644
46cdc41
--- a/src/libplybootsplash/ply-answer.h
46cdc41
+++ b/src/libplybootsplash/ply-answer.h
46cdc41
@@ -44,6 +44,8 @@ void ply_answer_free (ply_answer_t *answer);
46cdc41
 
46cdc41
 void ply_answer_with_string (ply_answer_t *answer,
46cdc41
                              const char   *string);
46cdc41
+
46cdc41
+void ply_answer_unknown (ply_answer_t *answer);
46cdc41
 #endif
46cdc41
 
46cdc41
 #endif /* PLY_ANSWER_H */
46cdc41
diff --git a/src/main.c b/src/main.c
46cdc41
index fffa0c4..e11f964 100644
46cdc41
--- a/src/main.c
46cdc41
+++ b/src/main.c
46cdc41
@@ -59,6 +59,7 @@ typedef struct
46cdc41
   char kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
46cdc41
   uint32_t showing_details : 1;
46cdc41
   uint32_t system_initialized : 1;
46cdc41
+  uint32_t using_serial_console : 1;
46cdc41
 
46cdc41
   int number_of_errors;
46cdc41
 } state_t;
46cdc41
@@ -205,6 +206,12 @@ plymouth_should_show_default_splash (state_t *state)
46cdc41
   };
46cdc41
   int i;
46cdc41
 
46cdc41
+  if (state->using_serial_console)
46cdc41
+    return false;
46cdc41
+
46cdc41
+  if (state->window == NULL)
46cdc41
+    return false;
46cdc41
+
46cdc41
   for (i = 0; strings[i] != NULL; i++)
46cdc41
     {
46cdc41
       int cmp;
46cdc41
@@ -228,10 +235,11 @@ static void
46cdc41
 on_show_splash (state_t *state)
46cdc41
 {
46cdc41
 
46cdc41
-  if (state->window == NULL)
46cdc41
+  if (state->window == NULL && !state->using_serial_console)
46cdc41
     {
46cdc41
       state->window = create_window (state, 1);
46cdc41
-      ply_window_take_console (state->window);
46cdc41
+      if (state->window != NULL)
46cdc41
+        ply_window_take_console (state->window);
46cdc41
     }
46cdc41
 
46cdc41
   if (plymouth_should_show_default_splash (state))
46cdc41
@@ -353,10 +361,8 @@ create_window (state_t    *state,
46cdc41
   ply_trace ("opening window");
46cdc41
   if (!ply_window_open (window))
46cdc41
     {
46cdc41
-      ply_save_errno ();
46cdc41
       ply_trace ("could not open window: %m");
46cdc41
       ply_window_free (window);
46cdc41
-      ply_restore_errno ();
46cdc41
       return NULL;
46cdc41
     }
46cdc41
 
46cdc41
@@ -467,6 +473,23 @@ check_verbosity (state_t *state)
46cdc41
     ply_trace ("tracing shouldn't be enabled!");
46cdc41
 }
46cdc41
 
46cdc41
+static void
46cdc41
+check_for_serial_console (state_t *state)
46cdc41
+{
46cdc41
+  ply_trace ("checking if splash screen should be disabled");
46cdc41
+
46cdc41
+  if (strstr (state->kernel_command_line, " console=") != NULL)
46cdc41
+    {
46cdc41
+      ply_trace ("serial console found!");
46cdc41
+      state->using_serial_console = true;
46cdc41
+    }
46cdc41
+  else
46cdc41
+    {
46cdc41
+      ply_trace ("serial console not found!");
46cdc41
+      state->using_serial_console = false;
46cdc41
+    }
46cdc41
+}
46cdc41
+
46cdc41
 static bool
46cdc41
 set_console_io_to_vt1 (state_t *state)
46cdc41
 {
46cdc41
@@ -493,9 +516,13 @@ initialize_environment (state_t *state)
46cdc41
     return false;
46cdc41
 
46cdc41
   check_verbosity (state);
46cdc41
+  check_for_serial_console (state);
46cdc41
 
46cdc41
-  if (!set_console_io_to_vt1 (state))
46cdc41
-    return false;
46cdc41
+  if (!state->using_serial_console)
46cdc41
+    {
46cdc41
+      if (!set_console_io_to_vt1 (state))
46cdc41
+          return false;
46cdc41
+    }
46cdc41
 
46cdc41
   ply_trace ("initialized minimal work environment");
46cdc41
   return true;
46cdc41
diff --git a/src/ply-boot-protocol.h b/src/ply-boot-protocol.h
46cdc41
index 594064a..852b9d9 100644
46cdc41
--- a/src/ply-boot-protocol.h
46cdc41
+++ b/src/ply-boot-protocol.h
46cdc41
@@ -35,6 +35,7 @@
46cdc41
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK "\x6"
46cdc41
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK "\x15"
46cdc41
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER "\x2"
46cdc41
+#define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NO_ANSWER "\x5"
46cdc41
 
46cdc41
 #endif /* PLY_BOOT_PROTOCOL_H */
46cdc41
 /* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
46cdc41
diff --git a/src/ply-boot-server.c b/src/ply-boot-server.c
46cdc41
index 29f402e..6e39f86 100644
46cdc41
--- a/src/ply-boot-server.c
46cdc41
+++ b/src/ply-boot-server.c
46cdc41
@@ -197,21 +197,34 @@ ply_boot_connection_on_password_answer (ply_boot_connection_t *connection,
46cdc41
 
46cdc41
   size_t size;
46cdc41
 
46cdc41
-  /* FIXME: support up to 4 billion
46cdc41
+  /* splash plugin isn't able to ask for password,
46cdc41
+   * punt to client
46cdc41
    */
46cdc41
-  if (strlen (password) > 255)
46cdc41
-    ply_error ("password to long to fit in buffer");
46cdc41
-
46cdc41
-  size = (uint8_t) strlen (password);
46cdc41
-
46cdc41
-  if (!ply_write (connection->fd,
46cdc41
-                  PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER,
46cdc41
-                  strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER)) ||
46cdc41
-      !ply_write (connection->fd,
46cdc41
-                  &size, sizeof (uint8_t)) ||
46cdc41
-      !ply_write (connection->fd,
46cdc41
-                  password, size))
46cdc41
-    ply_error ("could not write bytes: %m");
46cdc41
+  if (password == NULL)
46cdc41
+    {
46cdc41
+      if (!ply_write (connection->fd,
46cdc41
+                      PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NO_ANSWER,
46cdc41
+                      strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NO_ANSWER)))
46cdc41
+        ply_error ("could not write bytes: %m");
46cdc41
+    }
46cdc41
+  else
46cdc41
+    {
46cdc41
+      /* FIXME: support up to 4 billion
46cdc41
+      */
46cdc41
+      if (strlen (password) > 255)
46cdc41
+          ply_error ("password to long to fit in buffer");
46cdc41
+
46cdc41
+      size = (uint8_t) strlen (password);
46cdc41
+
46cdc41
+      if (!ply_write (connection->fd,
46cdc41
+                      PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER,
46cdc41
+                      strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER)) ||
46cdc41
+          !ply_write (connection->fd,
46cdc41
+                      &size, sizeof (uint8_t)) ||
46cdc41
+          !ply_write (connection->fd,
46cdc41
+                      password, size))
46cdc41
+          ply_error ("could not write bytes: %m");
46cdc41
+    }
46cdc41
 
46cdc41
   ply_answer_free (answer);
46cdc41
 }
46cdc41
diff --git a/src/ply-boot-splash.c b/src/ply-boot-splash.c
46cdc41
index 8ccaf6c..3fd6331 100644
46cdc41
--- a/src/ply-boot-splash.c
46cdc41
+++ b/src/ply-boot-splash.c
46cdc41
@@ -226,7 +226,7 @@ ply_boot_splash_ask_for_password (ply_boot_splash_t *splash,
46cdc41
 
46cdc41
   if (splash->plugin_interface->ask_for_password == NULL)
46cdc41
     {
46cdc41
-      ply_answer_with_string (answer, "");
46cdc41
+      ply_answer_unknown (answer);
46cdc41
       return;
46cdc41
     }
46cdc41
 
46cdc41
diff --git a/src/splash-plugins/details/plugin.c b/src/splash-plugins/details/plugin.c
46cdc41
index 3bfb14d..ae52b15 100644
46cdc41
--- a/src/splash-plugins/details/plugin.c
46cdc41
+++ b/src/splash-plugins/details/plugin.c
46cdc41
@@ -56,6 +56,10 @@
46cdc41
 #define CLEAR_LINE_SEQUENCE "\033[2K\r\n"
46cdc41
 #define BACKSPACE "\b\033[0K"
46cdc41
 
46cdc41
+void ask_for_password (ply_boot_splash_plugin_t *plugin,
46cdc41
+                       ply_answer_t             *answer);
46cdc41
+
46cdc41
+ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void);
46cdc41
 struct _ply_boot_splash_plugin
46cdc41
 {
46cdc41
   ply_event_loop_t *loop;
46cdc41
@@ -136,17 +140,26 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin,
46cdc41
 
46cdc41
   assert (plugin != NULL);
46cdc41
 
46cdc41
-  ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT);
46cdc41
+  if (window != NULL)
46cdc41
+    {
46cdc41
+      ply_boot_splash_plugin_interface_t *interface;
46cdc41
+
46cdc41
+      ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT);
46cdc41
 
46cdc41
-  ply_window_set_keyboard_input_handler (window,
46cdc41
-                                         (ply_window_keyboard_input_handler_t)
46cdc41
-                                         on_keyboard_input, plugin);
46cdc41
-  ply_window_set_backspace_handler (window,
46cdc41
-                                    (ply_window_backspace_handler_t)
46cdc41
-                                    on_backspace, plugin);
46cdc41
-  ply_window_set_enter_handler (window,
46cdc41
-                                (ply_window_enter_handler_t)
46cdc41
-                                on_enter, plugin);
46cdc41
+      ply_window_set_keyboard_input_handler (window,
46cdc41
+                                             (ply_window_keyboard_input_handler_t)
46cdc41
+                                             on_keyboard_input, plugin);
46cdc41
+      ply_window_set_backspace_handler (window,
46cdc41
+                                        (ply_window_backspace_handler_t)
46cdc41
+                                        on_backspace, plugin);
46cdc41
+      ply_window_set_enter_handler (window,
46cdc41
+                                    (ply_window_enter_handler_t)
46cdc41
+                                    on_enter, plugin);
46cdc41
+
46cdc41
+      interface = ply_boot_splash_plugin_get_interface ();
46cdc41
+
46cdc41
+      interface->ask_for_password = ask_for_password;
46cdc41
+    }
46cdc41
 
46cdc41
   plugin->loop = loop;
46cdc41
 
46cdc41
@@ -223,7 +236,6 @@ ply_boot_splash_plugin_get_interface (void)
46cdc41
       .update_status = update_status,
46cdc41
       .on_boot_output = on_boot_output,
46cdc41
       .hide_splash_screen = hide_splash_screen,
46cdc41
-      .ask_for_password = ask_for_password,
46cdc41
     };
46cdc41
 
46cdc41
   return &plugin_interface;