202 lines
6.4 KiB
Rust
202 lines
6.4 KiB
Rust
use core::ffi::CStr;
|
|
|
|
macro static_cstr($string:literal) {
|
|
unsafe { ::core::ffi::CStr::from_bytes_with_nul_unchecked(concat!($string, "\0").as_bytes()) }
|
|
}
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
|
#[non_exhaustive]
|
|
#[repr(C)]
|
|
pub enum Errno {
|
|
ESUCCESS = 0,
|
|
EPERM = 1,
|
|
ENOENT = 2,
|
|
ESRCH = 3,
|
|
EINTR = 4,
|
|
EIO = 5,
|
|
ENXIO = 6,
|
|
E2BIG = 7,
|
|
ENOEXEC = 8,
|
|
EBADF = 9,
|
|
ECHILD = 10,
|
|
EAGAIN = 11,
|
|
ENOMEM = 12,
|
|
EACCES = 13,
|
|
EFAULT = 14,
|
|
ENOTBLK = 15,
|
|
EBUSY = 16,
|
|
EEXIST = 17,
|
|
EXDEV = 18,
|
|
ENODEV = 19,
|
|
ENOTDIR = 20,
|
|
EISDIR = 21,
|
|
EINVAL = 22,
|
|
ENFILE = 23,
|
|
EMFILE = 24,
|
|
ENOTTY = 25,
|
|
ETXTBSY = 26,
|
|
EFBIG = 27,
|
|
ENOSPC = 28,
|
|
ESPIPE = 29,
|
|
EROFS = 30,
|
|
EMLINK = 31,
|
|
EPIPE = 32,
|
|
EDOM = 33,
|
|
ERANGE = 34,
|
|
|
|
EDEADLK = 35,
|
|
ENAMETOOLONG = 36,
|
|
ENOLCK = 37,
|
|
|
|
ENOSYS = 38,
|
|
ENOTEMPTY = 39,
|
|
ELOOP = 40,
|
|
|
|
ENOTSOCK = 41,
|
|
EDESTADDRREQ = 42,
|
|
EMSGSIZE = 43,
|
|
EPROTOTYPE = 44,
|
|
ENOPROTOOPT = 45,
|
|
EPROTONOSUPPORT = 46,
|
|
ESOCKTNOSUPPORT = 47,
|
|
EOPNOTSUPP = 48,
|
|
EPFNOSUPPORT = 49,
|
|
EAFNOSUPPORT = 50,
|
|
EADDRINUSE = 51,
|
|
EADDRNOTAVAIL = 52,
|
|
ENETDOWN = 53,
|
|
ENETUNREACH = 54,
|
|
ENETRESET = 55,
|
|
ECONNABORTED = 56,
|
|
ECONNRESET = 57,
|
|
ENOBUFS = 58,
|
|
EISCONN = 59,
|
|
ENOTCONN = 60,
|
|
ESHUTDOWN = 61,
|
|
ETIMEDOUT = 62,
|
|
ECONNREFUSED = 63,
|
|
EHOSTDOWN = 64,
|
|
EHOSTUNREACH = 65,
|
|
// Custom errnos
|
|
ENOTSUPP = 66,
|
|
ETIMEOUT = 67,
|
|
}
|
|
|
|
static UNKNOWN_ERROR: &CStr = static_cstr!("Unknown error");
|
|
static ERRNO_STRINGS: &[&CStr] = &[
|
|
static_cstr!("No error"),
|
|
static_cstr!("Operation not permitted"),
|
|
static_cstr!("No such file or directory"),
|
|
static_cstr!("No such process"),
|
|
static_cstr!("Interrupted system call"),
|
|
static_cstr!("I/O error"),
|
|
static_cstr!("No such device or address"),
|
|
static_cstr!("Argument list too long"),
|
|
static_cstr!("Exec format error"),
|
|
static_cstr!("Bad file number"),
|
|
static_cstr!("No child process"),
|
|
static_cstr!("Try again"),
|
|
static_cstr!("Out of memory"),
|
|
static_cstr!("Permission denied"),
|
|
static_cstr!("Bad address"),
|
|
static_cstr!("Block device required"),
|
|
static_cstr!("Device or resource busy"),
|
|
static_cstr!("File exists"),
|
|
static_cstr!("Cross-device link"),
|
|
static_cstr!("No such device"),
|
|
static_cstr!("Not a directory"),
|
|
static_cstr!("Is a directory"),
|
|
static_cstr!("Invalid argument"),
|
|
static_cstr!("File table overflow"),
|
|
static_cstr!("Too many open files"),
|
|
static_cstr!("Not a typewriter"),
|
|
static_cstr!("Text file busy"),
|
|
static_cstr!("File too large"),
|
|
static_cstr!("No space left on device"),
|
|
static_cstr!("Illegal seek"),
|
|
static_cstr!("Read-only file system"),
|
|
static_cstr!("Too many links"),
|
|
static_cstr!("Broken pipe"),
|
|
static_cstr!("Math argument out of domain of func"),
|
|
static_cstr!("Math result not representable"),
|
|
static_cstr!("Resource deadlock would occur"),
|
|
static_cstr!("File name too long"),
|
|
static_cstr!("No record locks available"),
|
|
static_cstr!("Invalid system call number"),
|
|
static_cstr!("Directory not empty"),
|
|
static_cstr!("Too many symbolic links encountered"),
|
|
static_cstr!("Socket operation on non-socket"),
|
|
static_cstr!("Destination address required"),
|
|
static_cstr!("Message too long"),
|
|
static_cstr!("Protocol wrong type for socket"),
|
|
static_cstr!("Protocol not available"),
|
|
static_cstr!("Protocol not supported"),
|
|
static_cstr!("Socket type not supported"),
|
|
static_cstr!("Operation not supported on transport endpoint"),
|
|
static_cstr!("Protocol family not supported"),
|
|
static_cstr!("Address family not supported by protocol"),
|
|
static_cstr!("Address already in use"),
|
|
static_cstr!("Cannot assign requested address"),
|
|
static_cstr!("Network is down"),
|
|
static_cstr!("Network is unreachable"),
|
|
static_cstr!("Network dropped connection because of reset"),
|
|
static_cstr!("Software caused connection abort"),
|
|
static_cstr!("Connection reset by peer"),
|
|
static_cstr!("No buffer space available"),
|
|
static_cstr!("Transport endpoint is already connected"),
|
|
static_cstr!("Transport endpoint is not connected"),
|
|
static_cstr!("Cannot send after transport endpoint shutdown"),
|
|
static_cstr!("Connection timed out"),
|
|
static_cstr!("Connection refused"),
|
|
static_cstr!("Host is down"),
|
|
static_cstr!("No route to host"),
|
|
// Custom errnos
|
|
static_cstr!("Operation not supported"),
|
|
static_cstr!("Operation timed out"),
|
|
];
|
|
|
|
impl Errno {
|
|
pub fn to_c_str(self) -> &'static CStr {
|
|
let index = self as usize;
|
|
ERRNO_STRINGS.get(index).copied().unwrap_or(UNKNOWN_ERROR)
|
|
}
|
|
}
|
|
|
|
impl From<yggdrasil_rt::Error> for Errno {
|
|
fn from(value: yggdrasil_rt::Error) -> Self {
|
|
use yggdrasil_rt::Error;
|
|
|
|
match value {
|
|
Error::OutOfMemory => Errno::ENOMEM,
|
|
Error::AlreadyExists => Errno::EEXIST,
|
|
Error::NotImplemented => Errno::ENOTSUPP,
|
|
Error::DoesNotExist => Errno::ENOENT,
|
|
Error::InvalidFile => Errno::EBADF,
|
|
Error::InvalidArgument => Errno::EINVAL,
|
|
Error::Interrupted => Errno::EINTR,
|
|
Error::WouldBlock => Errno::EAGAIN,
|
|
Error::UnrecognizedExecutable => Errno::ENOEXEC,
|
|
Error::InvalidOperation => Errno::EPERM,
|
|
Error::InvalidMemoryOperation => Errno::EPERM,
|
|
Error::NotADirectory => Errno::ENOTDIR,
|
|
Error::IsADirectory => Errno::EISDIR,
|
|
Error::ReadOnly => Errno::EROFS,
|
|
Error::PermissionDenied => Errno::EACCES,
|
|
Error::AddrInUse => Errno::EADDRINUSE,
|
|
Error::QueueFull => Errno::ENOBUFS,
|
|
Error::BufferTooSmall => Errno::ENOMEM,
|
|
Error::ConnectionReset => Errno::ECONNRESET,
|
|
Error::MissingData => Errno::EINVAL,
|
|
Error::NetworkUnreachable => Errno::ENETUNREACH,
|
|
Error::TimedOut => Errno::ETIMEOUT,
|
|
Error::ConnectionRefused => Errno::ECONNREFUSED,
|
|
Error::HostUnreachable => Errno::EHOSTUNREACH,
|
|
Error::UndefinedSyscall => Errno::ENOSYS,
|
|
Error::DirectoryNotEmpty => Errno::ENOTEMPTY,
|
|
Error::NotConnected => Errno::ENOTCONN,
|
|
Error::ProcessNotFound => Errno::ESRCH,
|
|
Error::CrossDeviceLink => Errno::EXDEV,
|
|
}
|
|
}
|
|
}
|