]>
Commit | Line | Data |
---|---|---|
48663c56 | 1 | use crate::io::{self, IoSlice, IoSliceMut}; |
532ac7d7 XL |
2 | use crate::mem::ManuallyDrop; |
3 | use crate::sys::fd::WasiFd; | |
4 | ||
5 | pub struct Stdin; | |
6 | pub struct Stdout; | |
7 | pub struct Stderr; | |
8 | ||
9 | impl Stdin { | |
10 | pub fn new() -> io::Result<Stdin> { | |
11 | Ok(Stdin) | |
12 | } | |
13 | ||
f035d41b XL |
14 | #[inline] |
15 | pub fn as_raw_fd(&self) -> u32 { | |
16 | 0 | |
17 | } | |
18 | } | |
19 | ||
20 | impl io::Read for Stdin { | |
21 | fn read(&mut self, data: &mut [u8]) -> io::Result<usize> { | |
48663c56 XL |
22 | self.read_vectored(&mut [IoSliceMut::new(data)]) |
23 | } | |
24 | ||
f035d41b | 25 | fn read_vectored(&mut self, data: &mut [IoSliceMut<'_>]) -> io::Result<usize> { |
60c5eb7d XL |
26 | ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).read(data) |
27 | } | |
28 | ||
f9f354fc | 29 | #[inline] |
f035d41b | 30 | fn is_read_vectored(&self) -> bool { |
f9f354fc XL |
31 | true |
32 | } | |
532ac7d7 XL |
33 | } |
34 | ||
35 | impl Stdout { | |
36 | pub fn new() -> io::Result<Stdout> { | |
37 | Ok(Stdout) | |
38 | } | |
39 | ||
f035d41b XL |
40 | #[inline] |
41 | pub fn as_raw_fd(&self) -> u32 { | |
42 | 1 | |
43 | } | |
44 | } | |
45 | ||
46 | impl io::Write for Stdout { | |
47 | fn write(&mut self, data: &[u8]) -> io::Result<usize> { | |
48663c56 XL |
48 | self.write_vectored(&[IoSlice::new(data)]) |
49 | } | |
50 | ||
f035d41b | 51 | fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> { |
60c5eb7d | 52 | ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).write(data) |
532ac7d7 XL |
53 | } |
54 | ||
f9f354fc | 55 | #[inline] |
f035d41b | 56 | fn is_write_vectored(&self) -> bool { |
f9f354fc XL |
57 | true |
58 | } | |
f035d41b | 59 | fn flush(&mut self) -> io::Result<()> { |
532ac7d7 XL |
60 | Ok(()) |
61 | } | |
62 | } | |
63 | ||
64 | impl Stderr { | |
65 | pub fn new() -> io::Result<Stderr> { | |
66 | Ok(Stderr) | |
67 | } | |
68 | ||
f9f354fc | 69 | #[inline] |
60c5eb7d XL |
70 | pub fn as_raw_fd(&self) -> u32 { |
71 | 2 | |
72 | } | |
532ac7d7 XL |
73 | } |
74 | ||
75 | impl io::Write for Stderr { | |
76 | fn write(&mut self, data: &[u8]) -> io::Result<usize> { | |
f035d41b XL |
77 | self.write_vectored(&[IoSlice::new(data)]) |
78 | } | |
79 | ||
80 | fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> { | |
81 | ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).write(data) | |
82 | } | |
83 | ||
84 | #[inline] | |
85 | fn is_write_vectored(&self) -> bool { | |
86 | true | |
532ac7d7 XL |
87 | } |
88 | ||
89 | fn flush(&mut self) -> io::Result<()> { | |
f035d41b | 90 | Ok(()) |
532ac7d7 XL |
91 | } |
92 | } | |
93 | ||
94 | pub const STDIN_BUF_SIZE: usize = crate::sys_common::io::DEFAULT_BUF_SIZE; | |
95 | ||
96 | pub fn is_ebadf(err: &io::Error) -> bool { | |
60c5eb7d | 97 | err.raw_os_error() == Some(wasi::ERRNO_BADF.into()) |
532ac7d7 XL |
98 | } |
99 | ||
100 | pub fn panic_output() -> Option<impl io::Write> { | |
101 | Stderr::new().ok() | |
102 | } |