1*91e9d4abSLoGin #![no_std] 2*91e9d4abSLoGin 3*91e9d4abSLoGin use num_derive::{FromPrimitive, ToPrimitive}; 4*91e9d4abSLoGin 5*91e9d4abSLoGin #[repr(i32)] 6*91e9d4abSLoGin #[derive(Debug, FromPrimitive, ToPrimitive, PartialEq, Eq, Clone)] 7*91e9d4abSLoGin #[allow(dead_code, non_camel_case_types)] 8*91e9d4abSLoGin pub enum SystemError { 9*91e9d4abSLoGin /// 操作不被允许 Operation not permitted. 10*91e9d4abSLoGin EPERM = 1, 11*91e9d4abSLoGin /// 没有指定的文件或目录 No such file or directory. 12*91e9d4abSLoGin ENOENT = 2, 13*91e9d4abSLoGin /// 没有这样的进程 No such process. 14*91e9d4abSLoGin ESRCH = 3, 15*91e9d4abSLoGin /// 被中断的函数 Interrupted function. 16*91e9d4abSLoGin EINTR = 4, 17*91e9d4abSLoGin /// I/O错误 I/O error. 18*91e9d4abSLoGin EIO = 5, 19*91e9d4abSLoGin /// 没有这样的设备或地址 No such device or address. 20*91e9d4abSLoGin ENXIO = 6, 21*91e9d4abSLoGin /// 参数列表过长,或者在输出buffer中缺少空间 或者参数比系统内建的最大值要大 Argument list too long. 22*91e9d4abSLoGin E2BIG = 7, 23*91e9d4abSLoGin /// 可执行文件格式错误 Executable file format error 24*91e9d4abSLoGin ENOEXEC = 8, 25*91e9d4abSLoGin /// 错误的文件描述符 Bad file descriptor. 26*91e9d4abSLoGin EBADF = 9, 27*91e9d4abSLoGin /// 没有子进程 No child processes. 28*91e9d4abSLoGin ECHILD = 10, 29*91e9d4abSLoGin /// 资源不可用,请重试。 Resource unavailable, try again.(may be the same value as [EWOULDBLOCK]) 30*91e9d4abSLoGin /// 31*91e9d4abSLoGin /// 操作将被禁止 Operation would block.(may be the same value as [EAGAIN]). 32*91e9d4abSLoGin EAGAIN_OR_EWOULDBLOCK = 11, 33*91e9d4abSLoGin /// 没有足够的空间 Not enough space. 34*91e9d4abSLoGin ENOMEM = 12, 35*91e9d4abSLoGin /// 访问被拒绝 Permission denied 36*91e9d4abSLoGin EACCES = 13, 37*91e9d4abSLoGin /// 错误的地址 Bad address 38*91e9d4abSLoGin EFAULT = 14, 39*91e9d4abSLoGin /// 需要块设备 Block device required 40*91e9d4abSLoGin ENOTBLK = 15, 41*91e9d4abSLoGin /// 设备或资源忙 Device or resource busy. 42*91e9d4abSLoGin EBUSY = 16, 43*91e9d4abSLoGin /// 文件已存在 File exists. 44*91e9d4abSLoGin EEXIST = 17, 45*91e9d4abSLoGin /// 跨设备连接 Cross-device link. 46*91e9d4abSLoGin EXDEV = 18, 47*91e9d4abSLoGin /// 没有指定的设备 No such device. 48*91e9d4abSLoGin ENODEV = 19, 49*91e9d4abSLoGin /// 不是目录 Not a directory. 50*91e9d4abSLoGin ENOTDIR = 20, 51*91e9d4abSLoGin /// 是一个目录 Is a directory 52*91e9d4abSLoGin EISDIR = 21, 53*91e9d4abSLoGin /// 不可用的参数 Invalid argument. 54*91e9d4abSLoGin EINVAL = 22, 55*91e9d4abSLoGin /// 系统中打开的文件过多 Too many files open in system. 56*91e9d4abSLoGin ENFILE = 23, 57*91e9d4abSLoGin /// 文件描述符的值过大 File descriptor value too large. 58*91e9d4abSLoGin EMFILE = 24, 59*91e9d4abSLoGin /// 不正确的I/O控制操作 Inappropriate I/O control operation. 60*91e9d4abSLoGin ENOTTY = 25, 61*91e9d4abSLoGin /// 文本文件忙 Text file busy. 62*91e9d4abSLoGin ETXTBSY = 26, 63*91e9d4abSLoGin /// 文件太大 File too large. 64*91e9d4abSLoGin EFBIG = 27, 65*91e9d4abSLoGin /// 设备上没有空间 No space left on device. 66*91e9d4abSLoGin ENOSPC = 28, 67*91e9d4abSLoGin /// 错误的寻道.当前文件是pipe,不允许seek请求 Invalid seek. 68*91e9d4abSLoGin ESPIPE = 29, 69*91e9d4abSLoGin /// 只读的文件系统 Read-only file system. 70*91e9d4abSLoGin EROFS = 30, 71*91e9d4abSLoGin /// 链接数过多 Too many links. 72*91e9d4abSLoGin EMLINK = 31, 73*91e9d4abSLoGin /// 断开的管道 Broken pipe. 74*91e9d4abSLoGin EPIPE = 32, 75*91e9d4abSLoGin /// 数学参数超出作用域 Mathematics argument out of domain of function. 76*91e9d4abSLoGin EDOM = 33, 77*91e9d4abSLoGin /// 结果过大 Result too large. 78*91e9d4abSLoGin ERANGE = 34, 79*91e9d4abSLoGin /// 资源死锁将要发生 Resource deadlock would occur. 80*91e9d4abSLoGin EDEADLK = 35, 81*91e9d4abSLoGin /// 文件名过长 Filename too long. 82*91e9d4abSLoGin ENAMETOOLONG = 36, 83*91e9d4abSLoGin /// 没有可用的锁 No locks available. 84*91e9d4abSLoGin ENOLCK = 37, 85*91e9d4abSLoGin /// 功能不支持 Function not supported. 86*91e9d4abSLoGin ENOSYS = 38, 87*91e9d4abSLoGin /// 目录非空 Directory not empty. 88*91e9d4abSLoGin ENOTEMPTY = 39, 89*91e9d4abSLoGin /// 符号链接级别过多 Too many levels of symbolic links. 90*91e9d4abSLoGin ELOOP = 40, 91*91e9d4abSLoGin /// 没有期待类型的消息 No message of the desired type. 92*91e9d4abSLoGin ENOMSG = 41, 93*91e9d4abSLoGin /// 标志符被移除 Identifier removed. 94*91e9d4abSLoGin EIDRM = 42, 95*91e9d4abSLoGin /// 通道号超出范围 Channel number out of range 96*91e9d4abSLoGin ECHRNG = 43, 97*91e9d4abSLoGin /// 二级不同步 Level 2 not synchronized 98*91e9d4abSLoGin EL2NSYNC = 44, 99*91e9d4abSLoGin /// 三级暂停 Level 3 halted 100*91e9d4abSLoGin EL3HLT = 45, 101*91e9d4abSLoGin /// 三级重置 Level 3 reset 102*91e9d4abSLoGin EL3RST = 46, 103*91e9d4abSLoGin /// 链接号超出范围 Link number out of range 104*91e9d4abSLoGin ELNRNG = 47, 105*91e9d4abSLoGin /// 未连接协议驱动程序 Protocol driver not attached 106*91e9d4abSLoGin EUNATCH = 48, 107*91e9d4abSLoGin /// 没有可用的CSI结构 No CSI structure available 108*91e9d4abSLoGin ENOCSI = 49, 109*91e9d4abSLoGin /// 二级暂停 Level 2 halted 110*91e9d4abSLoGin EL2HLT = 50, 111*91e9d4abSLoGin /// 无效交换 Invalid exchange 112*91e9d4abSLoGin EBADE = 51, 113*91e9d4abSLoGin /// 无效的请求描述符 Invalid request descriptor 114*91e9d4abSLoGin EBADR = 52, 115*91e9d4abSLoGin /// 交换满 Exchange full 116*91e9d4abSLoGin EXFULL = 53, 117*91e9d4abSLoGin /// 无阳极 No anode 118*91e9d4abSLoGin ENOANO = 54, 119*91e9d4abSLoGin /// 请求码无效 Invalid request code 120*91e9d4abSLoGin EBADRQC = 55, 121*91e9d4abSLoGin /// 无效插槽 Invalid slot 122*91e9d4abSLoGin EBADSLT = 56, 123*91e9d4abSLoGin /// 资源死锁 Resource deadlock would occur 124*91e9d4abSLoGin EDEADLOCK = 57, 125*91e9d4abSLoGin /// 错误的字体文件格式 Bad font file format 126*91e9d4abSLoGin EBFONT = 58, 127*91e9d4abSLoGin /// 不是STREAM Not a STREAM 128*91e9d4abSLoGin ENOSTR = 59, 129*91e9d4abSLoGin /// 队列头没有可读取的消息 No message is available on the STREAM head read queue. 130*91e9d4abSLoGin ENODATA = 60, 131*91e9d4abSLoGin /// 流式ioctl()超时 Stream ioctl() timeout 132*91e9d4abSLoGin ETIME = 61, 133*91e9d4abSLoGin /// 没有STREAM资源 No STREAM resources. 134*91e9d4abSLoGin ENOSR = 62, 135*91e9d4abSLoGin /// 机器不在网络上 Machine is not on the network 136*91e9d4abSLoGin ENONET = 63, 137*91e9d4abSLoGin /// 未安装软件包 Package not installed 138*91e9d4abSLoGin ENOPKG = 64, 139*91e9d4abSLoGin /// 远程对象 Object is remote 140*91e9d4abSLoGin EREMOTE = 65, 141*91e9d4abSLoGin /// 保留 Reserved. 142*91e9d4abSLoGin ENOLINK = 66, 143*91e9d4abSLoGin /// 外设错误 Advertise error. 144*91e9d4abSLoGin EADV = 67, 145*91e9d4abSLoGin /// 安装错误 Srmount error 146*91e9d4abSLoGin ESRMNT = 68, 147*91e9d4abSLoGin /// 发送时发生通信错误 Communication error on send 148*91e9d4abSLoGin ECOMM = 69, 149*91e9d4abSLoGin /// 协议错误 Protocol error. 150*91e9d4abSLoGin EPROTO = 70, 151*91e9d4abSLoGin /// 保留使用 Reserved. 152*91e9d4abSLoGin EMULTIHOP = 71, 153*91e9d4abSLoGin /// RFS特定错误 RFS specific error 154*91e9d4abSLoGin EDOTDOT = 72, 155*91e9d4abSLoGin /// 错误的消息 Bad message. 156*91e9d4abSLoGin EBADMSG = 73, 157*91e9d4abSLoGin /// 数值过大,产生溢出 Value too large to be stored in data type. 158*91e9d4abSLoGin EOVERFLOW = 74, 159*91e9d4abSLoGin /// 名称在网络上不是唯一的 Name not unique on network 160*91e9d4abSLoGin ENOTUNIQ = 75, 161*91e9d4abSLoGin /// 处于不良状态的文件描述符 File descriptor in bad state 162*91e9d4abSLoGin EBADFD = 76, 163*91e9d4abSLoGin /// 远程地址已更改 Remote address changed 164*91e9d4abSLoGin EREMCHG = 77, 165*91e9d4abSLoGin /// 无法访问所需的共享库 Can not access a needed shared library 166*91e9d4abSLoGin ELIBACC = 78, 167*91e9d4abSLoGin /// 访问损坏的共享库 Accessing a corrupted shared library 168*91e9d4abSLoGin ELIBBAD = 79, 169*91e9d4abSLoGin /// a. out中的.lib部分已损坏 .lib section in a.out corrupted 170*91e9d4abSLoGin ELIBSCN = 80, 171*91e9d4abSLoGin /// 尝试链接太多共享库 Attempting to link in too many shared libraries 172*91e9d4abSLoGin ELIBMAX = 81, 173*91e9d4abSLoGin /// 无法直接执行共享库 Cannot exec a shared library directly 174*91e9d4abSLoGin ELIBEXEC = 82, 175*91e9d4abSLoGin /// 不合法的字符序列 Illegal byte sequence. 176*91e9d4abSLoGin EILSEQ = 83, 177*91e9d4abSLoGin /// 中断的系统调用应该重新启动 Interrupted system call should be restarted 178*91e9d4abSLoGin ERESTART = 84, 179*91e9d4abSLoGin /// 流管道错误 Streams pipe error 180*91e9d4abSLoGin ESTRPIPE = 85, 181*91e9d4abSLoGin /// 用户太多 Too many users 182*91e9d4abSLoGin EUSERS = 86, 183*91e9d4abSLoGin /// 不是一个套接字 Not a socket. 184*91e9d4abSLoGin ENOTSOCK = 87, 185*91e9d4abSLoGin /// 需要目标地址 Destination address required. 186*91e9d4abSLoGin EDESTADDRREQ = 88, 187*91e9d4abSLoGin /// 消息过大 Message too large. 188*91e9d4abSLoGin EMSGSIZE = 89, 189*91e9d4abSLoGin /// 对于套接字而言,错误的协议 Protocol wrong type for socket. 190*91e9d4abSLoGin EPROTOTYPE = 90, 191*91e9d4abSLoGin /// 协议不可用 Protocol not available. 192*91e9d4abSLoGin ENOPROTOOPT = 91, 193*91e9d4abSLoGin /// 协议不被支持 Protocol not supported. 194*91e9d4abSLoGin EPROTONOSUPPORT = 92, 195*91e9d4abSLoGin /// 不支持套接字类型 Socket type not supported 196*91e9d4abSLoGin ESOCKTNOSUPPORT = 93, 197*91e9d4abSLoGin /// 套接字不支持该操作 Operation not supported on socket (may be the same value as [ENOTSUP]). 198*91e9d4abSLoGin /// 199*91e9d4abSLoGin /// 不被支持 Not supported (may be the same value as [EOPNOTSUPP]). 200*91e9d4abSLoGin EOPNOTSUPP_OR_ENOTSUP = 94, 201*91e9d4abSLoGin /// 不支持协议系列 Protocol family not supported 202*91e9d4abSLoGin EPFNOSUPPORT = 95, 203*91e9d4abSLoGin /// 地址family不支持 Address family not supported. 204*91e9d4abSLoGin EAFNOSUPPORT = 96, 205*91e9d4abSLoGin /// 地址正在被使用 Address in use. 206*91e9d4abSLoGin EADDRINUSE = 97, 207*91e9d4abSLoGin /// 地址不可用 Address not available. 208*91e9d4abSLoGin EADDRNOTAVAIL = 98, 209*91e9d4abSLoGin /// 网络已关闭 Network is down. 210*91e9d4abSLoGin ENETDOWN = 99, 211*91e9d4abSLoGin /// 网络不可达 Network unreachable. 212*91e9d4abSLoGin ENETUNREACH = 100, 213*91e9d4abSLoGin /// 网络连接已断开 Connection aborted by network. 214*91e9d4abSLoGin ENETRESET = 101, 215*91e9d4abSLoGin /// 连接已断开 Connection aborted. 216*91e9d4abSLoGin ECONNABORTED = 102, 217*91e9d4abSLoGin /// 连接被重置 Connection reset. 218*91e9d4abSLoGin ECONNRESET = 103, 219*91e9d4abSLoGin /// 缓冲区空间不足 No buffer space available. 220*91e9d4abSLoGin ENOBUFS = 104, 221*91e9d4abSLoGin /// 套接字已连接 Socket is connected. 222*91e9d4abSLoGin EISCONN = 105, 223*91e9d4abSLoGin /// 套接字未连接 The socket is not connected. 224*91e9d4abSLoGin ENOTCONN = 106, 225*91e9d4abSLoGin /// 传输端点关闭后无法发送 Cannot send after transport endpoint shutdown 226*91e9d4abSLoGin ESHUTDOWN = 107, 227*91e9d4abSLoGin /// 引用太多:无法拼接 Too many references: cannot splice 228*91e9d4abSLoGin ETOOMANYREFS = 108, 229*91e9d4abSLoGin /// 连接超时 Connection timed out. 230*91e9d4abSLoGin ETIMEDOUT = 109, 231*91e9d4abSLoGin /// 连接被拒绝 Connection refused. 232*91e9d4abSLoGin ECONNREFUSED = 110, 233*91e9d4abSLoGin /// 主机已关闭 Host is down 234*91e9d4abSLoGin EHOSTDOWN = 111, 235*91e9d4abSLoGin /// 主机不可达 Host is unreachable. 236*91e9d4abSLoGin EHOSTUNREACH = 112, 237*91e9d4abSLoGin /// 连接已经在处理 Connection already in progress. 238*91e9d4abSLoGin EALREADY = 113, 239*91e9d4abSLoGin /// 操作正在处理 Operation in progress. 240*91e9d4abSLoGin EINPROGRESS = 114, 241*91e9d4abSLoGin /// 保留 Reserved. 242*91e9d4abSLoGin ESTALE = 115, 243*91e9d4abSLoGin /// 结构需要清理 Structure needs cleaning 244*91e9d4abSLoGin EUCLEAN = 116, 245*91e9d4abSLoGin /// 不是XENIX命名类型文件 Not a XENIX named type file 246*91e9d4abSLoGin ENOTNAM = 117, 247*91e9d4abSLoGin /// 没有可用的XENIX信号量 No XENIX semaphores available 248*91e9d4abSLoGin ENAVAIL = 118, 249*91e9d4abSLoGin /// 是命名类型文件 Is a named type file 250*91e9d4abSLoGin EISNAM = 119, 251*91e9d4abSLoGin /// 远程I/O错误 Remote I/O error 252*91e9d4abSLoGin EREMOTEIO = 120, 253*91e9d4abSLoGin /// 保留使用 Reserved 254*91e9d4abSLoGin EDQUOT = 121, 255*91e9d4abSLoGin /// 没有找到媒介 No medium found 256*91e9d4abSLoGin ENOMEDIUM = 122, 257*91e9d4abSLoGin /// 介质类型错误 Wrong medium type 258*91e9d4abSLoGin EMEDIUMTYPE = 123, 259*91e9d4abSLoGin /// 操作被取消 Operation canceled. 260*91e9d4abSLoGin ECANCELED = 124, 261*91e9d4abSLoGin /// 所需的密钥不可用 Required key not available 262*91e9d4abSLoGin ENOKEY = 125, 263*91e9d4abSLoGin /// 密钥已过期 Key has expired 264*91e9d4abSLoGin EKEYEXPIRED = 126, 265*91e9d4abSLoGin /// 密钥已被撤销 Key has been revoked 266*91e9d4abSLoGin EKEYREVOKED = 127, 267*91e9d4abSLoGin /// 密钥被服务拒绝 Key has been revoked 268*91e9d4abSLoGin EKEYREJECTED = 128, 269*91e9d4abSLoGin /// 之前的拥有者挂了 Previous owner died. 270*91e9d4abSLoGin EOWNERDEAD = 129, 271*91e9d4abSLoGin /// 状态不可恢复 State not recoverable. 272*91e9d4abSLoGin ENOTRECOVERABLE = 130, 273*91e9d4abSLoGin // VMX on 虚拟化开启指令出错 274*91e9d4abSLoGin EVMXONFailed = 131, 275*91e9d4abSLoGin // VMX off 虚拟化关闭指令出错 276*91e9d4abSLoGin EVMXOFFFailed = 132, 277*91e9d4abSLoGin // VMX VMWRITE 写入虚拟化VMCS内存出错 278*91e9d4abSLoGin EVMWRITEFailed = 133, 279*91e9d4abSLoGin EVMREADFailed = 134, 280*91e9d4abSLoGin EVMPRTLDFailed = 135, 281*91e9d4abSLoGin EVMLAUNCHFailed = 136, 282*91e9d4abSLoGin KVM_HVA_ERR_BAD = 137, 283*91e9d4abSLoGin 284*91e9d4abSLoGin // === 以下错误码不应该被用户态程序使用 === 285*91e9d4abSLoGin ERESTARTSYS = 512, 286*91e9d4abSLoGin } 287*91e9d4abSLoGin 288*91e9d4abSLoGin impl SystemError { 289*91e9d4abSLoGin /// @brief 把posix错误码转换为系统错误枚举类型。 290*91e9d4abSLoGin pub fn from_posix_errno(errno: i32) -> Option<SystemError> { 291*91e9d4abSLoGin // posix 错误码是小于0的 292*91e9d4abSLoGin if errno >= 0 { 293*91e9d4abSLoGin return None; 294*91e9d4abSLoGin } 295*91e9d4abSLoGin return <Self as num_traits::FromPrimitive>::from_i32(-errno); 296*91e9d4abSLoGin } 297*91e9d4abSLoGin 298*91e9d4abSLoGin /// @brief 把系统错误枚举类型转换为负数posix错误码。 299*91e9d4abSLoGin pub fn to_posix_errno(&self) -> i32 { 300*91e9d4abSLoGin return -<Self as num_traits::ToPrimitive>::to_i32(self).unwrap(); 301*91e9d4abSLoGin } 302*91e9d4abSLoGin } 303*91e9d4abSLoGin 304*91e9d4abSLoGin #[cfg(test)] 305*91e9d4abSLoGin mod tests { 306*91e9d4abSLoGin use super::*; 307*91e9d4abSLoGin 308*91e9d4abSLoGin #[test] 309*91e9d4abSLoGin fn it_works() { 310*91e9d4abSLoGin assert_eq!(SystemError::EPERM.to_posix_errno(), -1); 311*91e9d4abSLoGin } 312*91e9d4abSLoGin } 313