wasmer_wasix/syscalls/wasix/
sock_leave_multicast_v4.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `sock_leave_multicast_v4()`
5/// Leaves a particular multicast IPv4 group
6///
7/// ## Parameters
8///
9/// * `fd` - Socket descriptor
10/// * `multiaddr` - Multicast group to leave
11/// * `interface` - Interface that will left
12#[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}