shadow_rs/utility/
syscall.rs

1use shadow_shim_helper_rs::syscall_types::SyscallReg;
2
3// Linux reserves -1 through -4095 for errors. See
4// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_64/sysdep.h;h=24d8b8ec20a55824a4806f8821ecba2622d0fe8e;hb=HEAD#l41
5const MAX_ERRNO: i64 = 4095;
6
7pub fn raw_return_value_to_errno(rv: i64) -> Result<SyscallReg, i32> {
8    if (-MAX_ERRNO..=-1).contains(&rv) {
9        return Err(-rv as i32);
10    }
11    Ok(rv.into())
12}
13
14pub fn raw_return_value_to_result(rv: i64) -> Result<SyscallReg, linux_api::errno::Errno> {
15    if let Ok(rv) = u16::try_from(-rv) {
16        if let Ok(errno) = linux_api::errno::Errno::try_from(rv) {
17            return Err(errno);
18        }
19    }
20
21    Ok(rv.into())
22}