#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum DaemonizeError {
#[error("validation error: {0}")]
ValidationError(String),
#[error("program not found: {0}")]
ProgramNotFound(String),
#[error("user not found: {0}")]
UserNotFound(String),
#[error("group not found: {0}")]
GroupNotFound(String),
#[error("lock conflict: {} is already locked by another process", path.display())]
LockConflict {
path: std::path::PathBuf,
},
#[error("lockfile error: {0}")]
LockfileError(String),
#[error("fork failed: {0}")]
ForkFailed(String),
#[error("setsid failed: {0}")]
SetsidFailed(String),
#[error("chdir failed: {0}")]
ChdirFailed(String),
#[error("permission denied: {0}")]
PermissionDenied(String),
#[error("pidfile error: {0}")]
PidfileError(String),
#[error("output file error: {0}")]
OutputFileError(String),
#[error("chown error: {0}")]
ChownError(String),
#[error("exec failed: {0}")]
ExecFailed(String),
#[error("failed to notify parent: {0}")]
NotifyFailed(#[source] std::io::Error),
#[error(
"privileges not dropped: a user/group was configured but \
drop_privileges() was never called before notifying readiness"
)]
PrivilegesNotDropped,
#[error("application error: {message}")]
Application {
code: u8,
message: String,
},
}
impl DaemonizeError {
pub fn application(code: u8, message: impl Into<String>) -> Self {
DaemonizeError::Application {
code,
message: message.into(),
}
}
pub fn exit_code(&self) -> u8 {
match self {
DaemonizeError::ValidationError(_) => 64, DaemonizeError::ProgramNotFound(_) => 66, DaemonizeError::UserNotFound(_) => 67, DaemonizeError::GroupNotFound(_) => 67, DaemonizeError::LockConflict { .. } => 69, DaemonizeError::LockfileError(_) => 73, DaemonizeError::ForkFailed(_) => 71, DaemonizeError::SetsidFailed(_) => 71, DaemonizeError::ChdirFailed(_) => 71, DaemonizeError::PermissionDenied(_) => 77, DaemonizeError::PidfileError(_) => 73, DaemonizeError::OutputFileError(_) => 73, DaemonizeError::ChownError(_) => 73, DaemonizeError::ExecFailed(_) => 71, DaemonizeError::NotifyFailed(_) => 71, DaemonizeError::PrivilegesNotDropped => 70, DaemonizeError::Application { code: 0, .. } => 70, DaemonizeError::Application { code, .. } => *code,
}
}
}