#![deny(missing_docs)]
#![deny(clippy::allow_attributes_without_reason)]
#![deny(clippy::arithmetic_side_effects)]
#![deny(clippy::as_ptr_cast_mut)]
#![deny(clippy::as_underscore)]
#![deny(clippy::assertions_on_result_states)]
#![deny(clippy::borrow_as_ptr)]
#![deny(clippy::branches_sharing_code)]
#![deny(clippy::case_sensitive_file_extension_comparisons)]
#![deny(clippy::cast_lossless)]
#![deny(clippy::cast_possible_truncation)]
#![deny(clippy::cast_possible_wrap)]
#![deny(clippy::cast_precision_loss)]
#![deny(clippy::cast_ptr_alignment)]
#![deny(clippy::cast_sign_loss)]
#![deny(clippy::checked_conversions)]
#![deny(clippy::clear_with_drain)]
#![deny(clippy::clone_on_ref_ptr)]
#![deny(clippy::cloned_instead_of_copied)]
#![deny(clippy::cognitive_complexity)]
#![deny(clippy::collection_is_never_read)]
#![deny(clippy::copy_iterator)]
#![deny(clippy::create_dir)]
#![deny(clippy::dbg_macro)]
#![deny(clippy::debug_assert_with_mut_call)]
#![deny(clippy::decimal_literal_representation)]
#![deny(clippy::default_trait_access)]
#![deny(clippy::default_union_representation)]
#![deny(clippy::derive_partial_eq_without_eq)]
#![deny(clippy::doc_link_with_quotes)]
#![deny(clippy::doc_markdown)]
#![deny(clippy::explicit_into_iter_loop)]
#![deny(clippy::explicit_iter_loop)]
#![deny(clippy::fallible_impl_from)]
#![deny(clippy::missing_safety_doc)]
#![deny(clippy::undocumented_unsafe_blocks)]
use std::{
ffi::{CStr, OsStr, OsString},
fmt,
fs::{symlink_metadata, Metadata},
os::{
fd::RawFd,
linux::fs::MetadataExt as LinuxMetadataExt,
raw::{c_char, c_int},
unix::{
ffi::OsStrExt,
fs::{FileTypeExt, MetadataExt as UnixMetadataExt},
},
},
path::{Path, PathBuf},
};
#[expect(non_camel_case_types)]
pub type lock_state_t = u8;
pub const LOCK_OFF: lock_state_t = 0;
pub const LOCK_EXEC: lock_state_t = 1;
pub const LOCK_DROP: lock_state_t = 2;
pub const LOCK_READ: lock_state_t = 3;
pub const LOCK_ON: lock_state_t = 4;
#[repr(u8)]
#[derive(Copy, Clone, Debug)]
enum LockState {
Off = LOCK_OFF,
Exec = LOCK_EXEC,
Drop = LOCK_DROP,
Read = LOCK_READ,
On = LOCK_ON,
}
impl TryFrom<lock_state_t> for LockState {
type Error = ();
fn try_from(value: lock_state_t) -> Result<Self, Self::Error> {
match value {
LOCK_OFF => Ok(LockState::Off),
LOCK_EXEC => Ok(LockState::Exec),
LOCK_DROP => Ok(LockState::Drop),
LOCK_READ => Ok(LockState::Read),
LOCK_ON => Ok(LockState::On),
_ => Err(()),
}
}
}
impl fmt::Display for LockState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let state_str = match self {
LockState::Off => "off",
LockState::Exec => "exec",
LockState::Drop => "drop",
LockState::Read => "read",
LockState::On => "on",
};
write!(f, "{state_str}")
}
}
#[expect(non_camel_case_types)]
pub type action_t = u8;
pub const ACTION_ALLOW: action_t = 0;
pub const ACTION_WARN: action_t = 1;
pub const ACTION_FILTER: action_t = 2;
pub const ACTION_DENY: action_t = 3;
pub const ACTION_PANIC: action_t = 4;
pub const ACTION_STOP: action_t = 5;
pub const ACTION_ABORT: action_t = 6;
pub const ACTION_KILL: action_t = 7;
pub const ACTION_EXIT: action_t = 8;
#[repr(u8)]
#[derive(Copy, Clone, Debug)]
enum Action {
Allow = ACTION_ALLOW,
Warn = ACTION_WARN,
Filter = ACTION_FILTER,
Deny = ACTION_DENY,
Panic = ACTION_PANIC,
Stop = ACTION_STOP,
Abort = ACTION_ABORT,
Kill = ACTION_KILL,
Exit = ACTION_EXIT,
}
impl TryFrom<action_t> for Action {
type Error = ();
fn try_from(value: action_t) -> Result<Self, Self::Error> {
match value {
ACTION_ALLOW => Ok(Action::Allow),
ACTION_WARN => Ok(Action::Warn),
ACTION_FILTER => Ok(Action::Filter),
ACTION_DENY => Ok(Action::Deny),
ACTION_PANIC => Ok(Action::Panic),
ACTION_STOP => Ok(Action::Stop),
ACTION_ABORT => Ok(Action::Abort),
ACTION_KILL => Ok(Action::Kill),
ACTION_EXIT => Ok(Action::Exit),
_ => Err(()),
}
}
}
impl fmt::Display for Action {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let action_str = match self {
Action::Allow => "allow",
Action::Warn => "warn",
Action::Filter => "filter",
Action::Deny => "deny",
Action::Panic => "panic",
Action::Stop => "stop",
Action::Abort => "abort",
Action::Kill => "kill",
Action::Exit => "exit",
};
write!(f, "{action_str}")
}
}
const EFAULT: i32 = 14;
const EINVAL: i32 = 22;
const LIB_MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
const SYD_ATIME: i64 = 505958400;
const SYD_CTIME: i64 = -2036448000;
const SYD_MTIME: i64 = -842745600;
fn check_stat(stat: &Metadata) -> bool {
let lib_major = if let Ok(lib_major) = LIB_MAJOR.parse() {
lib_major
} else {
return false;
};
if !stat.file_type().is_char_device() {
return false;
}
if stat.st_atime() != SYD_ATIME {
return false;
}
if stat.st_ctime() != SYD_CTIME {
return false;
}
if stat.st_mtime() != SYD_MTIME {
return false;
}
let rdev = stat.rdev();
let api_major = (rdev >> 8) & 0xff;
let api_minor = rdev & 0xff;
api_major == lib_major && api_minor >= 1
}
fn stat<P: AsRef<Path>>(path: P) -> c_int {
match symlink_metadata(path) {
Ok(stat) if check_stat(&stat) => 0,
Ok(_) => -EINVAL,
Err(error) => match error.raw_os_error() {
Some(e) => e.checked_neg().unwrap_or(-EINVAL),
None => -EINVAL,
},
}
}
fn esyd<P: AsRef<Path>>(rule: P, elem: *const c_char, op: u8) -> c_int {
if !matches!(op, b'+' | b'-' | b'^' | b':') {
return -EINVAL;
}
if elem.is_null() {
return -EFAULT;
}
let elem = unsafe { CStr::from_ptr(elem) };
let elem = OsStr::from_bytes(elem.to_bytes());
let mut path = OsString::from("/dev/syd/");
path.push(rule.as_ref());
path.push(OsStr::from_bytes(&[op]));
path.push(elem);
let path = PathBuf::from(path);
stat(path)
}
#[no_mangle]
pub extern "C" fn syd_api() -> c_int {
match stat("/dev/syd/3") {
0 => 3,
n => n,
}
}
#[no_mangle]
pub extern "C" fn syd_check() -> c_int {
stat("/dev/syd")
}
#[no_mangle]
pub extern "C" fn syd_panic() -> c_int {
stat("/dev/syd/panic")
}
#[no_mangle]
pub extern "C" fn syd_reset() -> c_int {
stat("/dev/syd/reset")
}
#[no_mangle]
pub extern "C" fn syd_load(fd: c_int) -> c_int {
let fd = match RawFd::try_from(fd) {
Ok(fd) if fd < 0 => return -EINVAL,
Ok(fd) => fd,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/load/{fd}"))
}
#[no_mangle]
pub extern "C" fn syd_lock(state: lock_state_t) -> c_int {
let state = match LockState::try_from(state) {
Ok(state) => state,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/lock:{state}"))
}
#[no_mangle]
pub extern "C" fn syd_enabled_fs() -> bool {
stat("/dev/syd/sandbox/fs?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_fs() -> c_int {
stat("/dev/syd/sandbox/fs:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_fs() -> c_int {
stat("/dev/syd/sandbox/fs:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_walk() -> bool {
stat("/dev/syd/sandbox/walk?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_walk() -> c_int {
stat("/dev/syd/sandbox/walk:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_walk() -> c_int {
stat("/dev/syd/sandbox/walk:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_list() -> bool {
stat("/dev/syd/sandbox/list?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_list() -> c_int {
stat("/dev/syd/sandbox/list:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_list() -> c_int {
stat("/dev/syd/sandbox/list:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_stat() -> bool {
stat("/dev/syd/sandbox/stat?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_stat() -> c_int {
stat("/dev/syd/sandbox/stat:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_stat() -> c_int {
stat("/dev/syd/sandbox/stat:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_read() -> bool {
stat("/dev/syd/sandbox/read?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_read() -> c_int {
stat("/dev/syd/sandbox/read:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_read() -> c_int {
stat("/dev/syd/sandbox/read:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_write() -> bool {
stat("/dev/syd/sandbox/write?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_write() -> c_int {
stat("/dev/syd/sandbox/write:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_write() -> c_int {
stat("/dev/syd/sandbox/write:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_exec() -> bool {
stat("/dev/syd/sandbox/exec?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_exec() -> c_int {
stat("/dev/syd/sandbox/exec:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_exec() -> c_int {
stat("/dev/syd/sandbox/exec:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_ioctl() -> bool {
stat("/dev/syd/sandbox/ioctl?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_ioctl() -> c_int {
stat("/dev/syd/sandbox/ioctl:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_ioctl() -> c_int {
stat("/dev/syd/sandbox/ioctl:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_create() -> bool {
stat("/dev/syd/sandbox/create?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_create() -> c_int {
stat("/dev/syd/sandbox/create:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_create() -> c_int {
stat("/dev/syd/sandbox/create:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_delete() -> bool {
stat("/dev/syd/sandbox/delete?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_delete() -> c_int {
stat("/dev/syd/sandbox/delete:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_delete() -> c_int {
stat("/dev/syd/sandbox/delete:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_rename() -> bool {
stat("/dev/syd/sandbox/rename?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_rename() -> c_int {
stat("/dev/syd/sandbox/rename:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_rename() -> c_int {
stat("/dev/syd/sandbox/rename:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_readlink() -> bool {
stat("/dev/syd/sandbox/readlink?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_readlink() -> c_int {
stat("/dev/syd/sandbox/readlink:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_readlink() -> c_int {
stat("/dev/syd/sandbox/readlink:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_symlink() -> bool {
stat("/dev/syd/sandbox/symlink?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_symlink() -> c_int {
stat("/dev/syd/sandbox/symlink:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_symlink() -> c_int {
stat("/dev/syd/sandbox/symlink:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_truncate() -> bool {
stat("/dev/syd/sandbox/truncate?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_truncate() -> c_int {
stat("/dev/syd/sandbox/truncate:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_truncate() -> c_int {
stat("/dev/syd/sandbox/truncate:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chdir() -> bool {
stat("/dev/syd/sandbox/chdir?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chdir() -> c_int {
stat("/dev/syd/sandbox/chdir:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chdir() -> c_int {
stat("/dev/syd/sandbox/chdir:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_readdir() -> bool {
stat("/dev/syd/sandbox/readdir?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_readdir() -> c_int {
stat("/dev/syd/sandbox/readdir:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_readdir() -> c_int {
stat("/dev/syd/sandbox/readdir:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mkdir() -> bool {
stat("/dev/syd/sandbox/mkdir?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_mkdir() -> c_int {
stat("/dev/syd/sandbox/mkdir:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_mkdir() -> c_int {
stat("/dev/syd/sandbox/mkdir:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_rmdir() -> bool {
stat("/dev/syd/sandbox/rmdir?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_rmdir() -> c_int {
stat("/dev/syd/sandbox/rmdir:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_rmdir() -> c_int {
stat("/dev/syd/sandbox/rmdir:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chown() -> bool {
stat("/dev/syd/sandbox/chown?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chown() -> c_int {
stat("/dev/syd/sandbox/chown:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chown() -> c_int {
stat("/dev/syd/sandbox/chown:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chgrp() -> bool {
stat("/dev/syd/sandbox/chgrp?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chgrp() -> c_int {
stat("/dev/syd/sandbox/chgrp:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chgrp() -> c_int {
stat("/dev/syd/sandbox/chgrp:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chmod() -> bool {
stat("/dev/syd/sandbox/chmod?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chmod() -> c_int {
stat("/dev/syd/sandbox/chmod:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chmod() -> c_int {
stat("/dev/syd/sandbox/chmod:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chattr() -> bool {
stat("/dev/syd/sandbox/chattr?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chattr() -> c_int {
stat("/dev/syd/sandbox/chattr:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chattr() -> c_int {
stat("/dev/syd/sandbox/chattr:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_chroot() -> bool {
stat("/dev/syd/sandbox/chroot?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_chroot() -> c_int {
stat("/dev/syd/sandbox/chroot:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_chroot() -> c_int {
stat("/dev/syd/sandbox/chroot:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_notify() -> bool {
stat("/dev/syd/sandbox/notify?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_notify() -> c_int {
stat("/dev/syd/sandbox/notify:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_notify() -> c_int {
stat("/dev/syd/sandbox/notify:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_utime() -> bool {
stat("/dev/syd/sandbox/utime?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_utime() -> c_int {
stat("/dev/syd/sandbox/utime:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_utime() -> c_int {
stat("/dev/syd/sandbox/utime:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mkbdev() -> bool {
stat("/dev/syd/sandbox/mkbdev?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_mkbdev() -> c_int {
stat("/dev/syd/sandbox/mkbdev:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_mkbdev() -> c_int {
stat("/dev/syd/sandbox/mkbdev:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mkcdev() -> bool {
stat("/dev/syd/sandbox/mkcdev?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_mkcdev() -> c_int {
stat("/dev/syd/sandbox/mkcdev:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_mkcdev() -> c_int {
stat("/dev/syd/sandbox/mkcdev:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mkfifo() -> bool {
stat("/dev/syd/sandbox/mkfifo?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_mkfifo() -> c_int {
stat("/dev/syd/sandbox/mkfifo:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_mkfifo() -> c_int {
stat("/dev/syd/sandbox/mkfifo:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mktemp() -> bool {
stat("/dev/syd/sandbox/mktemp?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_mktemp() -> c_int {
stat("/dev/syd/sandbox/mktemp:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_mktemp() -> c_int {
stat("/dev/syd/sandbox/mktemp:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_net() -> bool {
stat("/dev/syd/sandbox/net?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_net() -> c_int {
stat("/dev/syd/sandbox/net:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_net() -> c_int {
stat("/dev/syd/sandbox/net:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_mem() -> bool {
stat("/dev/syd/sandbox/mem?") == 0
}
#[no_mangle]
pub extern "C" fn syd_disable_mem() -> c_int {
stat("/dev/syd/sandbox/mem:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_pid() -> bool {
stat("/dev/syd/sandbox/pid?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_pid() -> c_int {
stat("/dev/syd/sandbox/pid:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_pid() -> c_int {
stat("/dev/syd/sandbox/pid:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_lock() -> bool {
stat("/dev/syd/sandbox/lock?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enabled_crypt() -> bool {
stat("/dev/syd/sandbox/crypt?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enabled_proxy() -> bool {
stat("/dev/syd/sandbox/proxy?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enabled_force() -> bool {
stat("/dev/syd/sandbox/force?") == 0
}
#[no_mangle]
pub extern "C" fn syd_disable_force() -> c_int {
stat("/dev/syd/sandbox/force:off")
}
#[no_mangle]
pub extern "C" fn syd_enabled_tpe() -> bool {
stat("/dev/syd/sandbox/tpe?") == 0
}
#[no_mangle]
pub extern "C" fn syd_enable_tpe() -> c_int {
stat("/dev/syd/sandbox/tpe:on")
}
#[no_mangle]
pub extern "C" fn syd_disable_tpe() -> c_int {
stat("/dev/syd/sandbox/tpe:off")
}
#[no_mangle]
pub extern "C" fn syd_default_fs(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/fs:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_walk(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/walk:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_list(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/list:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/stat:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_read(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/read:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_write(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/write:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/exec:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/ioctl:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_create(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/create:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/delete:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/rename:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_readlink(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/readlink:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/symlink:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/truncate:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chdir:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/readdir:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mkdir:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_rmdir(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/rmdir:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chown:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chgrp:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chmod:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chattr:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/chroot:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_notify(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/notify:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/utime:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mkbdev:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mkcdev:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mkfifo:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mktemp:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_net(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/net:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_block(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/block:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/mem:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/pid:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_force(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/force:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/segvguard:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/default/tpe:{action}"))
}
#[no_mangle]
pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
stat(format!("/dev/syd/deny/ioctl+{request}"))
}
#[no_mangle]
pub unsafe extern "C" fn syd_force_add(
path: *const c_char,
alg: *const c_char,
hash: *const c_char,
action: action_t,
) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
if path.is_null() || alg.is_null() || hash.is_null() {
return -EFAULT;
}
let path = unsafe { CStr::from_ptr(path) };
let alg = unsafe { CStr::from_ptr(alg) };
let hash = unsafe { CStr::from_ptr(hash) };
let path = match path.to_str() {
Ok(s) => s,
Err(_) => return -EINVAL,
};
let alg = match alg.to_str() {
Ok(s) => s,
Err(_) => return -EINVAL,
};
let hash = match hash.to_str() {
Ok(s) => s,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/force+{path}:{alg}:{hash}:{action}"))
}
#[no_mangle]
pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
if path.is_null() {
return -EFAULT;
}
let path = unsafe { CStr::from_ptr(path) };
let path = match path.to_str() {
Ok(s) => s,
Err(_) => return -EINVAL,
};
stat(format!("/dev/syd/force-{path}"))
}
#[no_mangle]
pub extern "C" fn syd_force_clr() -> c_int {
stat("/dev/syd/force^")
}
#[no_mangle]
pub extern "C" fn syd_fs_add(action: action_t, name: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/fs"), name, b'+')
}
#[no_mangle]
pub extern "C" fn syd_fs_del(action: action_t, name: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/fs"), name, b'-')
}
#[no_mangle]
pub extern "C" fn syd_fs_rem(action: action_t, name: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/fs"), name, b'^')
}
#[no_mangle]
pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/walk"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/walk"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/walk"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_list_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/list"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_list_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/list"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_list_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/list"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/stat"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/stat"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/stat"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/read"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/read"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/read"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/write"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/write"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/write"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/exec"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/exec"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/exec"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/create"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/create"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/create"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/delete"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/delete"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/delete"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rename"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rename"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rename"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_readlink_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readlink"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_readlink_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readlink"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_readlink_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readlink"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/symlink"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/symlink"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/symlink"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/truncate"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/truncate"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/truncate"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chdir"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chdir"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chdir"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readdir"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readdir"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/readdir"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkdir"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkdir"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkdir"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rmdir"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rmdir"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/rmdir"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chown"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chown"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chown"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chgrp"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chgrp"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chgrp"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chmod"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chmod"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chmod"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chattr"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chattr"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chattr"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chroot"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chroot"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/chroot"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_notify_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/notify"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_notify_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/notify"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_notify_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/notify"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/utime"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/utime"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/utime"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkbdev"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkbdev"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkbdev"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkcdev"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkcdev"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkcdev"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkfifo"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkfifo"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mkfifo"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mktemp"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mktemp"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/mktemp"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/bind"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/bind"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/bind"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/connect"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/connect"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/connect"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/sendfd"), glob, b'+')
}
#[no_mangle]
pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/sendfd"), glob, b'-')
}
#[no_mangle]
pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/sendfd"), glob, b'^')
}
#[no_mangle]
pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/link"), family, b'+')
}
#[no_mangle]
pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/link"), family, b'-')
}
#[no_mangle]
pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
let action = match Action::try_from(action) {
Ok(action) => action,
Err(_) => return -EINVAL,
};
esyd(format!("{action}/net/link"), family, b'^')
}
#[no_mangle]
pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
esyd("mem/max", size, b':')
}
#[no_mangle]
pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
esyd("mem/vm_max", size, b':')
}
#[no_mangle]
pub extern "C" fn syd_pid_max(size: usize) -> c_int {
stat(format!("/dev/syd/pid/max:{size}"))
}
#[no_mangle]
pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
stat(format!("/dev/syd/segvguard/expiry:{timeout}"))
}
#[no_mangle]
pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
stat(format!("/dev/syd/segvguard/suspension:{timeout}"))
}
#[no_mangle]
pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
stat(format!("/dev/syd/segvguard/maxcrashes:{max}"))
}
#[no_mangle]
pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
if file.is_null() || argv.is_null() {
return -EFAULT;
}
let file = CStr::from_ptr(file);
let file = OsStr::from_bytes(file.to_bytes());
let mut path = OsString::from("/dev/syd/cmd/exec!");
path.push(file);
let mut idx: isize = 0;
while !(*argv.offset(idx)).is_null() {
let arg = CStr::from_ptr(*argv.offset(idx));
let arg = OsStr::from_bytes(arg.to_bytes());
path.push(OsStr::from_bytes(b"\x1F")); path.push(arg);
idx = idx.saturating_add(1);
}
let path = PathBuf::from(path);
stat(path)
}