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}