Skip to content

Commit cedb4bf

Browse files
authored
Merge pull request #37 from cgwalters/install-prep2
reexec: Generalize a bit
2 parents a587c43 + 58737cd commit cedb4bf

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

lib/src/cli.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ pub(crate) async fn ensure_self_unshared_mount_namespace() -> Result<()> {
128128
anyhow::bail!("Failed to unshare mount namespace");
129129
}
130130
}
131-
crate::reexec::reexec_with_guardenv(recurse_env)
131+
crate::reexec::reexec_with_guardenv(recurse_env, &["unshare", "-m", "--"])
132132
}
133133

134134
/// Acquire a locked sysroot.

lib/src/reexec.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
use std::os::unix::process::CommandExt;
2+
use std::process::Command;
23

34
use anyhow::Result;
45
use fn_error_context::context;
56

67
/// Re-execute the current process if the provided environment variable is not set.
78
#[context("Reexec self")]
8-
pub(crate) fn reexec_with_guardenv(k: &str) -> Result<()> {
9+
pub(crate) fn reexec_with_guardenv(k: &str, prefix_args: &[&str]) -> Result<()> {
910
if std::env::var_os(k).is_some() {
1011
return Ok(());
1112
}
1213
let self_exe = std::fs::read_link("/proc/self/exe")?;
13-
let mut cmd = std::process::Command::new("unshare");
14+
let mut prefix_args = prefix_args.iter();
15+
let mut cmd = if let Some(p) = prefix_args.next() {
16+
let mut c = Command::new(p);
17+
c.args(prefix_args);
18+
c.arg(self_exe);
19+
c
20+
} else {
21+
Command::new(self_exe)
22+
};
1423
cmd.env(k, "1");
15-
cmd.args(["-m", "--"])
16-
.arg(self_exe)
17-
.args(std::env::args_os().skip(1));
24+
cmd.args(std::env::args_os().skip(1));
1825
Err(cmd.exec().into())
1926
}

0 commit comments

Comments
 (0)