wasmer_wasix/journal/effector/syscalls/
sock_connect.rs1use std::net::SocketAddr;
2
3use wasmer_wasix_types::wasi::{Addressfamily, SockProto, Socktype};
4
5use crate::{
6 fs::Kind,
7 net::socket::{InodeSocket, InodeSocketKind, SocketProperties},
8};
9
10use super::*;
11
12impl JournalEffector {
13 pub fn save_sock_connect(
14 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
15 fd: Fd,
16 local_addr: SocketAddr,
17 peer_addr: SocketAddr,
18 ) -> anyhow::Result<()> {
19 Self::save_event(
20 ctx,
21 JournalEntry::SocketConnectedV1 {
22 fd,
23 local_addr,
24 peer_addr,
25 },
26 )
27 }
28
29 pub fn apply_sock_connect(
30 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
31 fd: Fd,
32 local_addr: SocketAddr,
33 peer_addr: SocketAddr,
34 dead: bool,
35 ) -> anyhow::Result<()> {
36 let kind = Kind::Socket {
37 socket: InodeSocket::new(InodeSocketKind::RemoteSocket {
38 is_dead: dead,
39 local_addr,
40 peer_addr,
41 ttl: 0,
42 multicast_ttl: 0,
43 props: SocketProperties {
44 family: match peer_addr.is_ipv4() {
45 true => Addressfamily::Inet4,
46 false => Addressfamily::Inet6,
47 },
48 ty: Socktype::Stream,
49 pt: SockProto::Tcp,
50 only_v6: false,
51 reuse_port: false,
52 reuse_addr: false,
53 no_delay: None,
54 keep_alive: None,
55 dont_route: None,
56 send_buf_size: None,
57 recv_buf_size: None,
58 write_timeout: None,
59 read_timeout: None,
60 accept_timeout: None,
61 connect_timeout: None,
62 handler: None,
63 },
64 }),
65 };
66
67 let env = ctx.data();
68 let state = env.state();
69 let inodes = &state.inodes;
70 let inode = state
71 .fs
72 .create_inode_with_default_stat(inodes, kind, false, "socket".into());
73
74 let rights = Rights::all_socket();
75 state
76 .fs
77 .with_fd(
78 rights,
79 rights,
80 Fdflags::empty(),
81 Fdflagsext::empty(),
82 0,
83 inode,
84 fd,
85 )
86 .map_err(|err| {
87 anyhow::format_err!(
88 "journal restore error: failed to create remote connected socket - {err}"
89 )
90 })?;
91
92 Ok(())
93 }
94}