xref: /drstd/src/std/sys/unix/stdio.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
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