use std::process::Command;
use crate::VmError;
use super::backend::ActiveBackend;
use super::{active_sandbox_policy, build_std_command, build_tokio_command, process_output};
macro_rules! close_env_for_session {
($command:expr, $program:expr) => {
if let Some(env) =
crate::stdlib::process::session_closed_env_for_command($program, std::iter::empty())?
{
$command.env_clear();
for (key, value) in env {
$command.env(key, value);
}
true
} else {
false
}
};
}
pub fn std_command_for(program: &str, args: &[String]) -> Result<Command, VmError> {
std_command_for_with_env_state(program, args).map(|(command, _)| command)
}
pub fn std_command_for_with_env_state(
program: &str,
args: &[String],
) -> Result<(Command, bool), VmError> {
let resolved_program = crate::stdlib::process::resolve_program_path_for_spawn(program);
let active = active_sandbox_policy();
let mut command = match active.as_ref() {
Some((policy, profile)) => {
build_std_command::<ActiveBackend>(&resolved_program, args, policy, *profile)?
}
None => {
let mut command = Command::new(&resolved_program);
command.args(args);
command
}
};
let env_closed = close_env_for_session!(command, program);
if let Some(proxy) = active.and_then(|(policy, _)| policy.process_network_proxy) {
process_output::apply_managed_proxy_env(&mut command, proxy);
}
Ok((command, env_closed))
}
pub fn tokio_command_for(
program: &str,
args: &[String],
) -> Result<tokio::process::Command, VmError> {
let resolved_program = crate::stdlib::process::resolve_program_path_for_spawn(program);
let active = active_sandbox_policy();
let mut command = match active.as_ref() {
Some((policy, profile)) => {
build_tokio_command::<ActiveBackend>(&resolved_program, args, policy, *profile)?
}
None => {
let mut command = tokio::process::Command::new(&resolved_program);
command.args(args);
command
}
};
close_env_for_session!(command, program);
if let Some(proxy) = active.and_then(|(policy, _)| policy.process_network_proxy) {
process_output::apply_managed_proxy_env_tokio(&mut command, proxy);
}
Ok(command)
}