summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-10-21 19:49:44 -0400
committerRay Strode <rstrode@redhat.com>2007-10-21 19:49:44 -0400
commit431924effec5a2d028e08bf1d12be631ffafb26d (patch)
tree7193bf78e5117774203f91f2092305980c3bd28b /src
parent78302f06c38f4ada1100fee6a2f319a194f7c2ad (diff)
downloadplymouth-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.c11
-rw-r--r--src/libply/ply-terminal-session.h3
-rw-r--r--src/main.c9
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
diff --git a/src/main.c b/src/main.c
index e6feebc..3cc75ee 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);