99 lines
3.0 KiB
Rust
99 lines
3.0 KiB
Rust
use crate::{Error, WasiCtx};
|
|
use tracing::debug;
|
|
|
|
wiggle::from_witx!({
|
|
witx: ["$WASI_ROOT/phases/snapshot/witx/wasi_snapshot_preview1.witx"],
|
|
ctx: WasiCtx,
|
|
errors: { errno => Error },
|
|
});
|
|
|
|
use types::Errno;
|
|
|
|
impl wiggle::GuestErrorType for Errno {
|
|
fn success() -> Self {
|
|
Self::Success
|
|
}
|
|
}
|
|
|
|
impl types::GuestErrorConversion for WasiCtx {
|
|
fn into_errno(&self, e: wiggle::GuestError) -> Errno {
|
|
debug!("Guest error: {:?}", e);
|
|
e.into()
|
|
}
|
|
}
|
|
|
|
impl types::UserErrorConversion for WasiCtx {
|
|
fn errno_from_error(&self, e: Error) -> Errno {
|
|
debug!("Error: {:?}", e);
|
|
e.into()
|
|
}
|
|
}
|
|
|
|
impl From<Error> for Errno {
|
|
fn from(e: Error) -> Errno {
|
|
match e {
|
|
Error::Guest(e) => e.into(),
|
|
Error::TryFromInt(_) => Errno::Overflow,
|
|
Error::Utf8(_) => Errno::Ilseq,
|
|
Error::UnexpectedIo(_) => Errno::Io,
|
|
Error::GetRandom(_) => Errno::Io,
|
|
Error::TooBig => Errno::TooBig,
|
|
Error::Acces => Errno::Acces,
|
|
Error::Badf => Errno::Badf,
|
|
Error::Busy => Errno::Busy,
|
|
Error::Exist => Errno::Exist,
|
|
Error::Fault => Errno::Fault,
|
|
Error::Fbig => Errno::Fbig,
|
|
Error::Ilseq => Errno::Ilseq,
|
|
Error::Inval => Errno::Inval,
|
|
Error::Io => Errno::Io,
|
|
Error::Isdir => Errno::Isdir,
|
|
Error::Loop => Errno::Loop,
|
|
Error::Mfile => Errno::Mfile,
|
|
Error::Mlink => Errno::Mlink,
|
|
Error::Nametoolong => Errno::Nametoolong,
|
|
Error::Nfile => Errno::Nfile,
|
|
Error::Noent => Errno::Noent,
|
|
Error::Nomem => Errno::Nomem,
|
|
Error::Nospc => Errno::Nospc,
|
|
Error::Notdir => Errno::Notdir,
|
|
Error::Notempty => Errno::Notempty,
|
|
Error::Notsup => Errno::Notsup,
|
|
Error::Overflow => Errno::Overflow,
|
|
Error::Pipe => Errno::Pipe,
|
|
Error::Perm => Errno::Perm,
|
|
Error::Spipe => Errno::Spipe,
|
|
Error::Notcapable => Errno::Notcapable,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<wiggle::GuestError> for Errno {
|
|
fn from(err: wiggle::GuestError) -> Self {
|
|
use wiggle::GuestError::*;
|
|
match err {
|
|
InvalidFlagValue { .. } => Self::Inval,
|
|
InvalidEnumValue { .. } => Self::Inval,
|
|
PtrOverflow { .. } => Self::Fault,
|
|
PtrOutOfBounds { .. } => Self::Fault,
|
|
PtrNotAligned { .. } => Self::Inval,
|
|
PtrBorrowed { .. } => Self::Fault,
|
|
InvalidUtf8 { .. } => Self::Ilseq,
|
|
TryFromIntError { .. } => Self::Overflow,
|
|
InFunc { .. } => Self::Inval,
|
|
InDataField { .. } => Self::Inval,
|
|
SliceLengthsDiffer { .. } => Self::Fault,
|
|
BorrowCheckerOutOfHandles { .. } => Self::Fault,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl crate::fdpool::Fd for types::Fd {
|
|
fn as_raw(&self) -> u32 {
|
|
(*self).into()
|
|
}
|
|
fn from_raw(raw_fd: u32) -> Self {
|
|
Self::from(raw_fd)
|
|
}
|
|
}
|