mirror of
https://gitlab.freedesktop.org/plymouth/plymouth.git
synced 2026-05-09 04:48:08 +02:00
Add "plymouth --newroot=/sysroot" support, and make --sysinit open the log.
This commit is contained in:
parent
7e85eafab6
commit
620e947711
7 changed files with 69 additions and 9 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
21
src/main.c
21
src/main.c
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue