diff --git a/library/std/src/os/yggdrasil/io.rs b/library/std/src/os/yggdrasil/io.rs index bbbf753f01e..c42ed223ba1 100644 --- a/library/std/src/os/yggdrasil/io.rs +++ b/library/std/src/os/yggdrasil/io.rs @@ -1,6 +1,64 @@ #![stable(feature = "os_fd", since = "1.66.0")] #![allow(dead_code)] +use crate::mem::MaybeUninit; +use crate::sys::cvt_io; +use yggdrasil_rt::sys as syscall; + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub use yggdrasil_rt::io::{ + DeviceRequest, TerminalInputOptions, TerminalLineOptions, TerminalOptions, + TerminalOutputOptions, +}; + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub trait FdDeviceRequest { + #[unstable(feature = "yggdrasil_os", issue = "none")] + unsafe fn device_request(&self, req: &mut DeviceRequest) -> crate::io::Result<()>; +} + +#[unstable(feature = "yggdrasil_os", issue = "none")] +impl FdDeviceRequest for T { + unsafe fn device_request(&self, req: &mut DeviceRequest) -> crate::io::Result<()> { + cvt_io(syscall::device_request(self.as_raw_fd(), req))?; + Ok(()) + } +} + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub unsafe fn set_terminal_options( + fd: F, + opt: TerminalOptions, +) -> crate::io::Result<()> { + let mut req = DeviceRequest::SetTerminalOptions(opt); + cvt_io(syscall::device_request(fd.as_raw_fd(), &mut req)) +} + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub unsafe fn get_terminal_options(fd: F) -> crate::io::Result { + let mut req = DeviceRequest::GetTerminalOptions(MaybeUninit::uninit()); + cvt_io(syscall::device_request(fd.as_raw_fd(), &mut req))?; + let DeviceRequest::GetTerminalOptions(opt) = req else { + unreachable!(); + }; + Ok(opt.assume_init()) +} + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub unsafe fn update_terminal_options< + F: raw::AsRawFd, + M: Fn(TerminalOptions) -> TerminalOptions, +>( + fd: F, + mutator: M, +) -> crate::io::Result { + let fd = fd.as_raw_fd(); + let old = get_terminal_options(fd)?; + let new = mutator(old); + set_terminal_options(fd, new)?; + Ok(old) +} + mod net { use crate::os::yggdrasil::io::OwnedFd; use crate::os::yggdrasil::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; @@ -49,10 +107,31 @@ mod net { impl_into_raw_fd! { TcpStream TcpListener UdpSocket } } -pub mod raw { +#[stable(feature = "os_fd", since = "1.66.0")] +pub(crate) mod raw { #[stable(feature = "rust1", since = "1.0.0")] pub type RawFd = yggdrasil_rt::io::RawFd; + macro_rules! stdio_impl_as_raw_fd { + ($($ty:ty => $n:expr),*) => {$( + #[stable(feature = "asraw_stdio", since = "1.21.0")] + impl AsRawFd for $ty { + #[inline] + fn as_raw_fd(&self) -> RawFd { + $n + } + } + + #[stable(feature = "asraw_stdio", since = "1.21.0")] + impl AsRawFd for &$ty { + #[inline] + fn as_raw_fd(&self) -> RawFd { + $n + } + } + )*}; + } + #[stable(feature = "rust1", since = "1.0.0")] pub trait AsRawFd { #[stable(feature = "rust1", since = "1.0.0")] @@ -91,6 +170,12 @@ pub mod raw { self } } + + stdio_impl_as_raw_fd!( + crate::io::Stdin => RawFd::STDIN, + crate::io::Stdout => RawFd::STDOUT, + crate::io::Stderr => RawFd::STDERR + ); } pub mod owned { diff --git a/library/std/src/os/yggdrasil/mod.rs b/library/std/src/os/yggdrasil/mod.rs index f506d401c8a..4fd27ad26e7 100644 --- a/library/std/src/os/yggdrasil/mod.rs +++ b/library/std/src/os/yggdrasil/mod.rs @@ -1,6 +1,6 @@ #![stable(feature = "os", since = "1.0.0")] -pub(crate) mod io; +pub mod io; pub mod process; #[unstable(feature = "yggdrasil_raw_fd", issue = "none")] diff --git a/library/std/src/sys/yggdrasil/process.rs b/library/std/src/sys/yggdrasil/process.rs index 349ec989060..ebff85e0694 100644 --- a/library/std/src/sys/yggdrasil/process.rs +++ b/library/std/src/sys/yggdrasil/process.rs @@ -321,7 +321,7 @@ impl Command { let options = SpawnOptions { program, arguments, environment, optional: &optional }; - let pid = cvt_io(unsafe { yggdrasil_rt::sys::spawn(&options) })?; + let pid = cvt_io(unsafe { yggdrasil_rt::sys::spawn_process(&options) })?; Ok(Process { pid }) } diff --git a/yggdrasil-rt b/yggdrasil-rt index a882ffa0281..f00ecdb926c 160000 --- a/yggdrasil-rt +++ b/yggdrasil-rt @@ -1 +1 @@ -Subproject commit a882ffa0281db2fdf162db7bf6a979a2bbbd54a0 +Subproject commit f00ecdb926c2f912d658589f9f631100e41ad6c5