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}