diff options
| author | bors <bors@rust-lang.org> | 2025-03-10 04:32:14 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-03-10 04:32:14 +0000 |
| commit | 2c6a12ec44d0426c8939123c2f2cf27d2217de13 (patch) | |
| tree | ba0b33965ad6cdf14ba8d62b1988b9f244bea573 /library/std/src/sys/stdio/sgx.rs | |
| parent | c8a50720289378f735a0f6fc07cf5ee9dabab08c (diff) | |
| parent | c52e0596c5ef1d68bf0f283342fdb05db63248f9 (diff) | |
| download | rust-2c6a12ec44d0426c8939123c2f2cf27d2217de13.tar.gz rust-2c6a12ec44d0426c8939123c2f2cf27d2217de13.zip | |
Auto merge of #136780 - joboet:move_pal_stdio, r=Amanieu
std: move stdio to `sys` As per #117276, this moves the platform definitions of `Stdout` and friends into `sys`. This PR also unifies the UNIX and Hermit implementations and moves the `__rust_print_err` function needed by libunwind on SGX into the dedicated module for such helper functions.
Diffstat (limited to 'library/std/src/sys/stdio/sgx.rs')
| -rw-r--r-- | library/std/src/sys/stdio/sgx.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/library/std/src/sys/stdio/sgx.rs b/library/std/src/sys/stdio/sgx.rs new file mode 100644 index 00000000000..03d754cb217 --- /dev/null +++ b/library/std/src/sys/stdio/sgx.rs @@ -0,0 +1,70 @@ +use fortanix_sgx_abi as abi; + +use crate::io; +use crate::sys::fd::FileDesc; + +pub struct Stdin(()); +pub struct Stdout(()); +pub struct Stderr(()); + +fn with_std_fd<F: FnOnce(&FileDesc) -> R, R>(fd: abi::Fd, f: F) -> R { + let fd = FileDesc::new(fd); + let ret = f(&fd); + fd.into_raw(); + ret +} + +impl Stdin { + pub const fn new() -> Stdin { + Stdin(()) + } +} + +impl io::Read for Stdin { + fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { + with_std_fd(abi::FD_STDIN, |fd| fd.read(buf)) + } +} + +impl Stdout { + pub const fn new() -> Stdout { + Stdout(()) + } +} + +impl io::Write for Stdout { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + with_std_fd(abi::FD_STDOUT, |fd| fd.write(buf)) + } + + fn flush(&mut self) -> io::Result<()> { + with_std_fd(abi::FD_STDOUT, |fd| fd.flush()) + } +} + +impl Stderr { + pub const fn new() -> Stderr { + Stderr(()) + } +} + +impl io::Write for Stderr { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + with_std_fd(abi::FD_STDERR, |fd| fd.write(buf)) + } + + fn flush(&mut self) -> io::Result<()> { + with_std_fd(abi::FD_STDERR, |fd| fd.flush()) + } +} + +pub const STDIN_BUF_SIZE: usize = crate::sys::io::DEFAULT_BUF_SIZE; + +pub fn is_ebadf(err: &io::Error) -> bool { + // FIXME: Rust normally maps Unix EBADF to `Uncategorized` + err.raw_os_error() == Some(abi::Error::BrokenPipe as _) +} + +pub fn panic_output() -> Option<impl io::Write> { + crate::sys::pal::abi::panic::SgxPanicOutput::new() +} |
