wasmer_wasix/syscalls/wasix/
sock_set_opt_size.rs

1use super::*;
2use crate::{net::socket::TimeType, syscalls::*};
3
4/// ### `sock_set_opt_size()
5/// Set size of particular option for this socket
6/// Note: This is similar to `setsockopt` in POSIX for SO_RCVBUF
7///
8/// ## Parameters
9///
10/// * `fd` - Socket descriptor
11/// * `opt` - Socket option to be set
12/// * `size` - Buffer size
13#[instrument(level = "trace", skip_all, fields(%sock, %opt, %size), ret)]
14pub fn sock_set_opt_size(
15    mut ctx: FunctionEnvMut<'_, WasiEnv>,
16    sock: WasiFd,
17    opt: Sockoption,
18    size: Filesize,
19) -> Result<Errno, WasiError> {
20    WasiEnv::do_pending_operations(&mut ctx)?;
21
22    wasi_try_ok!(sock_set_opt_size_internal(&mut ctx, sock, opt, size)?);
23
24    #[cfg(feature = "journal")]
25    if ctx.data().enable_journal {
26        JournalEffector::save_sock_set_opt_size(&mut ctx, sock, opt, size).map_err(|err| {
27            tracing::error!("failed to save sock_set_opt_size event - {}", err);
28            WasiError::Exit(ExitCode::from(Errno::Fault))
29        })?;
30    }
31
32    Ok(Errno::Success)
33}
34
35pub(crate) fn sock_set_opt_size_internal(
36    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
37    sock: WasiFd,
38    opt: Sockoption,
39    size: Filesize,
40) -> Result<Result<(), Errno>, WasiError> {
41    let ty = match opt {
42        Sockoption::RecvTimeout => TimeType::ReadTimeout,
43        Sockoption::SendTimeout => TimeType::WriteTimeout,
44        Sockoption::ConnectTimeout => TimeType::ConnectTimeout,
45        Sockoption::AcceptTimeout => TimeType::AcceptTimeout,
46        Sockoption::Linger => TimeType::Linger,
47        _ => return Ok(Err(Errno::Inval)),
48    };
49
50    let option: crate::net::socket::WasiSocketOption = opt.into();
51    wasi_try_ok_ok!(__sock_actor_mut(
52        ctx,
53        sock,
54        Rights::empty(),
55        |mut socket, _| match opt {
56            Sockoption::RecvBufSize => socket.set_recv_buf_size(size as usize),
57            Sockoption::SendBufSize => socket.set_send_buf_size(size as usize),
58            Sockoption::Ttl => socket.set_ttl(size as u32),
59            Sockoption::MulticastTtlV4 => socket.set_multicast_ttl_v4(size as u32),
60            _ => Err(Errno::Inval),
61        }
62    ));
63    Ok(Ok(()))
64}