]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/unix/stdio.rs
Rollup merge of #84320 - jsha:details-implementors, r=Manishearth,Nemo157,GuillaumeGomez
[rust.git] / library / std / src / sys / unix / stdio.rs
1 use crate::io::{self, IoSlice, IoSliceMut};
2 use crate::mem::ManuallyDrop;
3 use crate::sys::fd::FileDesc;
4
5 pub struct Stdin(());
6 pub struct Stdout(());
7 pub struct Stderr(());
8
9 impl Stdin {
10     pub const fn new() -> Stdin {
11         Stdin(())
12     }
13 }
14
15 impl io::Read for Stdin {
16     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
17         ManuallyDrop::new(FileDesc::new(libc::STDIN_FILENO)).read(buf)
18     }
19
20     fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
21         ManuallyDrop::new(FileDesc::new(libc::STDIN_FILENO)).read_vectored(bufs)
22     }
23
24     #[inline]
25     fn is_read_vectored(&self) -> bool {
26         true
27     }
28 }
29
30 impl Stdout {
31     pub const fn new() -> Stdout {
32         Stdout(())
33     }
34 }
35
36 impl io::Write for Stdout {
37     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
38         ManuallyDrop::new(FileDesc::new(libc::STDOUT_FILENO)).write(buf)
39     }
40
41     fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
42         ManuallyDrop::new(FileDesc::new(libc::STDOUT_FILENO)).write_vectored(bufs)
43     }
44
45     #[inline]
46     fn is_write_vectored(&self) -> bool {
47         true
48     }
49
50     fn flush(&mut self) -> io::Result<()> {
51         Ok(())
52     }
53 }
54
55 impl Stderr {
56     pub const fn new() -> Stderr {
57         Stderr(())
58     }
59 }
60
61 impl io::Write for Stderr {
62     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
63         ManuallyDrop::new(FileDesc::new(libc::STDERR_FILENO)).write(buf)
64     }
65
66     fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
67         ManuallyDrop::new(FileDesc::new(libc::STDERR_FILENO)).write_vectored(bufs)
68     }
69
70     #[inline]
71     fn is_write_vectored(&self) -> bool {
72         true
73     }
74
75     fn flush(&mut self) -> io::Result<()> {
76         Ok(())
77     }
78 }
79
80 pub fn is_ebadf(err: &io::Error) -> bool {
81     err.raw_os_error() == Some(libc::EBADF as i32)
82 }
83
84 pub const STDIN_BUF_SIZE: usize = crate::sys_common::io::DEFAULT_BUF_SIZE;
85
86 pub fn panic_output() -> Option<impl io::Write> {
87     Some(Stderr::new())
88 }