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    #[inline]
28    fn from(error: io::Error) -> Self {
29        Self::IoError(error)
30    }
31}
32
33impl From<ffi::NulError> for DropRootError {
34    #[inline]
35    fn from(error: ffi::NulError) -> Self {
36        Self::NulError(error)
37    }
38}
39
40impl fmt::Display for DropRootError {
41    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42        match self {
43            Self::IoError(error) => error.fmt(f),
44            Self::NulError(_) => write!(f, "Cannot create CString"),
45            Self::InvalidData => write!(f, "Bad user or group")
46        }
47    }
48}
49
50impl Error for DropRootError {
51    fn source(&self) -> Option<&(dyn Error + 'static)> {
52        match self {
53            Self::IoError(error) => Some(error),
54            Self::NulError(error) => Some(error),
55
56            Self::InvalidData => None,
57        }
58    }
59}