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}