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 = match opt.try_into() {
51        Ok(o) => o,
52        Err(_) => return Ok(Err(Errno::Inval)),
53    };
54    wasi_try_ok_ok!(__sock_actor_mut(
55        ctx,
56        sock,
57        Rights::empty(),
58        |mut socket, _| match opt {
59            Sockoption::RecvBufSize => socket.set_recv_buf_size(size as usize),
60            Sockoption::SendBufSize => socket.set_send_buf_size(size as usize),
61            Sockoption::Ttl => socket.set_ttl(size as u32),
62            Sockoption::MulticastTtlV4 => socket.set_multicast_ttl_v4(size as u32),
63            _ => Err(Errno::Inval),
64        }
65    ));
66    Ok(Ok(()))
67}