wasmer_wasix/syscalls/wasix/
sock_bind.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `sock_bind()`
5/// Bind a socket
6/// Note: This is similar to `bind` in POSIX using PF_INET
7///
8/// ## Parameters
9///
10/// * `fd` - File descriptor of the socket to be bind
11/// * `addr` - Address to bind the socket to
12#[instrument(level = "trace", skip_all, fields(%sock, addr = field::Empty), ret)]
13pub fn sock_bind<M: MemorySize>(
14    mut ctx: FunctionEnvMut<'_, WasiEnv>,
15    sock: WasiFd,
16    addr: WasmPtr<__wasi_addr_port_t, M>,
17) -> Result<Errno, WasiError> {
18    WasiEnv::do_pending_operations(&mut ctx)?;
19
20    let env = ctx.data();
21    let memory = unsafe { env.memory_view(&ctx) };
22
23    let addr = wasi_try_ok!(crate::net::read_ip_port(&memory, addr));
24    let addr = SocketAddr::new(addr.0, addr.1);
25    Span::current().record("addr", format!("{addr:?}"));
26
27    wasi_try_ok!(sock_bind_internal(&mut ctx, sock, addr)?);
28
29    #[cfg(feature = "journal")]
30    if ctx.data().enable_journal {
31        JournalEffector::save_sock_bind(&mut ctx, sock, addr).map_err(|err| {
32            tracing::error!("failed to save sock_bind event - {}", err);
33            WasiError::Exit(ExitCode::from(Errno::Fault))
34        })?;
35    }
36
37    Ok(Errno::Success)
38}
39
40pub(crate) fn sock_bind_internal(
41    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
42    sock: WasiFd,
43    addr: SocketAddr,
44) -> Result<Result<(), Errno>, WasiError> {
45    let env = ctx.data();
46    let net = env.net().clone();
47
48    let tasks = ctx.data().tasks().clone();
49    wasi_try_ok_ok!(__sock_upgrade(
50        ctx,
51        sock,
52        Rights::SOCK_BIND,
53        move |socket, _| async move { socket.bind(tasks.deref(), net.deref(), addr).await }
54    ));
55
56    Ok(Ok(()))
57}