]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
unredirect console messages terminal-session
authorRay Strode <rstrode@redhat.com>
Thu, 6 Nov 2008 15:44:03 +0000 (10:44 -0500)
committerRay Strode <rstrode@redhat.com>
Thu, 6 Nov 2008 15:44:03 +0000 (10:44 -0500)
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

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 7119c72c1e58112975e271e021eae423e04f0d27..ca4ef0168d570a405515e399c86340d73dc1f78a 100644 (file)
@@ -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);