diff --git a/lib/wasix/src/journal/effector/syscalls/sock_accept.rs b/lib/wasix/src/journal/effector/syscalls/sock_accept.rs index 8cef12b838b..73b0c334542 100644 --- a/lib/wasix/src/journal/effector/syscalls/sock_accept.rs +++ b/lib/wasix/src/journal/effector/syscalls/sock_accept.rs @@ -43,6 +43,7 @@ impl JournalEffector { ) -> anyhow::Result<()> { let kind = Kind::Socket { socket: InodeSocket::new(InodeSocketKind::RemoteSocket { + is_dead: true, local_addr: addr, peer_addr, ttl: 0, diff --git a/lib/wasix/src/journal/effector/syscalls/sock_connect.rs b/lib/wasix/src/journal/effector/syscalls/sock_connect.rs index 51829efdc97..a5f9484edb3 100644 --- a/lib/wasix/src/journal/effector/syscalls/sock_connect.rs +++ b/lib/wasix/src/journal/effector/syscalls/sock_connect.rs @@ -34,6 +34,7 @@ impl JournalEffector { ) -> anyhow::Result<()> { let kind = Kind::Socket { socket: InodeSocket::new(InodeSocketKind::RemoteSocket { + is_dead: true, local_addr, peer_addr, ttl: 0, diff --git a/lib/wasix/src/net/socket.rs b/lib/wasix/src/net/socket.rs index f83d12859d3..73832318eef 100644 --- a/lib/wasix/src/net/socket.rs +++ b/lib/wasix/src/net/socket.rs @@ -83,6 +83,7 @@ pub enum InodeSocketKind { peer_addr: SocketAddr, ttl: u32, multicast_ttl: u32, + is_dead: bool, }, } @@ -628,7 +629,10 @@ impl InodeSocket { InodeSocketKind::TcpListener { .. } => WasiSocketStatus::Opened, InodeSocketKind::TcpStream { .. } => WasiSocketStatus::Opened, InodeSocketKind::UdpSocket { .. } => WasiSocketStatus::Opened, - InodeSocketKind::RemoteSocket { .. } => WasiSocketStatus::Opened, + InodeSocketKind::RemoteSocket { is_dead, .. } => match is_dead { + true => WasiSocketStatus::Closed, + false => WasiSocketStatus::Opened, + }, _ => WasiSocketStatus::Failed, }) } @@ -1106,8 +1110,11 @@ impl InodeSocket { InodeSocketKind::PreSocket { .. } => { return Poll::Ready(Err(Errno::Notconn)) } - InodeSocketKind::RemoteSocket { .. } => { - return Poll::Ready(Ok(self.data.len())) + InodeSocketKind::RemoteSocket { is_dead, .. } => { + return match is_dead { + true => Poll::Ready(Err(Errno::Connreset)), + false => Poll::Ready(Ok(self.data.len())), + } } _ => return Poll::Ready(Err(Errno::Notsup)), }; @@ -1186,8 +1193,11 @@ impl InodeSocket { InodeSocketKind::PreSocket { .. } => { return Poll::Ready(Err(Errno::Notconn)) } - InodeSocketKind::RemoteSocket { .. } => { - return Poll::Ready(Ok(self.data.len())) + InodeSocketKind::RemoteSocket { is_dead, .. } => { + return match is_dead { + true => Poll::Ready(Err(Errno::Connreset)), + false => Poll::Ready(Ok(self.data.len())), + }; } _ => return Poll::Ready(Err(Errno::Notsup)), }; @@ -1274,8 +1284,11 @@ impl InodeSocket { } } } - InodeSocketKind::RemoteSocket { .. } => { - return Poll::Pending; + InodeSocketKind::RemoteSocket { is_dead, .. } => { + return match is_dead { + true => Poll::Ready(Ok(0)), + false => Poll::Pending, + }; } InodeSocketKind::PreSocket { .. } => { return Poll::Ready(Err(Errno::Notconn)) @@ -1353,8 +1366,13 @@ impl InodeSocket { InodeSocketKind::UdpSocket { socket, .. } => { socket.try_recv_from(self.data) } - InodeSocketKind::RemoteSocket { .. } => { - return Poll::Pending; + InodeSocketKind::RemoteSocket { + is_dead, peer_addr, .. + } => { + return match is_dead { + true => Poll::Ready(Ok((0, *peer_addr))), + false => Poll::Pending, + }; } InodeSocketKind::PreSocket { .. } => { return Poll::Ready(Err(Errno::Notconn)) @@ -1414,9 +1432,9 @@ impl InodeSocket { #[allow(clippy::match_like_matches_macro)] match &mut guard.kind { InodeSocketKind::TcpStream { .. } - | InodeSocketKind::RemoteSocket { .. } | InodeSocketKind::UdpSocket { .. } | InodeSocketKind::Raw(..) => true, + InodeSocketKind::RemoteSocket { is_dead, .. } => !(*is_dead), _ => false, } } else { @@ -1450,7 +1468,10 @@ impl InodeSocketProtected { InodeSocketKind::Raw(socket) => socket.poll_read_ready(cx), InodeSocketKind::Icmp(socket) => socket.poll_read_ready(cx), InodeSocketKind::PreSocket { .. } => Poll::Pending, - InodeSocketKind::RemoteSocket { .. } => Poll::Pending, + InodeSocketKind::RemoteSocket { is_dead, .. } => match is_dead { + true => Poll::Ready(Ok(0)), + false => Poll::Pending, + }, } .map_err(net_error_into_io_err) } @@ -1463,7 +1484,10 @@ impl InodeSocketProtected { InodeSocketKind::Raw(socket) => socket.poll_write_ready(cx), InodeSocketKind::Icmp(socket) => socket.poll_write_ready(cx), InodeSocketKind::PreSocket { .. } => Poll::Pending, - InodeSocketKind::RemoteSocket { .. } => Poll::Pending, + InodeSocketKind::RemoteSocket { is_dead, .. } => match is_dead { + true => Poll::Ready(Ok(0)), + false => Poll::Pending, + }, } .map_err(net_error_into_io_err) }