wasmer_wasix/syscalls/wasi/
environ_get.rs

1use super::*;
2use crate::{journal::SnapshotTrigger, syscalls::*};
3
4/// ### `environ_get()`
5/// Read environment variable data.
6/// The sizes of the buffers should match that returned by [`environ_sizes_get()`](#environ_sizes_get).
7/// Inputs:
8/// - `char **environ`
9///     A pointer to a buffer to write the environment variable pointers.
10/// - `char *environ_buf`
11///     A pointer to a buffer to write the environment variable string data.
12#[instrument(level = "trace", skip_all, ret)]
13pub fn environ_get<M: MemorySize>(
14    mut ctx: FunctionEnvMut<'_, WasiEnv>,
15    environ: WasmPtr<WasmPtr<u8, M>, M>,
16    environ_buf: WasmPtr<u8, M>,
17) -> Result<Errno, WasiError> {
18    ctx = wasi_try_ok!(maybe_snapshot_once::<M>(
19        ctx,
20        SnapshotTrigger::FirstEnviron
21    )?);
22
23    let env = ctx.data();
24    let (memory, mut state) = unsafe { env.get_memory_and_wasi_state(&ctx, 0) };
25
26    let envs = state.envs.lock().unwrap();
27    Ok(write_buffer_array(&memory, &envs, environ, environ_buf))
28}