// SPDX-FileCopyrightText: edef // SPDX-License-Identifier: OSL-3.0 use { super::SyscallArg, std::fmt::{self, Debug}, }; #[derive(Clone, Copy, Eq, PartialEq)] pub(crate) struct FileDesc(i32); impl Debug for FileDesc { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) } } impl SyscallArg for FileDesc { fn try_from_reg(reg: u64) -> Option { Some(match i32::try_from_reg(reg)? { fd @ 0..=i32::MAX => FileDesc(fd), _ => return None, }) } } impl SyscallArg for Option { fn try_from_reg(reg: u64) -> Option { Some(match i32::try_from_reg(reg)? { -1 => None, fd @ 0..=i32::MAX => Some(FileDesc(fd)), _ => return None, }) } } #[derive(Clone, Copy, Eq, PartialEq)] pub(crate) enum DirFd { Cwd, Fd(FileDesc), } const AT_FDCWD: i32 = -100; impl Debug for DirFd { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { DirFd::Cwd => write!(f, "AT_FDCWD"), DirFd::Fd(FileDesc(fd)) => write!(f, "{fd}"), } } } impl SyscallArg for DirFd { fn try_from_reg(reg: u64) -> Option { Some(match i32::try_from_reg(reg)? { AT_FDCWD => Self::Cwd, fd @ 0..=i32::MAX => DirFd::Fd(FileDesc(fd)), _ => return None, }) } }