ckb_std/error.rs
1/// Syscall errors
2#[derive(Eq, PartialEq, Debug, Clone, Copy)]
3pub enum SysError {
4 /// Index out of bound
5 IndexOutOfBound,
6 /// Field is missing for the target
7 ItemMissing,
8 /// Buffer length is not enough, error contains actual data length
9 LengthNotEnough(usize),
10 /// Data encoding error
11 Encoding,
12
13 /// Failed to wait. Its value is 5.
14 WaitFailure,
15 /// Invalid file descriptor. Its value is 6.
16 InvalidFd,
17 /// Reading from or writing to file descriptor failed due to other end closed. Its value is 7.
18 OtherEndClosed,
19 /// Max vms has been spawned. Its value is 8.
20 MaxVmsSpawned,
21 /// Max fds has been spawned. Its value is 9.
22 MaxFdsCreated,
23 /// Type ID Error
24 #[cfg(feature = "type-id")]
25 TypeIDError,
26 /// Unknown syscall error number
27 Unknown(u64),
28}
29
30impl SysError {
31 pub(crate) fn build_syscall_result(
32 errno: u64,
33 load_len: usize,
34 actual_data_len: usize,
35 ) -> Result<usize, SysError> {
36 use SysError::*;
37
38 match errno {
39 0 => {
40 if actual_data_len > load_len {
41 return Err(LengthNotEnough(actual_data_len));
42 }
43 Ok(actual_data_len)
44 }
45 1 => Err(IndexOutOfBound),
46 2 => Err(ItemMissing),
47 _ => Err(Unknown(errno)),
48 }
49 }
50}