wasmer_wasix/syscalls/wasix/
sock_set_opt_time.rs

1use super::*;
2use crate::{net::socket::TimeType, syscalls::*};
3
4/// ### `sock_set_opt_time()`
5/// Sets one of the times the socket
6///
7/// ## Parameters
8///
9/// * `fd` - Socket descriptor
10/// * `sockopt` - Socket option to be set
11/// * `time` - Value to set the time to
12#[instrument(level = "trace", skip_all, fields(%sock, %opt, time = field::Empty), ret)]
13pub fn sock_set_opt_time<M: MemorySize>(
14    mut ctx: FunctionEnvMut<'_, WasiEnv>,
15    sock: WasiFd,
16    opt: Sockoption,
17    time: WasmPtr<OptionTimestamp, M>,
18) -> Result<Errno, WasiError> {
19    WasiEnv::do_pending_operations(&mut ctx)?;
20
21    let env = ctx.data();
22    let memory = unsafe { env.memory_view(&ctx) };
23    let time = wasi_try_mem_ok!(time.read(&memory));
24    let time = match time.tag {
25        OptionTag::None => None,
26        OptionTag::Some => Some(Duration::from_nanos(time.u)),
27        _ => return Ok(Errno::Inval),
28    };
29    Span::current().record("time", format!("{time:?}"));
30
31    let ty = match opt {
32        Sockoption::RecvTimeout => TimeType::ReadTimeout,
33        Sockoption::SendTimeout => TimeType::WriteTimeout,
34        Sockoption::ConnectTimeout => TimeType::ConnectTimeout,
35        Sockoption::AcceptTimeout => TimeType::AcceptTimeout,
36        Sockoption::Linger => TimeType::Linger,
37        _ => return Ok(Errno::Inval),
38    };
39
40    wasi_try_ok!(sock_set_opt_time_internal(&mut ctx, sock, ty, time)?);
41
42    #[cfg(feature = "journal")]
43    if ctx.data().enable_journal {
44        JournalEffector::save_sock_set_opt_time(&mut ctx, sock, ty, time).map_err(|err| {
45            tracing::error!("failed to save sock_set_opt_time event - {}", err);
46            WasiError::Exit(ExitCode::from(Errno::Fault))
47        })?;
48    }
49
50    Ok(Errno::Success)
51}
52
53pub(crate) fn sock_set_opt_time_internal(
54    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
55    sock: WasiFd,
56    ty: TimeType,
57    time: Option<Duration>,
58) -> Result<Result<(), Errno>, WasiError> {
59    wasi_try_ok_ok!(__sock_actor_mut(ctx, sock, Rights::empty(), |socket, _| {
60        socket.set_opt_time(ty, time)
61    }));
62
63    Ok(Ok(()))
64}