drop_root/
error.rs

1use std::error::Error;
2use std::ffi;
3use std::fmt;
4use std::io;
5
6#[derive(Debug)]
7pub enum DropRootError {
8    IoError(io::Error),
9    NulError(ffi::NulError),
10    InvalidData,
11}
12
13impl DropRootError {
14    pub(crate) fn last_os_error() -> Self {
15        let error = io::Error::last_os_error();
16        let os_error = error.raw_os_error();
17
18        if os_error.is_none() || os_error == Some(0) {
19            Self::InvalidData
20        } else {
21            Self::IoError(error)
22        }
23    }
24}
25
26impl From<io::Error> for DropRootError {
27    fn from(error: io::Error) -> Self {
28        Self::IoError(error)
29    }
30}
31
32impl From<ffi::NulError> for DropRootError {
33    fn from(error: ffi::NulError) -> Self {
34        Self::NulError(error)
35    }
36}
37
38impl fmt::Display for DropRootError {
39    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        match self {
41            Self::IoError(error) => error.fmt(f),
42            Self::NulError(_) => write!(f, "Cannot create CString from String"),
43            Self::InvalidData => write!(f, "Bad user or group.")
44        }
45    }
46}
47
48impl Error for DropRootError {
49    fn source(&self) -> Option<&(dyn Error + 'static)> {
50        match self {
51            Self::IoError(error) => Some(error),
52            Self::NulError(error) => Some(error),
53
54            Self::InvalidData => None,
55        }
56    }
57}