#[cfg(test)]
mod tests;
use std::os::raw::{c_char, c_int, c_void};
pub trait CallBack {
type CallBackType;
#[doc(alias = "selinux_get_callback")]
fn get_call_back() -> Option<Self::CallBackType>;
#[doc(alias = "selinux_set_callback")]
fn set_call_back(call_back: Option<Self::CallBackType>);
}
#[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_CB_LOG, selinux_callback, selinux_set_callback};
unsafe { selinux_set_callback(SELINUX_CB_LOG, selinux_callback { func_log }) }
}
}
#[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_CB_AUDIT, selinux_callback, selinux_set_callback};
unsafe { selinux_set_callback(SELINUX_CB_AUDIT, selinux_callback { func_audit }) }
}
}
#[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_CB_VALIDATE, selinux_callback, selinux_set_callback};
unsafe { selinux_set_callback(SELINUX_CB_VALIDATE, selinux_callback { func_validate }) }
}
}
#[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_CB_SETENFORCE, selinux_get_callback};
unsafe { selinux_get_callback(SELINUX_CB_SETENFORCE).func_setenforce }
}
fn set_call_back(func_setenforce: Option<Self::CallBackType>) {
use selinux_sys::{SELINUX_CB_SETENFORCE, selinux_callback, selinux_set_callback};
unsafe { selinux_set_callback(SELINUX_CB_SETENFORCE, selinux_callback { func_setenforce }) }
}
}
#[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_CB_POLICYLOAD, selinux_get_callback};
unsafe { selinux_get_callback(SELINUX_CB_POLICYLOAD).func_policyload }
}
fn set_call_back(func_policyload: Option<Self::CallBackType>) {
use selinux_sys::{SELINUX_CB_POLICYLOAD, selinux_callback, selinux_set_callback};
unsafe { selinux_set_callback(SELINUX_CB_POLICYLOAD, selinux_callback { func_policyload }) }
}
}
pub mod log_type {
use std::os::raw::c_int;
pub use selinux_sys::SELINUX_ERROR as ERROR;
pub use selinux_sys::SELINUX_WARNING as WARNING;
pub use selinux_sys::SELINUX_INFO as INFO;
pub use selinux_sys::SELINUX_AVC as AVC;
pub static POLICY_LOAD: c_int = 4_i32;
pub static SET_ENFORCE: c_int = 5_i32;
}