wasmer_wasix/syscalls/wasix/
port_route_list.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `port_route_list()`
5/// Returns a list of all the routes owned by the local port
6/// This function fills the output buffer as much as possible.
7/// If the buffer is too small this will return EOVERFLOW and
8/// fill nroutes with the size of the buffer needed.
9///
10/// ## Parameters
11///
12/// * `routes` - The buffer where routes will be stored
13#[instrument(level = "trace", skip_all, fields(nroutes = field::Empty, max_routes = field::Empty), ret)]
14pub fn port_route_list<M: MemorySize>(
15    mut ctx: FunctionEnvMut<'_, WasiEnv>,
16    routes_ptr: WasmPtr<Route, M>,
17    nroutes_ptr: WasmPtr<M::Offset, M>,
18) -> Result<Errno, WasiError> {
19    WasiEnv::do_pending_operations(&mut ctx)?;
20
21    let mut env = ctx.data();
22    let mut memory = unsafe { env.memory_view(&ctx) };
23    let ref_nroutes = nroutes_ptr.deref(&memory);
24    let max_routes: usize = wasi_try_ok!(
25        wasi_try_mem_ok!(ref_nroutes.read())
26            .try_into()
27            .map_err(|_| Errno::Inval)
28    );
29    Span::current().record("max_routes", max_routes);
30    let ref_routes =
31        wasi_try_mem_ok!(routes_ptr.slice(&memory, wasi_try_ok!(to_offset::<M>(max_routes))));
32
33    let net = env.net().clone();
34    let routes = wasi_try_ok!(__asyncify(&mut ctx, None, async {
35        net.route_list().await.map_err(net_error_into_wasi_err)
36    })?);
37    Span::current().record("nroutes", routes.len());
38
39    let env = ctx.data();
40    let memory = unsafe { env.memory_view(&ctx) };
41
42    let routes_len: M::Offset = wasi_try_ok!(routes.len().try_into().map_err(|_| Errno::Inval));
43    let nroutes = nroutes_ptr.deref(&memory);
44    wasi_try_mem_ok!(nroutes.write(routes_len));
45    if routes.len() > max_routes {
46        return Ok(Errno::Overflow);
47    }
48
49    let ref_routes =
50        wasi_try_mem_ok!(routes_ptr.slice(&memory, wasi_try_ok!(to_offset::<M>(max_routes))));
51    for n in 0..routes.len() {
52        let nroute = ref_routes.index(n as u64);
53        crate::net::write_route(
54            &memory,
55            nroute.as_ptr::<M>(),
56            routes.get(n).unwrap().clone(),
57        );
58    }
59
60    Ok(Errno::Success)
61}