xref: /drstd/src/std/sys/wasi/stdio.rs (revision 0fe3ff0054d3aec7fbf9bddecfecb10bc7d23a51)
1 #![deny(unsafe_op_in_unsafe_fn)]
2 
3 use super::fd::WasiFd;
4 use crate::std::io::{self, IoSlice, IoSliceMut};
5 use crate::std::mem::ManuallyDrop;
6 use crate::std::os::raw;
7 use crate::std::os::wasi::io::{AsRawFd, FromRawFd};
8 
9 pub struct Stdin;
10 pub struct Stdout;
11 pub struct Stderr;
12 
13 impl Stdin {
14     pub const fn new() -> Stdin {
15         Stdin
16     }
17 }
18 
19 impl AsRawFd for Stdin {
20     #[inline]
21     fn as_raw_fd(&self) -> raw::c_int {
22         0
23     }
24 }
25 
26 impl io::Read for Stdin {
27     fn read(&mut self, data: &mut [u8]) -> io::Result<usize> {
28         self.read_vectored(&mut [IoSliceMut::new(data)])
29     }
30 
31     fn read_vectored(&mut self, data: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
32         ManuallyDrop::new(unsafe { WasiFd::from_raw_fd(self.as_raw_fd()) }).read(data)
33     }
34 
35     #[inline]
36     fn is_read_vectored(&self) -> bool {
37         true
38     }
39 }
40 
41 impl Stdout {
42     pub const fn new() -> Stdout {
43         Stdout
44     }
45 }
46 
47 impl AsRawFd for Stdout {
48     #[inline]
49     fn as_raw_fd(&self) -> raw::c_int {
50         1
51     }
52 }
53 
54 impl io::Write for Stdout {
55     fn write(&mut self, data: &[u8]) -> io::Result<usize> {
56         self.write_vectored(&[IoSlice::new(data)])
57     }
58 
59     fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
60         ManuallyDrop::new(unsafe { WasiFd::from_raw_fd(self.as_raw_fd()) }).write(data)
61     }
62 
63     #[inline]
64     fn is_write_vectored(&self) -> bool {
65         true
66     }
67     fn flush(&mut self) -> io::Result<()> {
68         Ok(())
69     }
70 }
71 
72 impl Stderr {
73     pub const fn new() -> Stderr {
74         Stderr
75     }
76 }
77 
78 impl AsRawFd for Stderr {
79     #[inline]
80     fn as_raw_fd(&self) -> raw::c_int {
81         2
82     }
83 }
84 
85 impl io::Write for Stderr {
86     fn write(&mut self, data: &[u8]) -> io::Result<usize> {
87         self.write_vectored(&[IoSlice::new(data)])
88     }
89 
90     fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
91         ManuallyDrop::new(unsafe { WasiFd::from_raw_fd(self.as_raw_fd()) }).write(data)
92     }
93 
94     #[inline]
95     fn is_write_vectored(&self) -> bool {
96         true
97     }
98 
99     fn flush(&mut self) -> io::Result<()> {
100         Ok(())
101     }
102 }
103 
104 pub const STDIN_BUF_SIZE: usize = crate::std::sys_common::io::DEFAULT_BUF_SIZE;
105 
106 pub fn is_ebadf(err: &io::Error) -> bool {
107     err.raw_os_error() == Some(wasi::ERRNO_BADF.raw().into())
108 }
109 
110 pub fn panic_output() -> Option<impl io::Write> {
111     Some(Stderr::new())
112 }
113