blob: e5324b340c1e7da3289aff777acdbde86e648b45 [file] [log] [blame]
#[cfg(test)]
mod tests;
use std::os::raw::{c_char, c_int, c_void};
/// Call back for SELinux operations.
pub trait CallBack {
/// Prototype of call back function.
type CallBackType;
/// Get the current call back function, if one has been set.
///
/// See: `selinux_get_callback()`.
#[doc(alias = "selinux_get_callback")]
fn get_call_back() -> Option<Self::CallBackType>;
/// Set or clear the call back function.
///
/// See: `selinux_set_callback()`.
#[doc(alias = "selinux_set_callback")]
fn set_call_back(call_back: Option<Self::CallBackType>);
}
/// Call back used for logging.
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct Log;
impl CallBack for Log {
type CallBackType = unsafe extern "C" fn(c_int, *const c_char, ...) -> c_int;
fn get_call_back() -> Option<Self::CallBackType> {
unsafe { selinux_sys::selinux_get_callback(selinux_sys::SELINUX_CB_LOG).func_log }
}
fn set_call_back(func_log: Option<Self::CallBackType>) {
use selinux_sys::{selinux_callback, selinux_set_callback, SELINUX_CB_LOG};
unsafe { selinux_set_callback(SELINUX_CB_LOG, selinux_callback { func_log }) }
}
}
/// Call back used for supplemental auditing in AVC messages.
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct Audit;
impl CallBack for Audit {
type CallBackType = unsafe extern "C" fn(
*mut c_void,
selinux_sys::security_class_t,
*mut c_char,
usize,
) -> c_int;
fn get_call_back() -> Option<Self::CallBackType> {
unsafe { selinux_sys::selinux_get_callback(selinux_sys::SELINUX_CB_AUDIT).func_audit }
}
fn set_call_back(func_audit: Option<Self::CallBackType>) {
use selinux_sys::{selinux_callback, selinux_set_callback, SELINUX_CB_AUDIT};
unsafe { selinux_set_callback(SELINUX_CB_AUDIT, selinux_callback { func_audit }) }
}
}
/// Call back used for context validation.
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct ContextValidation;
impl CallBack for ContextValidation {
type CallBackType = unsafe extern "C" fn(*mut *mut c_char) -> c_int;
fn get_call_back() -> Option<Self::CallBackType> {
unsafe { selinux_sys::selinux_get_callback(selinux_sys::SELINUX_CB_VALIDATE).func_validate }
}
fn set_call_back(func_validate: Option<Self::CallBackType>) {
use selinux_sys::{selinux_callback, selinux_set_callback, SELINUX_CB_VALIDATE};
unsafe { selinux_set_callback(SELINUX_CB_VALIDATE, selinux_callback { func_validate }) }
}
}
/// Call back invoked when the system enforcing state changes.
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct EnforcingChange;
impl CallBack for EnforcingChange {
type CallBackType = unsafe extern "C" fn(c_int) -> c_int;
fn get_call_back() -> Option<Self::CallBackType> {
use selinux_sys::{selinux_get_callback, SELINUX_CB_SETENFORCE};
unsafe { selinux_get_callback(SELINUX_CB_SETENFORCE).func_setenforce }
}
fn set_call_back(func_setenforce: Option<Self::CallBackType>) {
use selinux_sys::{selinux_callback, selinux_set_callback, SELINUX_CB_SETENFORCE};
unsafe { selinux_set_callback(SELINUX_CB_SETENFORCE, selinux_callback { func_setenforce }) }
}
}
/// Call back invoked when the system security policy is reloaded.
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct SecurityPolicyReload;
impl CallBack for SecurityPolicyReload {
type CallBackType = unsafe extern "C" fn(c_int) -> c_int;
fn get_call_back() -> Option<Self::CallBackType> {
use selinux_sys::{selinux_get_callback, SELINUX_CB_POLICYLOAD};
unsafe { selinux_get_callback(SELINUX_CB_POLICYLOAD).func_policyload }
}
fn set_call_back(func_policyload: Option<Self::CallBackType>) {
use selinux_sys::{selinux_callback, selinux_set_callback, SELINUX_CB_POLICYLOAD};
unsafe { selinux_set_callback(SELINUX_CB_POLICYLOAD, selinux_callback { func_policyload }) }
}
}
/// Log type argument indicating the type of message.
pub mod log_type {
use std::os::raw::c_int;
/// Error log entry.
pub use selinux_sys::SELINUX_ERROR as ERROR;
/// Warning log entry.
pub use selinux_sys::SELINUX_WARNING as WARNING;
/// Informational log entry.
pub use selinux_sys::SELINUX_INFO as INFO;
/// AVC log entry.
pub use selinux_sys::SELINUX_AVC as AVC;
// The rest of the constants were defined after version 2.8, so selinux_sys might not
// export them. We therefore define them manually.
/// Policy loaded.
pub static POLICY_LOAD: c_int = 4_i32;
/// SELinux enforcing mode changed.
pub static SET_ENFORCE: c_int = 5_i32;
}