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,
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)
{
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,
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 ();
}
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;
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,
ply_command_parser_get_options (command_parser,
"help", &should_help,
+ "newroot", &chroot_dir,
"quit", &should_quit,
"sysinit", &should_sysinit,
"show-splash", &should_show_splash,
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;
}
static void
-on_system_initialized (state_t *state)
+on_newroot (state_t *state,
+ const char *root_dir)
{
-
- ply_trace ("system now initialized, preparing for root filesystem switch");
- chdir("/sysroot");
+ 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, opening boot.log");
+ ply_terminal_session_open_log (state->session,
+ "/var/log/boot.log");
+}
+
static void
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)
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);
#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"
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;
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)
*/
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);
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)
{
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);
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);
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);