| #[expect(dead_code)] | |
| #[path = "unsupported.rs"] | |
| mod unsupported_stdio; | |
| use crate::cmp; | |
| use crate::io::{self, IoSlice}; | |
| pub type Stdin = unsupported_stdio::Stdin; | |
| pub struct Stdout; | |
| pub struct Stderr; | |
| impl Stdout { | |
| pub const fn new() -> Stdout { | |
| Stdout | |
| } | |
| } | |
| impl io::Write for Stdout { | |
| fn write(&mut self, buf: &[u8]) -> io::Result<usize> { | |
| write(libc::STDOUT_FILENO, buf) | |
| } | |
| fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { | |
| write_vectored(libc::STDOUT_FILENO, bufs) | |
| } | |
| #[inline] | |
| fn is_write_vectored(&self) -> bool { | |
| true | |
| } | |
| fn flush(&mut self) -> io::Result<()> { | |
| Ok(()) | |
| } | |
| } | |
| impl Stderr { | |
| pub const fn new() -> Stderr { | |
| Stderr | |
| } | |
| } | |
| impl io::Write for Stderr { | |
| fn write(&mut self, buf: &[u8]) -> io::Result<usize> { | |
| write(libc::STDERR_FILENO, buf) | |
| } | |
| fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { | |
| write_vectored(libc::STDERR_FILENO, bufs) | |
| } | |
| #[inline] | |
| fn is_write_vectored(&self) -> bool { | |
| true | |
| } | |
| fn flush(&mut self) -> io::Result<()> { | |
| Ok(()) | |
| } | |
| } | |
| pub const STDIN_BUF_SIZE: usize = unsupported_stdio::STDIN_BUF_SIZE; | |
| pub fn is_ebadf(_err: &io::Error) -> bool { | |
| true | |
| } | |
| pub fn panic_output() -> Option<impl io::Write> { | |
| Some(Stderr) | |
| } | |
| fn write(fd: i32, buf: &[u8]) -> io::Result<usize> { | |
| let iov = libc::iovec { iov_base: buf.as_ptr() as *mut _, iov_len: buf.len() }; | |
| // SAFETY: syscall, safe arguments. | |
| let ret = unsafe { libc::writev(fd, &iov, 1) }; | |
| // This check includes ret < 0, since the length is at most isize::MAX. | |
| if ret as usize > iov.iov_len { | |
| return Err(io::Error::last_os_error()); | |
| } | |
| Ok(ret as usize) | |
| } | |
| fn write_vectored(fd: i32, bufs: &[IoSlice<'_>]) -> io::Result<usize> { | |
| let iov = bufs.as_ptr() as *const libc::iovec; | |
| let len = cmp::min(bufs.len(), libc::c_int::MAX as usize) as libc::c_int; | |
| // SAFETY: syscall, safe arguments. | |
| let ret = unsafe { libc::writev(fd, iov, len) }; | |
| if ret < 0 { | |
| return Err(io::Error::last_os_error()); | |
| } | |
| Ok(ret as usize) | |
| } |