diag: include path and errno in open() diagnostic
This commit is contained in:
+40
-2
@@ -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)?;
|
||||
|
||||
Reference in New Issue
Block a user