wasmer_wasix/syscalls/wasix/
sock_bind.rs1use super::*;
2use crate::syscalls::*;
3
4#[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}