wasmer_wasix/syscalls/wasix/
sock_get_opt_time.rs

1use super::*;
2use crate::{net::socket::TimeType, syscalls::*};
3
4/// ### `sock_get_opt_time()`
5/// Retrieve one of the times on the socket
6///
7/// ## Parameters
8///
9/// * `fd` - Socket descriptor
10/// * `sockopt` - Socket option to be retrieved
11#[instrument(level = "trace", skip_all, fields(%sock, %opt), ret)]
12pub fn sock_get_opt_time<M: MemorySize>(
13    mut ctx: FunctionEnvMut<'_, WasiEnv>,
14    sock: WasiFd,
15    opt: Sockoption,
16    ret_time: WasmPtr<OptionTimestamp, M>,
17) -> Errno {
18    let ty = match opt {
19        Sockoption::RecvTimeout => TimeType::ReadTimeout,
20        Sockoption::SendTimeout => TimeType::WriteTimeout,
21        Sockoption::ConnectTimeout => TimeType::ConnectTimeout,
22        Sockoption::AcceptTimeout => TimeType::AcceptTimeout,
23        Sockoption::Linger => TimeType::Linger,
24        _ => return Errno::Inval,
25    };
26
27    let time = wasi_try!(__sock_actor(
28        &mut ctx,
29        sock,
30        Rights::empty(),
31        |socket, _| socket.opt_time(ty)
32    ));
33
34    let env = ctx.data();
35    let memory = unsafe { env.memory_view(&ctx) };
36
37    let time = match time {
38        None => OptionTimestamp {
39            tag: OptionTag::None,
40            u: 0,
41        },
42        Some(timeout) => OptionTimestamp {
43            tag: OptionTag::Some,
44            u: timeout.as_nanos() as Timestamp,
45        },
46    };
47
48    wasi_try_mem!(ret_time.write(&memory, time));
49
50    Errno::Success
51}