diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index 25a0c41e90..b099181b99 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -4,6 +4,25 @@ use core::{ sync::atomic::{AtomicU32, Ordering}, }; +pub(crate) fn format_errno(errno: usize) -> [u8; 6] { + let mut buf = [0u8; 6]; + let mut n = errno; + let mut idx = 5; + if n == 0 { + buf[5] = b'0'; + return buf; + } + while n > 0 && idx > 0 { + buf[idx] = b'0' + (n % 10) as u8; + n /= 10; + idx -= 1; + } + let start = idx + 1; + let mut result = [0u8; 6]; + result[..6 - start].copy_from_slice(&buf[start..]); + result +} + use ioslice::IoSlice; use syscall::{ Call, CallFlags, EINVAL, ERESTART, StdFsCallKind, TimeSpec, @@ -598,8 +617,27 @@ pub fn open>(path: T, flags: usize) -> Result { flags, 0, ); - if posix_fd.is_err() { - let _ = syscall::write(2, b"RB_OPEN_DIAG open failed\n"); + if let Err(ref e) = posix_fd { + let p = path.as_ref(); + let mut buf = [0u8; 256]; + let prefix = b"RB_OPEN_DIAG err="; + let mut len = 0; + buf[..prefix.len()].copy_from_slice(prefix); + len += prefix.len(); + let errno_bytes = crate::format_errno(e.errno); + buf[len..len + errno_bytes.len()].copy_from_slice(&errno_bytes); + len += errno_bytes.len(); + buf[len] = b' '; + len += 1; + let pfx2 = b"path="; + buf[len..len + pfx2.len()].copy_from_slice(pfx2); + len += pfx2.len(); + let copy = (p.len()).min(buf.len() - len - 1); + buf[len..len + copy].copy_from_slice(&p.as_bytes()[..copy]); + len += copy; + buf[len] = b'\n'; + len += 1; + let _ = syscall::write(2, &buf[..len]); } let posix_fd = posix_fd?; register_external_fd(posix_fd)?;