]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
call chroot right before exec instead of right after fork
authorRay Strode <rstrode@redhat.com>
Sun, 21 Oct 2007 23:49:44 +0000 (19:49 -0400)
committerRay Strode <rstrode@redhat.com>
Sun, 21 Oct 2007 23:49:44 +0000 (19:49 -0400)
This is because we still need access to /dev/pts/1 until
right before exec

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

index c0a71c8f5f87009bd05821b2556aab4840fecbdd..f0dc4e78f4636cf9664b8a4ecfa8149d289883e6 100644 (file)
@@ -54,6 +54,7 @@ struct _ply_terminal_session
 
   uint32_t is_running : 1;
   uint32_t console_is_redirected : 1;
+  uint32_t change_root_to_current_directory : 1;
 };
 
 static bool ply_terminal_session_open_console (ply_terminal_session_t *session);
@@ -109,6 +110,12 @@ ply_terminal_session_execute (ply_terminal_session_t *session,
   if (!ply_terminal_session_open_console (session))
     return false;
 
+  if (session->change_root_to_current_directory)
+    {
+      if (chroot (".") < 0)
+        return false;
+    }
+
   if (look_in_path)
     execvp (session->argv[0], session->argv);
   else
@@ -132,6 +139,7 @@ ply_terminal_session_new (const char * const *argv)
   session->logger = ply_logger_new ();
   session->is_running = false;
   session->console_is_redirected = false;
+  session->change_root_to_current_directory = false;
 
   return session;
 }
@@ -237,6 +245,9 @@ ply_terminal_session_run (ply_terminal_session_t              *session,
   should_redirect_console = 
     (flags & PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE) != 0;
 
+  session->change_root_to_current_directory = 
+    (flags & PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY) != 0;
+
   ply_trace ("creating terminal device");
   if (!ply_terminal_create_device (session->terminal))
     return false;
index 8d474eae4ebe28a6f14ee73c2e92a415b6abdb9a..d30d4366c83c363f44a97978d31898a928a6b136 100644 (file)
@@ -41,7 +41,8 @@ typedef enum
   PLY_TERMINAL_SESSION_FLAGS_NONE = 0x0,
   PLY_TERMINAL_SESSION_FLAGS_RUN_IN_PARENT = 0x1,
   PLY_TERMINAL_SESSION_FLAGS_LOOK_IN_PATH = 0x2,
-  PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE = 0x4
+  PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE = 0x4,
+  PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY = 0x8,
 } ply_terminal_session_flags_t;
 
 #ifndef PLY_HIDE_FUNCTION_DECLARATIONS
index e6feebc29a7e01f0f49277979095371719969ea4..3cc75ee3e2e27db63d240be418d1815cd01f01e2 100644 (file)
@@ -62,14 +62,6 @@ on_session_start (state_t *state)
                  "to start session: %m");
       return;
     }
-
-  if (chroot (".") < 0)
-    {
-      ply_trace ("Could not change root back to original directory "
-                 "to start session: %m");
-      return;
-    }
-  ply_trace ("changed to original root fs");
 }
 
 static void
@@ -165,6 +157,7 @@ spawn_session (state_t  *state,
   flags |= PLY_TERMINAL_SESSION_FLAGS_RUN_IN_PARENT;
   flags |= PLY_TERMINAL_SESSION_FLAGS_LOOK_IN_PATH;
   flags |= PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE;
+  flags |= PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY;
 
   ply_trace ("opening terminal session for '%s'", argv[0]);
   session = ply_terminal_session_new ((const char * const *) argv);