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 #[allow(dead_code)]
32 pub(crate) fn build_syscall_result(
33 errno: u64,
34 load_len: usize,
35 actual_data_len: usize,
36 ) -> Result<usize, SysError> {
37 use SysError::*;
38
39 match errno {
40 0 => {
41 if actual_data_len > load_len {
42 return Err(LengthNotEnough(actual_data_len));
43 }
44 Ok(actual_data_len)
45 }
46 1 => Err(IndexOutOfBound),
47 2 => Err(ItemMissing),
48 _ => Err(Unknown(errno)),
49 }
50 }
51}