]> git.proxmox.com Git - rustc.git/blame - src/libstd/sys/wasi/stdio.rs
New upstream version 1.46.0~beta.2+dfsg1
[rustc.git] / src / libstd / sys / wasi / stdio.rs
CommitLineData
48663c56 1use crate::io::{self, IoSlice, IoSliceMut};
532ac7d7
XL
2use crate::mem::ManuallyDrop;
3use crate::sys::fd::WasiFd;
4
5pub struct Stdin;
6pub struct Stdout;
7pub struct Stderr;
8
9impl 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
20impl 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
35impl 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
46impl 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
64impl 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
75impl 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
94pub const STDIN_BUF_SIZE: usize = crate::sys_common::io::DEFAULT_BUF_SIZE;
95
96pub fn is_ebadf(err: &io::Error) -> bool {
60c5eb7d 97 err.raw_os_error() == Some(wasi::ERRNO_BADF.into())
532ac7d7
XL
98}
99
100pub fn panic_output() -> Option<impl io::Write> {
101 Stderr::new().ok()
102}