wasmer_wasix/syscalls/wasi/
environ_sizes_get.rs

1use super::*;
2use crate::{journal::SnapshotTrigger, syscalls::*};
3
4/// ### `environ_sizes_get()`
5/// Return command-line argument data sizes.
6/// Outputs:
7/// - `size_t *environ_count`
8///     The number of environment variables.
9/// - `size_t *environ_buf_size`
10///     The size of the environment variable string data.
11#[instrument(level = "trace", skip_all, ret)]
12pub fn environ_sizes_get<M: MemorySize>(
13    mut ctx: FunctionEnvMut<'_, WasiEnv>,
14    environ_count: WasmPtr<M::Offset, M>,
15    environ_buf_size: WasmPtr<M::Offset, M>,
16) -> Result<Errno, WasiError> {
17    ctx = wasi_try_ok!(maybe_snapshot_once::<M>(
18        ctx,
19        SnapshotTrigger::FirstEnviron
20    )?);
21
22    let env = ctx.data();
23    let (memory, mut state) = unsafe { env.get_memory_and_wasi_state(&ctx, 0) };
24
25    let environ_count = environ_count.deref(&memory);
26    let environ_buf_size = environ_buf_size.deref(&memory);
27
28    let env_var_count: M::Offset = wasi_try_ok!(
29        state
30            .envs
31            .lock()
32            .unwrap()
33            .len()
34            .try_into()
35            .map_err(|_| Errno::Overflow)
36    );
37    let env_buf_size: usize = state.envs.lock().unwrap().iter().map(|v| v.len() + 1).sum();
38    let env_buf_size: M::Offset =
39        wasi_try_ok!(env_buf_size.try_into().map_err(|_| Errno::Overflow));
40    wasi_try_mem_ok!(environ_count.write(env_var_count));
41    wasi_try_mem_ok!(environ_buf_size.write(env_buf_size));
42
43    trace!(
44        %env_var_count,
45        %env_buf_size
46    );
47
48    Ok(Errno::Success)
49}