-I$(srcdir)/libplybootsplash \
-I$(srcdir) \
-DPLYMOUTH_LOG_DIRECTORY=\"$(localstatedir)/log\" \
+ -DPLYMOUTH_SPOOL_DIRECTORY=\"$(localstatedir)/spool/plymouth\" \
-DPLYMOUTH_LOGO_FILE=\"$(logofile)\"
plymouthdbindir = $(libexecdir)/plymouth
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
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)
{
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
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;
"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);
"ask-for-password", &should_ask_for_password,
"update", &status,
"wait", &should_wait,
+ "details", &report_error,
NULL);
if (should_help || argc < 2)
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);
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);
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)
{
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,
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,
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
(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);
#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"
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;
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)
{
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;
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");
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);
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);