aboutsummaryrefslogtreecommitdiffstats
path: root/src/configuration/error.rs
blob: de790e2bdade7d8b4eefc8e5a4adc2d0d664c5d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::error::Error;
use std::fmt;

#[cfg(unix)]
use libc::*;

#[derive(Debug)]
pub enum ConfigError {
    FailedToBind,
    InvalidHexValue,
    InvalidPortNumber,
    InvalidFwmark,
    InvalidKey,
    InvalidSocketAddr,
    InvalidKeepaliveInterval,
    InvalidAllowedIp,
    InvalidOperation,
    LineTooLong,
    IOError,
    UnsupportedValue,
    UnsupportedProtocolVersion,
}

impl fmt::Display for ConfigError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "ConfigError(errno = {})", self.errno())
    }
}

impl Error for ConfigError {
    fn description(&self) -> &str {
        ""
    }

    fn source(&self) -> Option<&(dyn Error + 'static)> {
        None
    }
}

#[cfg(unix)]
impl ConfigError {
    pub fn errno(&self) -> i32 {
        // TODO: obtain the correct errorno values
        match self {
            // insufficient perms
            ConfigError::FailedToBind => EPERM,

            // parsing of value failed
            ConfigError::InvalidHexValue => EINVAL,
            ConfigError::InvalidPortNumber => EINVAL,
            ConfigError::InvalidFwmark => EINVAL,
            ConfigError::InvalidSocketAddr => EINVAL,
            ConfigError::InvalidKeepaliveInterval => EINVAL,
            ConfigError::InvalidAllowedIp => EINVAL,
            ConfigError::InvalidOperation => EINVAL,
            ConfigError::UnsupportedValue => EINVAL,

            // other protocol errors
            ConfigError::LineTooLong => EPROTO,
            ConfigError::InvalidKey => EPROTO,
            ConfigError::UnsupportedProtocolVersion => EPROTO,

            // IO
            ConfigError::IOError => EIO,
        }
    }
}