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        let effective_addr = match __sock_actor(&mut ctx, sock, Rights::empty(), |socket, _| {
32            socket.addr_local()
33        }) {
34            Ok(effective_addr) => effective_addr,
35            Err(err) => {
36                tracing::warn!(
37                    "failed to determine effective local socket address for journaling; \
38                     falling back to requested bind address {:?}: {}",
39                    addr,
40                    err
41                );
42                addr
43            }
44        };
45        JournalEffector::save_sock_bind(&mut ctx, sock, effective_addr).map_err(|err| {
46            tracing::error!("failed to save sock_bind event - {}", err);
47            WasiError::Exit(ExitCode::from(Errno::Fault))
48        })?;
49    }
50
51    Ok(Errno::Success)
52}
53
54pub(crate) fn sock_bind_internal(
55    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
56    sock: WasiFd,
57    addr: SocketAddr,
58) -> Result<Result<(), Errno>, WasiError> {
59    let env = ctx.data();
60    let net = env.net().clone();
61
62    let tasks = ctx.data().tasks().clone();
63    wasi_try_ok_ok!(__sock_upgrade(
64        ctx,
65        sock,
66        Rights::SOCK_BIND,
67        move |socket, _| async move { socket.bind(tasks.deref(), net.deref(), addr).await }
68    ));
69
70    Ok(Ok(()))
71}