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}