wasmer_wasix/syscalls/wasi/
args_sizes_get.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `args_sizes_get()`
5/// Return command-line argument data sizes.
6/// Outputs:
7/// - `size_t *argc`
8///     The number of arguments.
9/// - `size_t *argv_buf_size`
10///     The size of the argument string data.
11#[instrument(level = "trace", skip_all, ret)]
12pub fn args_sizes_get<M: MemorySize>(
13    mut ctx: FunctionEnvMut<'_, WasiEnv>,
14    argc: WasmPtr<M::Offset, M>,
15    argv_buf_size: WasmPtr<M::Offset, M>,
16) -> Errno {
17    let env = ctx.data();
18    let (memory, mut state) = unsafe { env.get_memory_and_wasi_state(&ctx, 0) };
19
20    let argc = argc.deref(&memory);
21    let argv_buf_size = argv_buf_size.deref(&memory);
22
23    let argc_val: M::Offset = wasi_try!(
24        state
25            .args
26            .lock()
27            .unwrap()
28            .len()
29            .try_into()
30            .map_err(|_| Errno::Overflow)
31    );
32    let argv_buf_size_val: usize = state.args.lock().unwrap().iter().map(|v| v.len() + 1).sum();
33    let argv_buf_size_val: M::Offset =
34        wasi_try!(argv_buf_size_val.try_into().map_err(|_| Errno::Overflow));
35    wasi_try_mem!(argc.write(argc_val));
36    wasi_try_mem!(argv_buf_size.write(argv_buf_size_val));
37
38    debug!("argc={}, argv_buf_size={}", argc_val, argv_buf_size_val);
39
40    Errno::Success
41}