wasmer_wasix/syscalls/wasix/
port_addr_list.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `port_ip_list()`
5/// Returns a list of all the addresses owned by the local port
6/// This function fills the output buffer as much as possible.
7/// If the buffer is not big enough then the naddrs address will be
8/// filled with the buffer size needed and the EOVERFLOW will be returned
9///
10/// ## Parameters
11///
12/// * `addrs` - The buffer where addresses will be stored
13///
14/// ## Return
15///
16/// The number of addresses returned.
17#[instrument(level = "trace", skip_all, fields(naddrs = field::Empty), ret)]
18pub fn port_addr_list<M: MemorySize>(
19    mut ctx: FunctionEnvMut<'_, WasiEnv>,
20    addrs_ptr: WasmPtr<__wasi_cidr_t, M>,
21    naddrs_ptr: WasmPtr<M::Offset, M>,
22) -> Result<Errno, WasiError> {
23    WasiEnv::do_pending_operations(&mut ctx)?;
24
25    let mut env = ctx.data();
26    let mut memory = unsafe { env.memory_view(&ctx) };
27    let max_addrs = wasi_try_mem_ok!(naddrs_ptr.read(&memory));
28    let max_addrs: u64 = max_addrs.into();
29
30    let net = env.net().clone();
31    let addrs = wasi_try_ok!(__asyncify(&mut ctx, None, async {
32        net.ip_list().await.map_err(net_error_into_wasi_err)
33    })?);
34    let env = ctx.data();
35    let memory = unsafe { env.memory_view(&ctx) };
36    Span::current().record("naddrs", addrs.len());
37
38    let addrs_len: M::Offset = wasi_try_ok!(addrs.len().try_into().map_err(|_| Errno::Overflow));
39    wasi_try_mem_ok!(naddrs_ptr.write(&memory, addrs_len));
40    if addrs.len() as u64 > max_addrs {
41        return Ok(Errno::Overflow);
42    }
43
44    let ref_addrs = wasi_try_mem_ok!(
45        addrs_ptr.slice(&memory, wasi_try_ok!(to_offset::<M>(max_addrs as usize)))
46    );
47    for n in 0..addrs.len() {
48        let nip = ref_addrs.index(n as u64);
49        crate::net::write_cidr(&memory, nip.as_ptr::<M>(), *addrs.get(n).unwrap());
50    }
51
52    Ok(Errno::Success)
53}