| use crate::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; | |
| use crate::sys::{AsInner, FromInner, IntoInner, io_slices, io_slices_mut, map_motor_error}; | |
| 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::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) | |
| } | |
| fn read_vectored(&mut self, bufs: &mut [io::IoSliceMut<'_>]) -> io::Result<usize> { | |
| moto_rt::fs::read_vectored(moto_rt::FD_STDIN, &mut io_slices_mut(bufs)) | |
| .map_err(map_motor_error) | |
| } | |
| fn is_read_vectored(&self) -> bool { | |
| true | |
| } | |
| } | |
| 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) | |
| } | |
| fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result<usize> { | |
| moto_rt::fs::write_vectored(moto_rt::FD_STDOUT, &io_slices(bufs)).map_err(map_motor_error) | |
| } | |
| fn is_write_vectored(&self) -> bool { | |
| true | |
| } | |
| } | |
| 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) | |
| } | |
| fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result<usize> { | |
| moto_rt::fs::write_vectored(moto_rt::FD_STDERR, &io_slices(bufs)).map_err(map_motor_error) | |
| } | |
| fn is_write_vectored(&self) -> bool { | |
| true | |
| } | |
| } | |
| 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::process::ChildPipe::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::process::ChildPipe::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::process::ChildPipe::from_inner(fd); | |
| process::ChildStderr::from_inner(pipe) | |
| } | |
| } |