]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
if an error happens during boot up spool it for the viewer
authorRay Strode <rstrode@redhat.com>
Tue, 12 Aug 2008 21:16:43 +0000 (17:16 -0400)
committerRay Strode <rstrode@redhat.com>
Tue, 12 Aug 2008 21:16:43 +0000 (17:16 -0400)
We store a link to the boot log in /var/spool/plymouth so that
the viewer can detect if boot up failed.  It will do this by
checking if /var/log/boot.log and /var/spool/plymouth/boot.log
are the same file

src/Makefile.am
src/client/ply-boot-client.c
src/client/ply-boot-client.h
src/client/plymouth.c
src/libply/ply-terminal-session.c
src/libply/ply-utils.c
src/libply/ply-utils.h
src/main.c
src/ply-boot-protocol.h
src/ply-boot-server.c
src/ply-boot-server.h

index 9c046ac5cf6d005b4f8bde0eeafefd78a38d35f1..811a7a1fc2940575cba3a2f38b53a09748f722fa 100644 (file)
@@ -4,6 +4,7 @@ INCLUDES = -I$(top_srcdir)                                                    \
            -I$(srcdir)/libplybootsplash                                       \
            -I$(srcdir)                                                        \
            -DPLYMOUTH_LOG_DIRECTORY=\"$(localstatedir)/log\"                  \
+           -DPLYMOUTH_SPOOL_DIRECTORY=\"$(localstatedir)/spool/plymouth\"     \
            -DPLYMOUTH_LOGO_FILE=\"$(logofile)\"
 
 plymouthdbindir = $(libexecdir)/plymouth
@@ -20,12 +21,14 @@ plymouthd_SOURCES =                                                            \
                    main.c
 
 plymouthdrundir = $(localstatedir)/run/plymouth
+plymouthdspooldir = $(localstatedir)/spool/plymouth
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = plymouth-1.pc
 
 install-data-hook:
        -mkdir -p $(DESTDIR)$(plymouthdrundir)
+       -mkdir -p $(DESTDIR)$(plymouthdspooldir)
 
 EXTRA_DIST = plymouth-1.pc.in
 MAINTAINERCLEANFILES = Makefile.in
index b0c444ddf55c9e06043e2082e3a0fe76bd85b2c4..2b1d075ae33e0bde4906396e6f43ecbc43abef4e 100644 (file)
@@ -539,6 +539,16 @@ ply_boot_client_tell_daemon_to_quit (ply_boot_client_t                  *client,
                                  NULL, handler, failed_handler, user_data);
 }
 
+void
+ply_boot_client_tell_daemon_about_error (ply_boot_client_t                  *client,
+                                         ply_boot_client_response_handler_t  handler,
+                                         ply_boot_client_response_handler_t  failed_handler,
+                                         void                               *user_data)
+{
+  ply_boot_client_queue_request (client, PLY_BOOT_PROTOCOL_REQUEST_TYPE_ERROR,
+                                 NULL, handler, failed_handler, user_data);
+}
+
 void
 ply_boot_client_disconnect (ply_boot_client_t *client)
 {
index 1f5a18d8d77c20b3ba6d6b8e1b7ddc2d0703bf72..c14c7539e9ac47056bef25578d91bc3761203cdd 100644 (file)
@@ -83,6 +83,10 @@ void ply_boot_client_tell_daemon_to_quit (ply_boot_client_t                  *cl
 void ply_boot_client_disconnect (ply_boot_client_t *client);
 void ply_boot_client_attach_to_event_loop (ply_boot_client_t *client,
                                            ply_event_loop_t  *loop);
+void ply_boot_client_tell_daemon_about_error (ply_boot_client_t                  *client,
+                                              ply_boot_client_response_handler_t  handler,
+                                              ply_boot_client_response_handler_t  failed_handler,
+                                              void                               *user_data);
 
 #endif
 
index 3b417cdd0c40f70b4474f26f57c990406185bc07..c343378710da347f9faa878edd9bc4aba72ed56c 100644 (file)
@@ -239,7 +239,7 @@ main (int    argc,
       char **argv)
 {
   state_t state = { 0 };
-  bool should_help, should_quit, should_ping, should_sysinit, should_ask_for_password, should_show_splash, should_hide_splash, should_wait, should_be_verbose;
+  bool should_help, should_quit, should_ping, should_sysinit, should_ask_for_password, should_show_splash, should_hide_splash, should_wait, should_be_verbose, report_error;
   char *status, *chroot_dir;
   int exit_code;
 
@@ -262,6 +262,7 @@ main (int    argc,
                                   "hide-splash", "Hide splash screen", PLY_COMMAND_OPTION_TYPE_FLAG,
                                   "ask-for-password", "Ask user for password", PLY_COMMAND_OPTION_TYPE_FLAG,
                                   "update", "Tell boot daemon an update about boot progress", PLY_COMMAND_OPTION_TYPE_STRING,
+                                  "details", "Tell boot daemon there were errors during boot", PLY_COMMAND_OPTION_TYPE_FLAG,
                                   "wait", "Wait for boot daemon to quit", PLY_COMMAND_OPTION_TYPE_FLAG,
                                   NULL);
 
@@ -296,6 +297,7 @@ main (int    argc,
                                   "ask-for-password", &should_ask_for_password,
                                   "update", &status,
                                   "wait", &should_wait,
+                                  "details", &report_error,
                                   NULL);
 
   if (should_help || argc < 2)
@@ -391,8 +393,15 @@ main (int    argc,
                                    on_success,
                                    (ply_boot_client_response_handler_t)
                                    on_failure, &state);
+
   else if (should_wait)
     {} // Do nothing
+  else if (report_error)
+    ply_boot_client_tell_daemon_about_error (state.client,
+                                             (ply_boot_client_response_handler_t)
+                                             on_success,
+                                             (ply_boot_client_response_handler_t)
+                                             on_failure, &state);
 
   exit_code = ply_event_loop_run (state.loop);
 
index 95ab0dd79a9f1ead57ee5d75e93eb0770216825c..24e532b0ab43516923f36a60ca5b3181430997c5 100644 (file)
@@ -438,6 +438,7 @@ ply_terminal_session_open_log (ply_terminal_session_t *session,
   assert (session->logger != NULL);
 
   ply_save_errno ();
+  unlink (filename);
   log_is_opened = ply_logger_open_file (session->logger, filename, true);
   if (log_is_opened)
     ply_logger_flush (session->logger);
index d64c8ba743530c50d7c2bb8c99abc67f0b6d78b1..a8e428487284984b2b87775a5da3b82e23bb5230 100644 (file)
@@ -751,6 +751,16 @@ ply_create_directory (const char *directory)
   return true;
 }
 
+bool
+ply_create_file_link (const char *source,
+                      const char *destination)
+{
+  if (link (source, destination) < 0)
+    return false;
+
+  return true;
+}
+
 ply_daemon_handle_t *
 ply_create_daemon (void)
 {
index 0af3f29745fd4ea0d6356f9fdd7cb78c41e68023..96fded8f6a069ea3dbf0aba3d0781dba00e08087 100644 (file)
@@ -83,6 +83,8 @@ ply_module_function_t ply_module_look_up_function (ply_module_handle_t *handle,
 void ply_close_module (ply_module_handle_t *handle);
 
 bool ply_create_directory (const char *directory);
+bool ply_create_file_link (const char *source,
+                           const char *destination);
 
 ply_daemon_handle_t *ply_create_daemon (void);
 bool ply_detach_daemon (ply_daemon_handle_t *handle,
index 0325efb5d247d340d0f650bd1b8ddb33d86ed57c..0fa6d6b7017bbc215fe125d04b32c458ed06bb59 100644 (file)
@@ -58,6 +58,9 @@ typedef struct
 
   char kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
   uint32_t showing_details : 1;
+  uint32_t system_initialized : 1;
+
+  int number_of_errors;
 } state_t;
 
 static ply_boot_splash_t *start_boot_splash (state_t    *state,
@@ -153,12 +156,40 @@ on_newroot (state_t    *state,
   chdir("/");
 }
 
+static void
+spool_error (state_t *state)
+{
+  ply_trace ("spooling error for viewer");
+
+  unlink (PLYMOUTH_SPOOL_DIRECTORY "boot.log");
+
+  ply_create_file_link (PLYMOUTH_LOG_DIRECTORY "/boot.log",
+                        PLYMOUTH_SPOOL_DIRECTORY "/boot.log");
+}
+
 static void
 on_system_initialized (state_t *state)
 {
   ply_trace ("system now initialized, opening boot.log");
+  state->system_initialized = true;
   ply_terminal_session_open_log (state->session,
                                  PLYMOUTH_LOG_DIRECTORY "/boot.log");
+
+  if (state->number_of_errors > 0)
+    spool_error (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
@@ -268,6 +299,7 @@ start_boot_server (state_t *state)
                                 (ply_boot_server_hide_splash_handler_t) on_hide_splash,
                                 (ply_boot_server_newroot_handler_t) on_newroot,
                                 (ply_boot_server_system_initialized_handler_t) on_system_initialized,
+                                (ply_boot_server_error_handler_t) on_error,
                                 (ply_boot_server_quit_handler_t) on_quit,
                                 state);
 
index e8af75a2597949584236751558b4138617993d17..594064a9810635f7b4cb7dbc5fdb1309b9473b91 100644 (file)
@@ -31,6 +31,7 @@
 #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH "$"
 #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_HIDE_SPLASH "H"
 #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT "R"
+#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_ERROR "!"
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK "\x6"
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK "\x15"
 #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER "\x2"
index c161ae7abb3839b067482044199fcbdfc0fac13a..29f402ed2b117496fd3435e905f18a9902612b23 100644 (file)
@@ -52,6 +52,7 @@ struct _ply_boot_server
   ply_boot_server_update_handler_t update_handler;
   ply_boot_server_newroot_handler_t newroot_handler;
   ply_boot_server_system_initialized_handler_t system_initialized_handler;
+  ply_boot_server_error_handler_t error_handler;
   ply_boot_server_show_splash_handler_t show_splash_handler;
   ply_boot_server_hide_splash_handler_t hide_splash_handler;
   ply_boot_server_ask_for_password_handler_t ask_for_password_handler;
@@ -68,6 +69,7 @@ ply_boot_server_new (ply_boot_server_update_handler_t  update_handler,
                      ply_boot_server_hide_splash_handler_t hide_splash_handler,
                      ply_boot_server_newroot_handler_t newroot_handler,
                      ply_boot_server_system_initialized_handler_t initialized_handler,
+                     ply_boot_server_error_handler_t   error_handler,
                      ply_boot_server_quit_handler_t    quit_handler,
                      void                             *user_data)
 {
@@ -80,6 +82,7 @@ ply_boot_server_new (ply_boot_server_update_handler_t  update_handler,
   server->update_handler = update_handler;
   server->ask_for_password_handler = ask_for_password_handler;
   server->newroot_handler = newroot_handler;
+  server->error_handler = error_handler;
   server->system_initialized_handler = initialized_handler;
   server->show_splash_handler = show_splash_handler;
   server->hide_splash_handler = hide_splash_handler;
@@ -251,6 +254,11 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection)
       if (server->system_initialized_handler != NULL)
         server->system_initialized_handler (server->user_data, server);
     }
+  else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_ERROR) == 0)
+    {
+      if (server->error_handler != NULL)
+        server->error_handler (server->user_data, server);
+    }
   else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH) == 0)
     {
       ply_trace ("got show splash request");
index eccef5c38329de279fc4f3a958aed1a4d9863c36..9550ffe0f446573deba85ca5de6051fbc1828588 100644 (file)
@@ -56,6 +56,9 @@ typedef void (* ply_boot_server_ask_for_password_handler_t) (void              *
 typedef void (* ply_boot_server_system_initialized_handler_t) (void              *user_data,
                                                         ply_boot_server_t *server);
 
+typedef void (* ply_boot_server_error_handler_t) (void              *user_data,
+                                                  ply_boot_server_t *server);
+
 typedef void (* ply_boot_server_quit_handler_t) (void              *user_data,
                                                  ply_boot_server_t *server);
 
@@ -66,6 +69,7 @@ ply_boot_server_t *ply_boot_server_new (ply_boot_server_update_handler_t update_
                                         ply_boot_server_hide_splash_handler_t hide_splash_handler,
                                         ply_boot_server_newroot_handler_t newroot_handler,
                                         ply_boot_server_system_initialized_handler_t initialized_handler,
+                                        ply_boot_server_error_handler_t error_handler,
                                         ply_boot_server_quit_handler_t quit_handler,
                                         void                        *user_data);