1 use crate::std::io::{self, BorrowedCursor, IoSlice, IoSliceMut};
2 use crate::std::mem::ManuallyDrop;
3 use crate::std::os::unix::io::FromRawFd;
4 use crate::std::sys::fd::FileDesc;
5 use dlibc;
6
7 pub struct Stdin(());
8 pub struct Stdout(());
9 pub struct Stderr(());
10
11 impl Stdin {
new() -> Stdin12 pub const fn new() -> Stdin {
13 Stdin(())
14 }
15 }
16
17 impl io::Read for Stdin {
read(&mut self, buf: &mut [u8]) -> io::Result<usize>18 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
19 unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDIN_FILENO)).read(buf) }
20 }
21
read_buf(&mut self, buf: BorrowedCursor<'_>) -> io::Result<()>22 fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> io::Result<()> {
23 unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDIN_FILENO)).read_buf(buf) }
24 }
25
read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>26 fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
27 unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDIN_FILENO)).read_vectored(bufs) }
28 }
29
30 #[inline]
is_read_vectored(&self) -> bool31 fn is_read_vectored(&self) -> bool {
32 true
33 }
34 }
35
36 impl Stdout {
new() -> Stdout37 pub const fn new() -> Stdout {
38 Stdout(())
39 }
40 }
41
42 impl io::Write for Stdout {
write(&mut self, buf: &[u8]) -> io::Result<usize>43 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
44 unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDOUT_FILENO)).write(buf) }
45 }
46
write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>47 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
48 unsafe {
49 ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDOUT_FILENO)).write_vectored(bufs)
50 }
51 }
52
53 #[inline]
is_write_vectored(&self) -> bool54 fn is_write_vectored(&self) -> bool {
55 true
56 }
57
58 #[inline]
flush(&mut self) -> io::Result<()>59 fn flush(&mut self) -> io::Result<()> {
60 Ok(())
61 }
62 }
63
64 impl Stderr {
new() -> Stderr65 pub const fn new() -> Stderr {
66 Stderr(())
67 }
68 }
69
70 impl io::Write for Stderr {
write(&mut self, buf: &[u8]) -> io::Result<usize>71 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
72 unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDERR_FILENO)).write(buf) }
73 }
74
write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>75 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
76 unsafe {
77 ManuallyDrop::new(FileDesc::from_raw_fd(dlibc::STDERR_FILENO)).write_vectored(bufs)
78 }
79 }
80
81 #[inline]
is_write_vectored(&self) -> bool82 fn is_write_vectored(&self) -> bool {
83 true
84 }
85
86 #[inline]
flush(&mut self) -> io::Result<()>87 fn flush(&mut self) -> io::Result<()> {
88 Ok(())
89 }
90 }
91
is_ebadf(err: &io::Error) -> bool92 pub fn is_ebadf(err: &io::Error) -> bool {
93 err.raw_os_error() == Some(dlibc::EBADF as i32)
94 }
95
96 pub const STDIN_BUF_SIZE: usize = crate::std::sys_common::io::DEFAULT_BUF_SIZE;
97
panic_output() -> Option<impl io::Write>98 pub fn panic_output() -> Option<impl io::Write> {
99 Some(Stderr::new())
100 }
101