wasmer_wasix/syscalls/wasi/
random_get.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `random_get()`
5/// Fill buffer with high-quality random data.  This function may be slow and block
6/// Inputs:
7/// - `void *buf`
8///     A pointer to a buffer where the random bytes will be written
9/// - `size_t buf_len`
10///     The number of bytes that will be written
11#[instrument(level = "trace", skip_all, fields(%buf_len), ret)]
12pub fn random_get<M: MemorySize>(
13    ctx: FunctionEnvMut<'_, WasiEnv>,
14    buf: WasmPtr<u8, M>,
15    buf_len: M::Offset,
16) -> Errno {
17    let env = ctx.data();
18    let memory = unsafe { env.memory_view(&ctx) };
19    let buf_len64: u64 = buf_len.into();
20    let mut u8_buffer = vec![0; buf_len64 as usize];
21    let res = getrandom::getrandom(&mut u8_buffer);
22    match res {
23        Ok(()) => {
24            let buf = wasi_try_mem!(buf.slice(&memory, buf_len));
25            wasi_try_mem!(buf.write_slice(&u8_buffer));
26            Errno::Success
27        }
28        Err(_) => Errno::Io,
29    }
30}