|
1 | 1 | use std::net::{self, SocketAddr}; |
2 | 2 | #[cfg(unix)] |
3 | 3 | use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; |
| 4 | +#[cfg(target_os = "wasi")] |
| 5 | +use std::os::wasi::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; |
4 | 6 | #[cfg(windows)] |
5 | 7 | use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket}; |
6 | 8 | use std::{fmt, io}; |
7 | 9 |
|
8 | 10 | use crate::io_source::IoSource; |
9 | 11 | use crate::net::TcpStream; |
10 | | -#[cfg(unix)] |
| 12 | +#[cfg(any(unix, target_os = "wasi"))] |
11 | 13 | use crate::sys::tcp::set_reuseaddr; |
12 | 14 | use crate::sys::tcp::{bind, listen, new_for_addr}; |
13 | 15 | use crate::{event, sys, Interest, Registry, Token}; |
@@ -54,7 +56,7 @@ impl TcpListener { |
54 | 56 | /// 4. Calls `listen` on the socket to prepare it to receive new connections. |
55 | 57 | pub fn bind(addr: SocketAddr) -> io::Result<TcpListener> { |
56 | 58 | let socket = new_for_addr(addr)?; |
57 | | - #[cfg(unix)] |
| 59 | + #[cfg(any(unix, target_os = "wasi"))] |
58 | 60 | let listener = unsafe { TcpListener::from_raw_fd(socket) }; |
59 | 61 | #[cfg(windows)] |
60 | 62 | let listener = unsafe { TcpListener::from_raw_socket(socket as _) }; |
@@ -215,3 +217,30 @@ impl FromRawSocket for TcpListener { |
215 | 217 | TcpListener::from_std(FromRawSocket::from_raw_socket(socket)) |
216 | 218 | } |
217 | 219 | } |
| 220 | + |
| 221 | +#[cfg(target_os = "wasi")] |
| 222 | +impl IntoRawFd for TcpListener { |
| 223 | + fn into_raw_fd(self) -> RawFd { |
| 224 | + self.inner.into_inner().into_raw_fd() |
| 225 | + } |
| 226 | +} |
| 227 | + |
| 228 | +#[cfg(target_os = "wasi")] |
| 229 | +impl AsRawFd for TcpListener { |
| 230 | + fn as_raw_fd(&self) -> RawFd { |
| 231 | + self.inner.as_raw_fd() |
| 232 | + } |
| 233 | +} |
| 234 | + |
| 235 | +#[cfg(target_os = "wasi")] |
| 236 | +impl FromRawFd for TcpListener { |
| 237 | + /// Converts a `RawFd` to a `TcpListener`. |
| 238 | + /// |
| 239 | + /// # Notes |
| 240 | + /// |
| 241 | + /// The caller is responsible for ensuring that the socket is in |
| 242 | + /// non-blocking mode. |
| 243 | + unsafe fn from_raw_fd(fd: RawFd) -> TcpListener { |
| 244 | + TcpListener::from_std(FromRawFd::from_raw_fd(fd)) |
| 245 | + } |
| 246 | +} |
0 commit comments