From: Ray Strode Date: Thu, 6 Nov 2008 15:44:03 +0000 (-0500) Subject: unredirect console messages terminal-session X-Git-Tag: 0.6.0~41^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=faeabda5f4a3eaefe6b8762279919ab9ebb81f11;p=thirdparty%2Fplymouth.git unredirect console messages terminal-session Previously, we did it manually using the ioctl straight from main.c. Now, there's a ply_terminal_session_detach call that does it for us. This allows us to detach from the terminal during --hide-splash, and reattach during --show-splash --- diff --git a/src/libply/ply-terminal-session.c b/src/libply/ply-terminal-session.c index f7c911bd..48496d7c 100644 --- a/src/libply/ply-terminal-session.c +++ b/src/libply/ply-terminal-session.c @@ -48,6 +48,7 @@ struct _ply_terminal_session ply_logger_t *logger; ply_event_loop_t *loop; char **argv; + ply_fd_watch_t *fd_watch; ply_terminal_session_output_handler_t output_handler; ply_terminal_session_done_handler_t done_handler; @@ -337,6 +338,28 @@ ply_terminal_session_attach (ply_terminal_session_t *session, return true; } +void +ply_terminal_session_detach (ply_terminal_session_t *session) +{ + assert (session != NULL); + + ply_trace ("stopping terminal logger"); + + ply_terminal_session_stop_logging (session); + + if (session->console_is_redirected) + { + ply_trace ("unredirecting console messages"); + ply_terminal_session_unredirect_console (session); + } + + session->output_handler = NULL; + session->done_handler = NULL; + session->user_data = NULL; + + session->is_running = false; +} + int ply_terminal_session_get_fd (ply_terminal_session_t *session) { @@ -383,16 +406,22 @@ ply_terminal_session_on_new_data (ply_terminal_session_t *session, static void ply_terminal_session_on_hangup (ply_terminal_session_t *session) { + ply_terminal_session_done_handler_t done_handler; + assert (session != NULL); + done_handler = session->done_handler; + ply_logger_flush (session->logger); session->is_running = false; + ply_terminal_session_stop_logging (session); + session->done_handler = NULL; - if (session->done_handler != NULL) - session->done_handler (session->user_data, session); + if (done_handler != NULL) + done_handler (session->user_data, session); - ply_terminal_session_stop_logging (session); + ply_terminal_session_detach (session); } static void @@ -410,12 +439,14 @@ ply_terminal_session_start_logging (ply_terminal_session_t *session) assert (session_fd >= 0); - ply_event_loop_watch_fd (session->loop, session_fd, - PLY_EVENT_LOOP_FD_STATUS_HAS_DATA, - (ply_event_handler_t) - ply_terminal_session_on_new_data, - (ply_event_handler_t) - ply_terminal_session_on_hangup, session); + session->fd_watch = ply_event_loop_watch_fd (session->loop, + session_fd, + PLY_EVENT_LOOP_FD_STATUS_HAS_DATA, + (ply_event_handler_t) + ply_terminal_session_on_new_data, + (ply_event_handler_t) + ply_terminal_session_on_hangup, + session); } static void @@ -426,6 +457,12 @@ ply_terminal_session_stop_logging (ply_terminal_session_t *session) if (ply_logger_is_logging (session->logger)) ply_logger_toggle_logging (session->logger); + + if (session->loop != NULL && + session->fd_watch != NULL) + ply_event_loop_stop_watching_fd (session->loop, + session->fd_watch); + session->fd_watch = NULL; } bool diff --git a/src/libply/ply-terminal-session.h b/src/libply/ply-terminal-session.h index 4f54001f..eb858a71 100644 --- a/src/libply/ply-terminal-session.h +++ b/src/libply/ply-terminal-session.h @@ -66,6 +66,8 @@ bool ply_terminal_session_attach (ply_terminal_session_t *session, int ptmx, void *user_data); +void ply_terminal_session_detach (ply_terminal_session_t *session); + int ply_terminal_session_get_fd (ply_terminal_session_t *session); bool ply_terminal_session_open_log (ply_terminal_session_t *session, const char *filename); diff --git a/src/main.c b/src/main.c index 7119c72c..ca4ef016 100644 --- a/src/main.c +++ b/src/main.c @@ -76,6 +76,8 @@ static ply_boot_splash_t *start_boot_splash (state_t *state, static ply_window_t *create_window (state_t *state, const char *tty_name); +static bool attach_to_running_session (state_t *state); + static void on_session_output (state_t *state, const char *output, @@ -320,6 +322,9 @@ on_show_splash (state_t *state) { open_windows (state); + if (!state->is_redirected && state->ptmx >= 0) + state->is_redirected = attach_to_running_session (state); + if (plymouth_should_show_default_splash (state)) show_default_splash (state); else @@ -340,14 +345,8 @@ quit_splash (state_t *state) if (state->session != NULL) { - ply_trace ("unredirecting console"); - int fd; - - fd = open ("/dev/console", O_RDWR | O_NOCTTY); - if (fd >= 0) - ioctl (fd, TIOCCONS); - - close (fd); + ply_trace ("detaching session"); + ply_terminal_session_detach (state->session); state->is_redirected = false; } } @@ -533,7 +532,7 @@ start_boot_splash (state_t *state, return splash; } -static ply_terminal_session_t * +static bool attach_to_running_session (state_t *state) { ply_terminal_session_t *session; @@ -547,10 +546,18 @@ attach_to_running_session (state_t *state) if (should_be_redirected) flags |= PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE; - ply_trace ("creating terminal session for current terminal"); - session = ply_terminal_session_new (NULL); - ply_trace ("attaching terminal session to event loop"); - ply_terminal_session_attach_to_event_loop (session, state->loop); + if (state->session == NULL) + { + ply_trace ("creating new terminal session"); + session = ply_terminal_session_new (NULL); + + ply_terminal_session_attach_to_event_loop (session, state->loop); + } + else + { + session = state->session; + ply_trace ("session already created"); + } if (!ply_terminal_session_attach (session, flags, (ply_terminal_session_output_handler_t) @@ -567,12 +574,13 @@ attach_to_running_session (state_t *state) ply_restore_errno (); state->is_redirected = false; - return NULL; + return false; } state->is_redirected = should_be_redirected; + state->session = session; - return session; + return true; } static bool @@ -815,9 +823,7 @@ main (int argc, if (attach_to_session) { - state.session = attach_to_running_session (&state); - - if (state.session == NULL) + if (!attach_to_running_session (&state)) { ply_error ("could not create session: %m"); ply_detach_daemon (daemon_handle, EX_UNAVAILABLE);