wasmer_wasix/syscalls/wasix/
sock_set_opt_size.rs1use super::*;
2use crate::{net::socket::WasiSocketOption, syscalls::*};
3
4#[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 if !matches!(
42 opt,
43 Sockoption::RecvBufSize
44 | Sockoption::SendBufSize
45 | Sockoption::Ttl
46 | Sockoption::MulticastTtlV4
47 ) {
48 return Ok(Err(Errno::Inval));
49 }
50
51 let option: WasiSocketOption = match opt.try_into() {
52 Ok(o) => o,
53 Err(_) => return Ok(Err(Errno::Inval)),
54 };
55 wasi_try_ok_ok!(__sock_actor_mut(
56 ctx,
57 sock,
58 Rights::empty(),
59 |mut socket, _| match option {
60 WasiSocketOption::RecvBufSize => socket.set_recv_buf_size(size as usize),
61 WasiSocketOption::SendBufSize => socket.set_send_buf_size(size as usize),
62 WasiSocketOption::Ttl => socket.set_ttl(size as u32),
63 WasiSocketOption::MulticastTtlV4 => socket.set_multicast_ttl_v4(size as u32),
64 _ => Err(Errno::Inval),
65 }
66 ));
67 Ok(Ok(()))
68}