alnyan/yggdrasil: basic TcpStream operation
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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<TcpStream> {
|
||||
todo!()
|
||||
pub fn connect(addr: io::Result<&SocketAddr>) -> io::Result<TcpStream> {
|
||||
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> {
|
||||
@@ -132,3 +140,28 @@ impl TcpStream {
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user