wasmer_wasix/syscalls/wasix/
sock_leave_multicast_v4.rs1use super::*;
2use crate::syscalls::*;
3
4#[instrument(level = "trace", skip_all, fields(%sock), ret)]
13pub fn sock_leave_multicast_v4<M: MemorySize>(
14 mut ctx: FunctionEnvMut<'_, WasiEnv>,
15 sock: WasiFd,
16 multiaddr: WasmPtr<__wasi_addr_ip4_t, M>,
17 iface: WasmPtr<__wasi_addr_ip4_t, 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 multiaddr = wasi_try_ok!(crate::net::read_ip_v4(&memory, multiaddr));
24 let iface = wasi_try_ok!(crate::net::read_ip_v4(&memory, iface));
25
26 wasi_try_ok!(sock_leave_multicast_v4_internal(
27 &mut ctx, sock, multiaddr, iface
28 )?);
29
30 #[cfg(feature = "journal")]
31 if ctx.data().enable_journal {
32 JournalEffector::save_sock_leave_ipv4_multicast(&mut ctx, sock, multiaddr, iface).map_err(
33 |err| {
34 tracing::error!("failed to save sock_leave_ipv4_multicast event - {}", err);
35 WasiError::Exit(ExitCode::from(Errno::Fault))
36 },
37 )?;
38 }
39
40 Ok(Errno::Success)
41}
42
43pub(crate) fn sock_leave_multicast_v4_internal(
44 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
45 sock: WasiFd,
46 multiaddr: Ipv4Addr,
47 iface: Ipv4Addr,
48) -> Result<Result<(), Errno>, WasiError> {
49 let env = ctx.data();
50 wasi_try_ok_ok!(__sock_actor_mut(ctx, sock, Rights::empty(), |socket, _| {
51 socket.leave_multicast_v4(multiaddr, iface)
52 }));
53 Ok(Ok(()))
54}