xref: /DragonOS/kernel/crates/system_error/src/lib.rs (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
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