mirror of
https://github.com/Noratrieb/libuwuc.git
synced 2026-01-14 11:45:05 +01:00
more error handling
This commit is contained in:
parent
3829dddcea
commit
862ef8dc22
4 changed files with 54 additions and 21 deletions
|
|
@ -29,6 +29,42 @@ impl Debug for Error {
|
|||
}
|
||||
}
|
||||
|
||||
pub trait SyscallResultExt: Sized {
|
||||
fn syscall_resultify<N: FromSyscall>(self) -> Result<N, Error>;
|
||||
}
|
||||
|
||||
pub trait FromSyscall {
|
||||
fn from_isize(n: isize) -> Self;
|
||||
}
|
||||
|
||||
macro_rules! usize_int_impl {
|
||||
($($ty:ty)*) => {
|
||||
$(impl FromSyscall for $ty {
|
||||
fn from_isize(n: isize) -> Self {
|
||||
n as _
|
||||
}
|
||||
})*
|
||||
};
|
||||
}
|
||||
|
||||
usize_int_impl!(isize usize u64 i64 u32 i32);
|
||||
|
||||
impl FromSyscall for Fd {
|
||||
fn from_isize(n: isize) -> Self {
|
||||
Self(n as _)
|
||||
}
|
||||
}
|
||||
|
||||
impl SyscallResultExt for isize {
|
||||
fn syscall_resultify<N: FromSyscall>(self) -> Result<N, Error> {
|
||||
if (-4096..0).contains(&self) {
|
||||
Err(Error(-self as i32))
|
||||
} else {
|
||||
Ok(N::from_isize(self))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub trait IntoOkOrErrno {
|
||||
type Int: ReturnInt;
|
||||
fn into_ok_or_errno(self) -> Self::Int;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
use crate::{utils::SharedThinCstr, println, error::Error};
|
||||
use crate::{
|
||||
error::{Error, SyscallResultExt},
|
||||
utils::SharedThinCstr,
|
||||
};
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Fd(pub i32);
|
||||
|
|
@ -8,13 +11,9 @@ pub fn open(arg: SharedThinCstr<'_>, flags: i32) -> Result<Fd, Error> {
|
|||
}
|
||||
|
||||
pub fn sys_open(arg: SharedThinCstr<'_>, flags: i32) -> Result<Fd, Error> {
|
||||
let fd = unsafe { crate::syscall::syscall!(crate::syscall::SYS_OPEN, arg.as_raw(), flags) };
|
||||
|
||||
if fd < 0 {
|
||||
println!("fd: {fd}");
|
||||
unsafe {
|
||||
crate::syscall::syscall!(crate::syscall::SYS_OPEN, arg.as_raw(), flags).syscall_resultify()
|
||||
}
|
||||
|
||||
todo!()
|
||||
}
|
||||
|
||||
pub const O_ACCMODE: i32 = 0o0003;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,10 @@ pub use traits::IoWrite;
|
|||
|
||||
use core::ffi::c_char;
|
||||
|
||||
use crate::{error::Error, sys::syscall};
|
||||
use crate::{
|
||||
error::{Error, SyscallResultExt},
|
||||
sys::syscall,
|
||||
};
|
||||
|
||||
pub const STDIN: i32 = 0;
|
||||
pub const STDOUT: i32 = 1;
|
||||
|
|
@ -35,12 +38,7 @@ macro_rules! println {
|
|||
pub use println;
|
||||
|
||||
pub unsafe fn sys_write(fd: i32, buf: &[u8]) -> Result<usize, Error> {
|
||||
let result = syscall::syscall!(syscall::SYS_WRITE, fd, buf.as_ptr(), buf.len()) as i64;
|
||||
if result < 0 {
|
||||
Err(Error(result as _))
|
||||
} else {
|
||||
Ok(result as _)
|
||||
}
|
||||
syscall::syscall!(syscall::SYS_WRITE, fd, buf.as_ptr(), buf.len()).syscall_resultify()
|
||||
}
|
||||
|
||||
pub unsafe fn write_all(fd: i32, mut buf: &[u8]) -> Result<(), Error> {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ pub use values::*;
|
|||
#[macro_export]
|
||||
macro_rules! syscall {
|
||||
($number:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rdi") $number,
|
||||
|
|
@ -19,7 +19,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
@ -32,7 +32,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr, $arg2:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
@ -46,7 +46,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
@ -61,7 +61,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
@ -77,7 +77,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
@ -94,7 +94,7 @@ macro_rules! syscall {
|
|||
out
|
||||
}};
|
||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {{
|
||||
let out: i64;
|
||||
let out: isize;
|
||||
::core::arch::asm!(
|
||||
"syscall",
|
||||
in("rax") $number,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue