alnyan/yggdrasil: basic TcpStream operation

This commit is contained in:
2024-01-25 13:08:39 +02:00
parent da1c51a6d1
commit d822648ddd
2 changed files with 39 additions and 3 deletions
+3
View File
@@ -169,6 +169,9 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
// Network // Network
Ok(OsError::HostUnreachable) => ErrorKind::HostUnreachable, Ok(OsError::HostUnreachable) => ErrorKind::HostUnreachable,
Ok(OsError::NetworkUnreachable) => ErrorKind::NetworkUnreachable, Ok(OsError::NetworkUnreachable) => ErrorKind::NetworkUnreachable,
Ok(OsError::ConnectionReset) => ErrorKind::ConnectionReset,
Ok(OsError::ConnectionRefused) => ErrorKind::ConnectionRefused,
Ok(OsError::AddrInUse) => ErrorKind::AddrInUse,
// Uncategorized // Uncategorized
Ok(OsError::InvalidFile) => ErrorKind::Uncategorized, Ok(OsError::InvalidFile) => ErrorKind::Uncategorized,
@@ -4,9 +4,10 @@ use crate::net::{Shutdown, SocketAddr};
use crate::os::fd::{AsRawFd, FromRawFd, RawFd}; use crate::os::fd::{AsRawFd, FromRawFd, RawFd};
use crate::sys::cvt_io; use crate::sys::cvt_io;
use crate::sys::fd::FileDesc; use crate::sys::fd::FileDesc;
use crate::sys_common::{AsInner, IntoInner};
use crate::time::Duration; use crate::time::Duration;
use yggdrasil_rt::sys as syscall; use yggdrasil_rt::{net::SocketType, sys as syscall};
#[derive(Debug)] #[derive(Debug)]
pub struct TcpStream { pub struct TcpStream {
@@ -25,8 +26,15 @@ impl TcpStream {
Self { local, remote, fd } Self { local, remote, fd }
} }
pub fn connect(_addr: io::Result<&SocketAddr>) -> io::Result<TcpStream> { pub fn connect(addr: io::Result<&SocketAddr>) -> io::Result<TcpStream> {
todo!() 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<TcpStream> { pub fn connect_timeout(_addr: &SocketAddr, _timeout: Duration) -> io::Result<TcpStream> {
@@ -132,3 +140,28 @@ impl TcpStream {
todo!() todo!()
} }
} }
impl IntoInner<FileDesc> for TcpStream {
fn into_inner(self) -> FileDesc {
self.fd
}
}
impl AsInner<FileDesc> 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()
}
}