diff options
| author | Ray Strode <rstrode@redhat.com> | 2007-10-21 19:49:44 -0400 |
|---|---|---|
| committer | Ray Strode <rstrode@redhat.com> | 2007-10-21 19:49:44 -0400 |
| commit | 431924effec5a2d028e08bf1d12be631ffafb26d (patch) | |
| tree | 7193bf78e5117774203f91f2092305980c3bd28b /src | |
| parent | 78302f06c38f4ada1100fee6a2f319a194f7c2ad (diff) | |
| download | plymouth-431924effec5a2d028e08bf1d12be631ffafb26d.tar.gz plymouth-431924effec5a2d028e08bf1d12be631ffafb26d.tar.xz plymouth-431924effec5a2d028e08bf1d12be631ffafb26d.zip | |
call chroot right before exec instead of right after fork
This is because we still need access to /dev/pts/1 until
right before exec
Diffstat (limited to 'src')
| -rw-r--r-- | src/libply/ply-terminal-session.c | 11 | ||||
| -rw-r--r-- | src/libply/ply-terminal-session.h | 3 | ||||
| -rw-r--r-- | src/main.c | 9 |
3 files changed, 14 insertions, 9 deletions
diff --git a/src/libply/ply-terminal-session.c b/src/libply/ply-terminal-session.c index c0a71c8..f0dc4e7 100644 --- a/src/libply/ply-terminal-session.c +++ b/src/libply/ply-terminal-session.c @@ -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; diff --git a/src/libply/ply-terminal-session.h b/src/libply/ply-terminal-session.h index 8d474ea..d30d436 100644 --- a/src/libply/ply-terminal-session.h +++ b/src/libply/ply-terminal-session.h @@ -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 @@ -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); |
