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