wasmer_wasix/syscalls/wasix/
sock_set_opt_time.rs1use super::*;
2use crate::{net::socket::TimeType, syscalls::*};
3
4#[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}