| use crate::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; |
| use crate::sys::map_motor_error; |
| use crate::sys_common::{AsInner, FromInner, IntoInner}; |
| use crate::{io, process, sys}; |
| |
| pub const STDIN_BUF_SIZE: usize = crate::sys::io::DEFAULT_BUF_SIZE; |
| |
| pub struct Stdin {} |
| |
| impl Stdin { |
| pub const fn new() -> Self { |
| Self {} |
| } |
| } |
| |
| pub struct Stdout {} |
| |
| impl Stdout { |
| pub const fn new() -> Self { |
| Self {} |
| } |
| } |
| |
| pub struct Stderr {} |
| |
| impl Stderr { |
| pub const fn new() -> Self { |
| Self {} |
| } |
| } |
| |
| impl crate::sealed::Sealed for Stdin {} |
| |
| impl crate::io::IsTerminal for Stdin { |
| fn is_terminal(&self) -> bool { |
| moto_rt::fs::is_terminal(moto_rt::FD_STDIN) |
| } |
| } |
| |
| impl io::Read for Stdin { |
| fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |
| moto_rt::fs::read(moto_rt::FD_STDIN, buf).map_err(map_motor_error) |
| } |
| } |
| |
| impl io::Write for Stdout { |
| fn write(&mut self, buf: &[u8]) -> io::Result<usize> { |
| moto_rt::fs::write(moto_rt::FD_STDOUT, buf).map_err(map_motor_error) |
| } |
| |
| fn flush(&mut self) -> io::Result<()> { |
| moto_rt::fs::flush(moto_rt::FD_STDOUT).map_err(map_motor_error) |
| } |
| } |
| |
| impl io::Write for Stderr { |
| fn write(&mut self, buf: &[u8]) -> io::Result<usize> { |
| moto_rt::fs::write(moto_rt::FD_STDERR, buf).map_err(map_motor_error) |
| } |
| |
| fn flush(&mut self) -> io::Result<()> { |
| moto_rt::fs::flush(moto_rt::FD_STDERR).map_err(map_motor_error) |
| } |
| } |
| |
| pub fn panic_output() -> Option<impl io::Write> { |
| Some(Stderr::new()) |
| } |
| |
| pub fn is_ebadf(_err: &io::Error) -> bool { |
| true |
| } |
| |
| #[stable(feature = "process_extensions", since = "1.2.0")] |
| impl FromRawFd for process::Stdio { |
| #[inline] |
| unsafe fn from_raw_fd(fd: RawFd) -> process::Stdio { |
| let fd = unsafe { sys::fd::FileDesc::from_raw_fd(fd) }; |
| let io = sys::process::Stdio::Fd(fd); |
| process::Stdio::from_inner(io) |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl From<OwnedFd> for process::Stdio { |
| /// Takes ownership of a file descriptor and returns a [`Stdio`](process::Stdio) |
| /// that can attach a stream to it. |
| #[inline] |
| fn from(fd: OwnedFd) -> process::Stdio { |
| let fd = sys::fd::FileDesc::from_inner(fd); |
| let io = sys::process::Stdio::Fd(fd); |
| process::Stdio::from_inner(io) |
| } |
| } |
| |
| #[stable(feature = "process_extensions", since = "1.2.0")] |
| impl AsRawFd for process::ChildStdin { |
| #[inline] |
| fn as_raw_fd(&self) -> RawFd { |
| self.as_inner().as_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "process_extensions", since = "1.2.0")] |
| impl AsRawFd for process::ChildStdout { |
| #[inline] |
| fn as_raw_fd(&self) -> RawFd { |
| self.as_inner().as_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "process_extensions", since = "1.2.0")] |
| impl AsRawFd for process::ChildStderr { |
| #[inline] |
| fn as_raw_fd(&self) -> RawFd { |
| self.as_inner().as_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "into_raw_os", since = "1.4.0")] |
| impl IntoRawFd for process::ChildStdin { |
| #[inline] |
| fn into_raw_fd(self) -> RawFd { |
| self.into_inner().into_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "into_raw_os", since = "1.4.0")] |
| impl IntoRawFd for process::ChildStdout { |
| #[inline] |
| fn into_raw_fd(self) -> RawFd { |
| self.into_inner().into_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "into_raw_os", since = "1.4.0")] |
| impl IntoRawFd for process::ChildStderr { |
| #[inline] |
| fn into_raw_fd(self) -> RawFd { |
| self.into_inner().into_raw_fd() |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl AsFd for crate::process::ChildStdin { |
| #[inline] |
| fn as_fd(&self) -> BorrowedFd<'_> { |
| self.as_inner().as_fd() |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl From<crate::process::ChildStdin> for OwnedFd { |
| /// Takes ownership of a [`ChildStdin`](crate::process::ChildStdin)'s file descriptor. |
| #[inline] |
| fn from(child_stdin: crate::process::ChildStdin) -> OwnedFd { |
| child_stdin.into_inner().into_inner() |
| } |
| } |
| |
| /// Creates a `ChildStdin` from the provided `OwnedFd`. |
| /// |
| /// The provided file descriptor must point to a pipe |
| /// with the `CLOEXEC` flag set. |
| #[stable(feature = "child_stream_from_fd", since = "1.74.0")] |
| impl From<OwnedFd> for process::ChildStdin { |
| #[inline] |
| fn from(fd: OwnedFd) -> process::ChildStdin { |
| let pipe = sys::pipe::AnonPipe::from_inner(fd); |
| process::ChildStdin::from_inner(pipe) |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl AsFd for crate::process::ChildStdout { |
| #[inline] |
| fn as_fd(&self) -> BorrowedFd<'_> { |
| self.as_inner().as_fd() |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl From<crate::process::ChildStdout> for OwnedFd { |
| /// Takes ownership of a [`ChildStdout`](crate::process::ChildStdout)'s file descriptor. |
| #[inline] |
| fn from(child_stdout: crate::process::ChildStdout) -> OwnedFd { |
| child_stdout.into_inner().into_inner() |
| } |
| } |
| |
| /// Creates a `ChildStdout` from the provided `OwnedFd`. |
| /// |
| /// The provided file descriptor must point to a pipe |
| /// with the `CLOEXEC` flag set. |
| #[stable(feature = "child_stream_from_fd", since = "1.74.0")] |
| impl From<OwnedFd> for process::ChildStdout { |
| #[inline] |
| fn from(fd: OwnedFd) -> process::ChildStdout { |
| let pipe = sys::pipe::AnonPipe::from_inner(fd); |
| process::ChildStdout::from_inner(pipe) |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl AsFd for crate::process::ChildStderr { |
| #[inline] |
| fn as_fd(&self) -> BorrowedFd<'_> { |
| self.as_inner().as_fd() |
| } |
| } |
| |
| #[stable(feature = "io_safety", since = "1.63.0")] |
| impl From<crate::process::ChildStderr> for OwnedFd { |
| /// Takes ownership of a [`ChildStderr`](crate::process::ChildStderr)'s file descriptor. |
| #[inline] |
| fn from(child_stderr: crate::process::ChildStderr) -> OwnedFd { |
| child_stderr.into_inner().into_inner() |
| } |
| } |
| |
| /// Creates a `ChildStderr` from the provided `OwnedFd`. |
| /// |
| /// The provided file descriptor must point to a pipe |
| /// with the `CLOEXEC` flag set. |
| #[stable(feature = "child_stream_from_fd", since = "1.74.0")] |
| impl From<OwnedFd> for process::ChildStderr { |
| #[inline] |
| fn from(fd: OwnedFd) -> process::ChildStderr { |
| let pipe = sys::pipe::AnonPipe::from_inner(fd); |
| process::ChildStderr::from_inner(pipe) |
| } |
| } |