Add "plymouth --newroot=/sysroot" support, and make --sysinit open the log.

This commit is contained in:
Peter Jones 2008-06-09 15:40:35 -04:00 committed by Peter Jones
parent 7e85eafab6
commit 620e947711
7 changed files with 69 additions and 9 deletions

View file

@ -444,6 +444,20 @@ ply_boot_client_update_daemon (ply_boot_client_t *client,
status, handler, failed_handler, user_data);
}
void
ply_boot_client_tell_daemon_to_change_root (ply_boot_client_t *client,
const char *root_dir,
ply_boot_client_response_handler_t handler,
ply_boot_client_response_handler_t failed_handler,
void *user_data)
{
assert (client != NULL);
assert (root_dir != NULL);
ply_boot_client_queue_request(client, PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT,
root_dir, handler, failed_handler, user_data);
}
void
ply_boot_client_tell_daemon_system_is_initialized (ply_boot_client_t *client,
ply_boot_client_response_handler_t handler,
@ -578,6 +592,12 @@ on_update_failed (ply_event_loop_t *loop)
ply_event_loop_exit (loop, 1);
}
static void
on_newroot (ply_event_loop_t *loop)
{
printf ("NEWROOT!\n");
}
static void
on_system_initialized (ply_event_loop_t *loop)
{

View file

@ -54,6 +54,11 @@ void ply_boot_client_update_daemon (ply_boot_client_t *client,
ply_boot_client_response_handler_t handler,
ply_boot_client_response_handler_t failed_handler,
void *user_data);
void ply_boot_client_tell_daemon_to_change_root (ply_boot_client_t *client,
const char *chroot_dir,
ply_boot_client_response_handler_t handler,
ply_boot_client_response_handler_t failed_handler,
void *user_data);
void ply_boot_client_ask_daemon_for_password (ply_boot_client_t *client,
ply_boot_client_answer_handler_t handler,
ply_boot_client_response_handler_t failed_handler,

View file

@ -60,7 +60,7 @@ on_disconnect (ply_event_loop_t *loop)
void
print_usage (void)
{
ply_log ("plymouth [--ping] [--update=STATUS] [--show-splash] [--details] [--sysinit] [--quit]");
ply_log ("plymouth [--ping] [--update=STATUS] [--show-splash] [--details] [--newroot=<directory>] [--sysinit] [--quit]");
ply_flush_log ();
}
@ -72,7 +72,7 @@ main (int argc,
ply_boot_client_t *client;
ply_command_parser_t *command_parser;
bool should_help, should_quit, should_ping, should_sysinit, should_ask_for_password, should_show_splash;
char *status;
char *status, *chroot_dir;
int exit_code;
int i;
@ -90,6 +90,7 @@ main (int argc,
ply_command_parser_add_options (command_parser,
"help", "This help message", PLY_COMMAND_OPTION_TYPE_FLAG,
"newroot", "Tell boot daemon that new root filesystem is mounted", PLY_COMMAND_OPTION_TYPE_STRING,
"quit", "Tell boot daemon to quit", PLY_COMMAND_OPTION_TYPE_BOOLEAN,
"sysinit", "Tell boot daemon root filesystem is mounted read-write", PLY_COMMAND_OPTION_TYPE_BOOLEAN,
"show-splash", "Show splash screen", PLY_COMMAND_OPTION_TYPE_BOOLEAN,
@ -111,6 +112,7 @@ main (int argc,
ply_command_parser_get_options (command_parser,
"help", &should_help,
"newroot", &chroot_dir,
"quit", &should_quit,
"sysinit", &should_sysinit,
"show-splash", &should_show_splash,
@ -188,6 +190,12 @@ main (int argc,
on_success,
(ply_boot_client_response_handler_t)
on_failure, loop);
else if (chroot_dir)
ply_boot_client_tell_daemon_to_change_root (client, chroot_dir,
(ply_boot_client_response_handler_t)
on_success,
(ply_boot_client_response_handler_t)
on_failure, loop);
else
return 1;

View file

@ -102,13 +102,21 @@ on_ask_for_password (state_t *state,
ply_boot_splash_ask_for_password (state->boot_splash, answer);
}
static void
on_newroot (state_t *state,
const char *root_dir)
{
ply_trace ("new root mounted, switching to it");
chdir(root_dir);
chroot(".");
}
static void
on_system_initialized (state_t *state)
{
ply_trace ("system now initialized, preparing for root filesystem switch");
chdir("/sysroot");
chroot(".");
ply_trace ("system now initialized, opening boot.log");
ply_terminal_session_open_log (state->session,
"/var/log/boot.log");
}
static void
@ -133,9 +141,7 @@ on_show_splash (state_t *state)
static void
on_quit (state_t *state)
{
ply_trace ("time to quit, writing boot.log");
ply_terminal_session_open_log (state->session,
"/var/log/boot.log");
ply_trace ("time to quit, closing boot.log");
ply_terminal_session_close_log (state->session);
ply_trace ("hiding splash");
if (state->boot_splash != NULL)
@ -152,6 +158,7 @@ start_boot_server (state_t *state)
server = ply_boot_server_new ((ply_boot_server_update_handler_t) on_update,
(ply_boot_server_ask_for_password_handler_t) on_ask_for_password,
(ply_boot_server_show_splash_handler_t) on_show_splash,
(ply_boot_server_newroot_handler_t) on_newroot,
(ply_boot_server_system_initialized_handler_t) on_system_initialized,
(ply_boot_server_quit_handler_t) on_quit,
state);

View file

@ -29,6 +29,7 @@
#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_QUIT "Q"
#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_PASSWORD "*"
#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH "$"
#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT "R"
#define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK "\x6"
#define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK "\x15"
#define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ANSWER "\x2"

View file

@ -50,6 +50,7 @@ struct _ply_boot_server
int socket_fd;
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_show_splash_handler_t show_splash_handler;
ply_boot_server_ask_for_password_handler_t ask_for_password_handler;
@ -63,6 +64,7 @@ ply_boot_server_t *
ply_boot_server_new (ply_boot_server_update_handler_t update_handler,
ply_boot_server_ask_for_password_handler_t ask_for_password_handler,
ply_boot_server_show_splash_handler_t show_splash_handler,
ply_boot_server_newroot_handler_t newroot_handler,
ply_boot_server_system_initialized_handler_t initialized_handler,
ply_boot_server_quit_handler_t quit_handler,
void *user_data)
@ -272,6 +274,11 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection)
*/
return;
}
else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT) != 0)
{
if (server->newroot_handler != NULL)
server->newroot_handler(server->user_data, argument, server);
}
else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PING) != 0)
{
ply_error ("received unknown command '%s' from client", command);
@ -388,6 +395,12 @@ on_update (ply_event_loop_t *loop,
printf ("new status is '%s'\n", status);
}
static void
on_newroot (ply_event_loop_t *loop)
{
printf ("got newroot request\n");
}
static void
on_system_initialized (ply_event_loop_t *loop)
{
@ -430,6 +443,7 @@ main (int argc,
server = ply_boot_server_new ((ply_boot_server_update_handler_t) on_update,
(ply_boot_server_ask_for_password_handler_t) on_ask_for_password,
(ply_boot_server_show_splash_handler_t) on_show_splash,
(ply_boot_server_newroot_handler_t) on_newroot,
(ply_boot_server_system_initialized_handler_t) on_system_initialized,
(ply_boot_server_quit_handler_t) on_quit,
loop);

View file

@ -36,6 +36,10 @@ typedef void (* ply_boot_server_update_handler_t) (void *user_data,
const char *status,
ply_boot_server_t *server);
typedef void (* ply_boot_server_newroot_handler_t) (void *user_data,
const char *root_dir,
ply_boot_server_t *server);
typedef void (* ply_boot_server_show_splash_handler_t) (void *user_data,
ply_boot_server_t *server);
@ -56,6 +60,7 @@ typedef void (* ply_boot_server_quit_handler_t) (void *user_data,
ply_boot_server_t *ply_boot_server_new (ply_boot_server_update_handler_t update_handler,
ply_boot_server_ask_for_password_handler_t ask_for_password_handler,
ply_boot_server_show_splash_handler_t show_splash_handler,
ply_boot_server_newroot_handler_t newroot_handler,
ply_boot_server_system_initialized_handler_t initialized_handler,
ply_boot_server_quit_handler_t quit_handler,
void *user_data);