1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
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) -> Result<Errno, String> { debug!("Error: {:?}", e); Ok(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) } }