diff --git a/library/std/src/sys/yggdrasil/mod.rs b/library/std/src/sys/yggdrasil/mod.rs index 01970be119f..9c4a138844b 100644 --- a/library/std/src/sys/yggdrasil/mod.rs +++ b/library/std/src/sys/yggdrasil/mod.rs @@ -169,6 +169,9 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { // Network Ok(OsError::HostUnreachable) => ErrorKind::HostUnreachable, Ok(OsError::NetworkUnreachable) => ErrorKind::NetworkUnreachable, + Ok(OsError::ConnectionReset) => ErrorKind::ConnectionReset, + Ok(OsError::ConnectionRefused) => ErrorKind::ConnectionRefused, + Ok(OsError::AddrInUse) => ErrorKind::AddrInUse, // Uncategorized Ok(OsError::InvalidFile) => ErrorKind::Uncategorized, diff --git a/library/std/src/sys/yggdrasil/net/tcp_stream.rs b/library/std/src/sys/yggdrasil/net/tcp_stream.rs index bd97de40a15..cb42b69f672 100644 --- a/library/std/src/sys/yggdrasil/net/tcp_stream.rs +++ b/library/std/src/sys/yggdrasil/net/tcp_stream.rs @@ -4,9 +4,10 @@ use crate::net::{Shutdown, SocketAddr}; use crate::os::fd::{AsRawFd, FromRawFd, RawFd}; use crate::sys::cvt_io; use crate::sys::fd::FileDesc; +use crate::sys_common::{AsInner, IntoInner}; use crate::time::Duration; -use yggdrasil_rt::sys as syscall; +use yggdrasil_rt::{net::SocketType, sys as syscall}; #[derive(Debug)] pub struct TcpStream { @@ -25,8 +26,15 @@ impl TcpStream { Self { local, remote, fd } } - pub fn connect(_addr: io::Result<&SocketAddr>) -> io::Result { - todo!() + pub fn connect(addr: io::Result<&SocketAddr>) -> io::Result { + let remote = addr?; + let mut local = MaybeUninit::uninit(); + let raw = cvt_io(unsafe { + syscall::connect_socket(None, remote, SocketType::TcpStream, &mut local) + })?; + let local = unsafe { local.assume_init() }; + let fd = unsafe { FileDesc::from_raw_fd(raw) }; + Ok(Self { local, remote: *remote, fd }) } pub fn connect_timeout(_addr: &SocketAddr, _timeout: Duration) -> io::Result { @@ -132,3 +140,28 @@ impl TcpStream { todo!() } } + +impl IntoInner for TcpStream { + fn into_inner(self) -> FileDesc { + self.fd + } +} + +impl AsInner for TcpStream { + fn as_inner(&self) -> &FileDesc { + &self.fd + } +} + +impl AsRawFd for TcpStream { + fn as_raw_fd(&self) -> RawFd { + self.fd.as_raw_fd() + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +impl AsRawFd for crate::net::TcpStream { + fn as_raw_fd(&self) -> RawFd { + self.as_inner().as_raw_fd() + } +}