wasmer_wasix/syscalls/wasix/
sock_get_opt_flag.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `sock_get_opt_flag()`
5/// Retrieve status of particular socket seting
6/// Note: This is similar to `getsockopt` in POSIX for SO_REUSEADDR
7///
8/// ## Parameters
9///
10/// * `fd` - Socket descriptor
11/// * `sockopt` - Socket option to be retrieved
12#[instrument(level = "trace", skip_all, fields(%sock, %opt), ret)]
13pub fn sock_get_opt_flag<M: MemorySize>(
14    mut ctx: FunctionEnvMut<'_, WasiEnv>,
15    sock: WasiFd,
16    opt: Sockoption,
17    ret_flag: WasmPtr<Bool, M>,
18) -> Errno {
19    let option: crate::net::socket::WasiSocketOption = match opt.try_into() {
20        Ok(o) => o,
21        Err(_) => return Errno::Inval,
22    };
23    let flag = wasi_try!(__sock_actor(
24        &mut ctx,
25        sock,
26        Rights::empty(),
27        |socket, _| socket.get_opt_flag(option)
28    ));
29
30    let env = ctx.data();
31    let memory = unsafe { env.memory_view(&ctx) };
32    let flag = match flag {
33        false => Bool::False,
34        true => Bool::True,
35    };
36
37    wasi_try_mem!(ret_flag.write(&memory, flag));
38
39    Errno::Success
40}