diff options
| author | Nicole L <dlegare.1001@gmail.com> | 2025-03-10 12:54:59 -0700 |
|---|---|---|
| committer | Nicole L <dlegare.1001@gmail.com> | 2025-03-10 12:54:59 -0700 |
| commit | f5dd3d13fc4685b2846f130f5e5b633c50cefc55 (patch) | |
| tree | a426d2cb00267e412a429fd77f8ee133d48c897c /library/std/src/sys/stdio | |
| parent | 0b1a7ab3393e59f59a0d53e66cccb195dadc378e (diff) | |
| download | rust-f5dd3d13fc4685b2846f130f5e5b633c50cefc55.tar.gz rust-f5dd3d13fc4685b2846f130f5e5b633c50cefc55.zip | |
Update Trusty support to account for recent libstd reorganization
Diffstat (limited to 'library/std/src/sys/stdio')
| -rw-r--r-- | library/std/src/sys/stdio/mod.rs | 3 | ||||
| -rw-r--r-- | library/std/src/sys/stdio/trusty.rs | 81 |
2 files changed, 84 insertions, 0 deletions
diff --git a/library/std/src/sys/stdio/mod.rs b/library/std/src/sys/stdio/mod.rs index 2a9167bfe96..336d4c8527d 100644 --- a/library/std/src/sys/stdio/mod.rs +++ b/library/std/src/sys/stdio/mod.rs @@ -19,6 +19,9 @@ cfg_if::cfg_if! { } else if #[cfg(target_os = "teeos")] { mod teeos; pub use teeos::*; + } else if #[cfg(target_os = "trusty")] { + mod trusty; + pub use trusty::*; } else if #[cfg(target_os = "uefi")] { mod uefi; pub use uefi::*; diff --git a/library/std/src/sys/stdio/trusty.rs b/library/std/src/sys/stdio/trusty.rs new file mode 100644 index 00000000000..d393e95394d --- /dev/null +++ b/library/std/src/sys/stdio/trusty.rs @@ -0,0 +1,81 @@ +use crate::io; + +pub struct Stdin; +pub struct Stdout; +pub struct Stderr; + +impl Stdin { + pub const fn new() -> Stdin { + Stdin + } +} + +impl io::Read for Stdin { + fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> { + Ok(0) + } +} + +impl Stdout { + pub const fn new() -> Stdout { + Stdout + } +} + +impl io::Write for Stdout { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + _write(libc::STDOUT_FILENO, buf) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +impl Stderr { + pub const fn new() -> Stderr { + Stderr + } +} + +impl io::Write for Stderr { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + _write(libc::STDERR_FILENO, buf) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +pub const STDIN_BUF_SIZE: usize = 0; + +pub fn is_ebadf(_err: &io::Error) -> bool { + true +} + +pub fn panic_output() -> Option<impl io::Write> { + Some(Stderr) +} + +fn _write(fd: i32, message: &[u8]) -> io::Result<usize> { + let mut iov = libc::iovec { iov_base: message.as_ptr() as *mut _, iov_len: message.len() }; + loop { + // SAFETY: syscall, safe arguments. + let ret = unsafe { libc::writev(fd, &iov, 1) }; + if ret < 0 { + return Err(io::Error::last_os_error()); + } + let ret = ret as usize; + if ret > iov.iov_len { + return Err(io::Error::last_os_error()); + } + if ret == iov.iov_len { + return Ok(message.len()); + } + // SAFETY: ret has been checked to be less than the length of + // the buffer + iov.iov_base = unsafe { iov.iov_base.add(ret) }; + iov.iov_len -= ret; + } +} |
