From: Ray Strode Date: Mon, 10 Nov 2008 18:12:20 +0000 (-0500) Subject: Rework how terminals are disconnected from tty X-Git-Tag: 0.6.0~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=283d8d09772d5838852f690442b468643f479f2f;p=thirdparty%2Fplymouth.git Rework how terminals are disconnected from tty It was causing some problems on hide-splash before that should be better now. --- 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 e8714edf..10228f32 100644 --- a/src/main.c +++ b/src/main.c @@ -369,14 +369,9 @@ 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; } } @@ -385,6 +380,8 @@ on_hide_splash (state_t *state) { ply_trace ("hiding boot splash"); + state->showing_details = false; + on_escape_pressed (state); if (state->boot_splash != NULL) ply_boot_splash_hide (state->boot_splash); @@ -413,11 +410,12 @@ on_quit (state_t *state, if (state->boot_splash != NULL) { if (!retain_splash) - on_hide_splash (state); - else - quit_splash (state); - ply_boot_splash_free (state->boot_splash); - state->boot_splash = NULL; + { + if (state->boot_splash != NULL) + ply_boot_splash_hide (state->boot_splash); + } + + quit_splash (state); } ply_trace ("exiting event loop"); ply_event_loop_exit (state->loop, 0); @@ -561,27 +559,38 @@ 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; ply_terminal_session_flags_t flags; + bool should_be_redirected; flags = 0; - if (!state->no_boot_log) + should_be_redirected = !state->no_boot_log; + + 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) on_session_output, (ply_terminal_session_done_handler_t) - (state->no_boot_log? NULL: on_session_finished), + (should_be_redirected? on_session_finished: NULL), state->ptmx, state)) { @@ -847,9 +856,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);