use super::*;
use crate::syscalls::*;
#[instrument(
level = "trace",
skip_all,
fields(name = field::Empty, full_path = field::Empty, pid = field::Empty, tid = field::Empty, %args_len),
ret)]
pub fn proc_spawn2<M: MemorySize>(
mut ctx: FunctionEnvMut<'_, WasiEnv>,
name: WasmPtr<u8, M>,
name_len: M::Offset,
args: WasmPtr<u8, M>,
args_len: M::Offset,
envs: WasmPtr<u8, M>,
envs_len: M::Offset,
fd_ops: WasmPtr<ProcSpawnFdOp<M>, M>,
fd_ops_len: M::Offset,
signal_actions: WasmPtr<SignalDisposition, M>,
signal_actions_len: M::Offset,
search_path: Bool,
path: WasmPtr<u8, M>,
path_len: M::Offset,
ret: WasmPtr<Pid, M>,
) -> Result<Errno, WasiError> {
WasiEnv::do_pending_operations(&mut ctx)?;
let memory = unsafe { ctx.data().memory_view(&ctx) };
let mut name = unsafe { get_input_str_ok!(&memory, name, name_len) };
Span::current().record("name", name.as_str());
let args = unsafe { get_input_str_ok!(&memory, args, args_len) };
let args = parse_delimited_string_list(&args);
let envs = if !envs.is_null() {
let envs = unsafe { get_input_str_ok!(&memory, envs, envs_len) };
Some(wasi_try_ok!(parse_delimited_env_list(&envs)))
} else {
None
};
let signals = if !signal_actions.is_null() {
let signal_actions = wasi_try_mem_ok!(signal_actions.slice(&memory, signal_actions_len));
let mut vec = Vec::with_capacity(signal_actions.len() as usize);
for s in wasi_try_mem_ok!(signal_actions.access()).iter() {
vec.push(*s);
}
Some(vec)
} else {
None
};
let fd_ops = if !fd_ops.is_null() {
let fd_ops = wasi_try_mem_ok!(fd_ops.slice(&memory, fd_ops_len));
let mut vec = Vec::with_capacity(fd_ops.len() as usize);
for s in wasi_try_mem_ok!(fd_ops.access()).iter() {
vec.push(*s);
}
vec
} else {
vec![]
};
let path = if path.is_null() {
None
} else {
Some(unsafe { get_input_str_ok!(&memory, path, path_len) })
};
proc_spawn3_impl(
ctx,
&mut name,
args,
envs,
fd_ops,
signals,
search_path,
path.as_deref(),
ret,
)
}