diag: include path and errno in open() diagnostic

This commit is contained in:
Red Bear OS
2026-07-13 23:33:21 +03:00
parent 1c3b19e5f6
commit 0d52729be0
+40 -2
View File
@@ -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<T: AsRef<str>>(path: T, flags: usize) -> Result<usize> {
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)?;