aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olv@google.com>2022-01-14 20:39:00 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-01-14 20:39:00 +0000
commit6419688b47b479e47469e618e1e1729321915e9f (patch)
treee787c8e5b8dbf6dc15381e7a20d917cb1351cde7
parent805867ceb3873da223dee7fbc06e109e892aabd7 (diff)
parent4c0e6014ab731ee2efcbf840041c8d40abff2727 (diff)
downloadminijail-6419688b47b479e47469e618e1e1729321915e9f.tar.gz
rust/minijail: add Minijail::run_command am: 4170a270c9 am: 4c0e6014ab
Original change: https://android-review.googlesource.com/c/platform/external/minijail/+/1947197 Change-Id: I551199edebef18ec81391f757af0de0bb9fe1f18
-rw-r--r--rust/minijail/src/lib.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/rust/minijail/src/lib.rs b/rust/minijail/src/lib.rs
index d55c735..000bba3 100644
--- a/rust/minijail/src/lib.rs
+++ b/rust/minijail/src/lib.rs
@@ -21,7 +21,7 @@ enum Program {
}
/// Configuration of a command to be run in a jail.
-struct Command {
+pub struct Command {
program: Program,
preserve_fds: Vec<(RawFd, RawFd)>,
@@ -35,6 +35,24 @@ struct Command {
}
impl Command {
+ /// This exposes a subset of what Command can do, before we are ready to commit to a stable
+ /// API.
+ pub fn new_for_path<P: AsRef<Path>, S: AsRef<str>, A: AsRef<str>>(
+ path: P,
+ keep_fds: &[RawFd],
+ args: &[S],
+ env_vars: Option<&[A]>,
+ ) -> Result<Command> {
+ let mut cmd = Command::new(Program::Filename(path.as_ref().to_path_buf()))
+ .keep_fds(keep_fds)
+ .args(args)?;
+ if let Some(env_vars) = env_vars {
+ cmd = cmd.envs(env_vars)?;
+ }
+
+ Ok(cmd)
+ }
+
fn new(program: Program) -> Command {
Command {
program,
@@ -847,6 +865,11 @@ impl Minijail {
)
}
+ /// A generic version of `run()` that is a super set of all variants.
+ pub fn run_command(&self, cmd: Command) -> Result<pid_t> {
+ self.run_internal(cmd)
+ }
+
fn run_internal(&self, cmd: Command) -> Result<pid_t> {
for (src_fd, dst_fd) in cmd.preserve_fds.iter() {
let ret = unsafe { minijail_preserve_fd(self.jail, *src_fd, *dst_fd) };