]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
Rework how terminals are disconnected from tty
authorRay Strode <rstrode@redhat.com>
Mon, 10 Nov 2008 18:12:20 +0000 (13:12 -0500)
committerRay Strode <rstrode@redhat.com>
Mon, 10 Nov 2008 18:12:20 +0000 (13:12 -0500)
It was causing some problems on hide-splash before
that should be better now.

src/libply/ply-terminal-session.c
src/libply/ply-terminal-session.h
src/main.c

index f7c911bdab8a0bc673771a474ef398592d537346..48496d7c5e95181e123303e3cf37eb84473f856a 100644 (file)
@@ -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 
index 4f54001ff64ec5af91362e8362a9766c270c0bd1..eb858a7167004f681adee1fc08d05eee25fa5804 100644 (file)
@@ -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);
index e8714edffc38e22463f67ba426a29a56627e1e63..10228f32d3a99d9608a85d1d16f7f5056a958dfa 100644 (file)
@@ -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);