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 {
|
pub trait IntoOkOrErrno {
|
||||||
type Int: ReturnInt;
|
type Int: ReturnInt;
|
||||||
fn into_ok_or_errno(self) -> Self::Int;
|
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)]
|
#[repr(transparent)]
|
||||||
pub struct Fd(pub i32);
|
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> {
|
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) };
|
unsafe {
|
||||||
|
crate::syscall::syscall!(crate::syscall::SYS_OPEN, arg.as_raw(), flags).syscall_resultify()
|
||||||
if fd < 0 {
|
|
||||||
println!("fd: {fd}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
todo!()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const O_ACCMODE: i32 = 0o0003;
|
pub const O_ACCMODE: i32 = 0o0003;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@ pub use traits::IoWrite;
|
||||||
|
|
||||||
use core::ffi::c_char;
|
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 STDIN: i32 = 0;
|
||||||
pub const STDOUT: i32 = 1;
|
pub const STDOUT: i32 = 1;
|
||||||
|
|
@ -35,12 +38,7 @@ macro_rules! println {
|
||||||
pub use println;
|
pub use println;
|
||||||
|
|
||||||
pub unsafe fn sys_write(fd: i32, buf: &[u8]) -> Result<usize, Error> {
|
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;
|
syscall::syscall!(syscall::SYS_WRITE, fd, buf.as_ptr(), buf.len()).syscall_resultify()
|
||||||
if result < 0 {
|
|
||||||
Err(Error(result as _))
|
|
||||||
} else {
|
|
||||||
Ok(result as _)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn write_all(fd: i32, mut buf: &[u8]) -> Result<(), Error> {
|
pub unsafe fn write_all(fd: i32, mut buf: &[u8]) -> Result<(), Error> {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ pub use values::*;
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! syscall {
|
macro_rules! syscall {
|
||||||
($number:expr) => {{
|
($number:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rdi") $number,
|
in("rdi") $number,
|
||||||
|
|
@ -19,7 +19,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr) => {{
|
($number:expr, $arg1:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
@ -32,7 +32,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr, $arg2:expr) => {{
|
($number:expr, $arg1:expr, $arg2:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
@ -46,7 +46,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {{
|
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
@ -61,7 +61,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr) => {{
|
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
@ -77,7 +77,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {{
|
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
@ -94,7 +94,7 @@ macro_rules! syscall {
|
||||||
out
|
out
|
||||||
}};
|
}};
|
||||||
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {{
|
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {{
|
||||||
let out: i64;
|
let out: isize;
|
||||||
::core::arch::asm!(
|
::core::arch::asm!(
|
||||||
"syscall",
|
"syscall",
|
||||||
in("rax") $number,
|
in("rax") $number,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue