1#![deny(missing_docs)]
29#![deny(clippy::allow_attributes_without_reason)]
30#![deny(clippy::arithmetic_side_effects)]
31#![deny(clippy::as_ptr_cast_mut)]
32#![deny(clippy::as_underscore)]
33#![deny(clippy::assertions_on_result_states)]
34#![deny(clippy::borrow_as_ptr)]
35#![deny(clippy::branches_sharing_code)]
36#![deny(clippy::case_sensitive_file_extension_comparisons)]
37#![deny(clippy::cast_lossless)]
38#![deny(clippy::cast_possible_truncation)]
39#![deny(clippy::cast_possible_wrap)]
40#![deny(clippy::cast_precision_loss)]
41#![deny(clippy::cast_ptr_alignment)]
42#![deny(clippy::cast_sign_loss)]
43#![deny(clippy::checked_conversions)]
44#![deny(clippy::clear_with_drain)]
45#![deny(clippy::clone_on_ref_ptr)]
46#![deny(clippy::cloned_instead_of_copied)]
47#![deny(clippy::cognitive_complexity)]
48#![deny(clippy::collection_is_never_read)]
49#![deny(clippy::copy_iterator)]
50#![deny(clippy::create_dir)]
51#![deny(clippy::dbg_macro)]
52#![deny(clippy::debug_assert_with_mut_call)]
53#![deny(clippy::decimal_literal_representation)]
54#![deny(clippy::default_trait_access)]
55#![deny(clippy::default_union_representation)]
56#![deny(clippy::derive_partial_eq_without_eq)]
57#![deny(clippy::doc_link_with_quotes)]
58#![deny(clippy::doc_markdown)]
59#![deny(clippy::explicit_into_iter_loop)]
60#![deny(clippy::explicit_iter_loop)]
61#![deny(clippy::fallible_impl_from)]
62#![deny(clippy::missing_safety_doc)]
63#![deny(clippy::undocumented_unsafe_blocks)]
64
65use std::{
66 ffi::{CStr, OsStr, OsString},
67 fmt,
68 fs::{symlink_metadata, Metadata},
69 os::{
70 fd::RawFd,
71 raw::{c_char, c_int},
72 unix::{
73 ffi::OsStrExt,
74 fs::{FileTypeExt, MetadataExt},
75 },
76 },
77 path::{Path, PathBuf},
78};
79
80#[allow(non_camel_case_types)]
82pub type lock_state_t = u8;
83
84pub const LOCK_OFF: lock_state_t = 0;
86pub const LOCK_EXEC: lock_state_t = 1;
89pub const LOCK_ON: lock_state_t = 2;
91
92#[repr(u8)]
94#[derive(Copy, Clone, Debug)]
95enum LockState {
96 Off = LOCK_OFF,
98 Exec = LOCK_EXEC,
101 On = LOCK_ON,
103}
104
105impl TryFrom<lock_state_t> for LockState {
106 type Error = ();
107
108 fn try_from(value: lock_state_t) -> Result<Self, Self::Error> {
109 match value {
110 LOCK_OFF => Ok(LockState::Off),
111 LOCK_EXEC => Ok(LockState::Exec),
112 LOCK_ON => Ok(LockState::On),
113 _ => Err(()),
114 }
115 }
116}
117
118impl fmt::Display for LockState {
119 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
120 let state_str = match self {
121 LockState::Off => "off",
122 LockState::Exec => "exec",
123 LockState::On => "on",
124 };
125 write!(f, "{state_str}")
126 }
127}
128
129#[allow(non_camel_case_types)]
131pub type action_t = u8;
132
133pub const ACTION_ALLOW: action_t = 0;
135pub const ACTION_WARN: action_t = 1;
137pub const ACTION_FILTER: action_t = 2;
139pub const ACTION_DENY: action_t = 3;
141pub const ACTION_PANIC: action_t = 4;
143pub const ACTION_STOP: action_t = 5;
145pub const ACTION_ABORT: action_t = 6;
147pub const ACTION_KILL: action_t = 7;
149pub const ACTION_EXIT: action_t = 8;
151
152#[repr(u8)]
154#[derive(Copy, Clone, Debug)]
155enum Action {
156 Allow = ACTION_ALLOW,
158 Warn = ACTION_WARN,
160 Filter = ACTION_FILTER,
162 Deny = ACTION_DENY,
164 Panic = ACTION_PANIC,
166 Stop = ACTION_STOP,
168 Abort = ACTION_ABORT,
170 Kill = ACTION_KILL,
172 Exit = ACTION_EXIT,
174}
175
176impl TryFrom<action_t> for Action {
177 type Error = ();
178
179 fn try_from(value: action_t) -> Result<Self, Self::Error> {
180 match value {
181 ACTION_ALLOW => Ok(Action::Allow),
182 ACTION_WARN => Ok(Action::Warn),
183 ACTION_FILTER => Ok(Action::Filter),
184 ACTION_DENY => Ok(Action::Deny),
185 ACTION_PANIC => Ok(Action::Panic),
186 ACTION_STOP => Ok(Action::Stop),
187 ACTION_ABORT => Ok(Action::Abort),
188 ACTION_KILL => Ok(Action::Kill),
189 ACTION_EXIT => Ok(Action::Exit),
190 _ => Err(()),
191 }
192 }
193}
194
195impl fmt::Display for Action {
196 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
197 let action_str = match self {
198 Action::Allow => "allow",
199 Action::Warn => "warn",
200 Action::Filter => "filter",
201 Action::Deny => "deny",
202 Action::Panic => "panic",
203 Action::Stop => "stop",
204 Action::Abort => "abort",
205 Action::Kill => "kill",
206 Action::Exit => "exit",
207 };
208 write!(f, "{action_str}")
209 }
210}
211
212const EFAULT: i32 = 14;
213const EINVAL: i32 = 22;
214
215#[inline(always)]
216fn check_stat(stat: &Metadata) -> bool {
217 if !stat.file_type().is_char_device() {
218 return false;
219 }
220
221 let rdev = stat.rdev();
222
223 let major = (rdev >> 8) & 0xff;
224 let minor = rdev & 0xff;
225
226 major == 1 && minor == 3
228}
229
230fn stat<P: AsRef<Path>>(path: P) -> c_int {
231 match symlink_metadata(path) {
232 Ok(stat) if check_stat(&stat) => 0,
233 Ok(_) => -EINVAL,
234 Err(error) => match error.raw_os_error() {
235 Some(e) => e.checked_neg().unwrap_or(-EINVAL),
236 None => -EINVAL,
237 },
238 }
239}
240
241fn esyd<P: AsRef<Path>>(rule: P, elem: *const c_char, op: u8) -> c_int {
242 if !matches!(op, b'+' | b'-' | b'^' | b':') {
243 return -EINVAL;
244 }
245
246 if elem.is_null() {
247 return -EFAULT;
248 }
249
250 let elem = unsafe { CStr::from_ptr(elem) };
252 let elem = OsStr::from_bytes(elem.to_bytes());
253
254 let mut path = OsString::from("/dev/syd/");
256 path.push(rule.as_ref());
257 path.push(OsStr::from_bytes(&[op]));
258 path.push(elem);
259
260 let path = PathBuf::from(path);
262
263 stat(path)
264}
265
266#[no_mangle]
273pub extern "C" fn syd_api() -> c_int {
274 match stat("/dev/syd/3") {
275 0 => 3,
276 n => n,
277 }
278}
279
280#[no_mangle]
284pub extern "C" fn syd_check() -> c_int {
285 stat("/dev/syd")
286}
287
288#[no_mangle]
292pub extern "C" fn syd_panic() -> c_int {
293 stat("/dev/syd/panic")
294}
295
296#[no_mangle]
301pub extern "C" fn syd_reset() -> c_int {
302 stat("/dev/syd/reset")
303}
304
305#[no_mangle]
309pub extern "C" fn syd_load(fd: c_int) -> c_int {
310 let fd = match RawFd::try_from(fd) {
311 Ok(fd) if fd < 0 => return -EINVAL,
312 Ok(fd) => fd,
313 Err(_) => return -EINVAL,
314 };
315 stat(&format!("/dev/syd/load/{fd}"))
316}
317
318#[no_mangle]
324pub extern "C" fn syd_lock(state: lock_state_t) -> c_int {
325 let state = match LockState::try_from(state) {
327 Ok(state) => state,
328 Err(_) => return -EINVAL,
329 };
330
331 stat(&format!("/dev/syd/lock:{state}"))
332}
333
334#[no_mangle]
338pub extern "C" fn syd_enabled_walk() -> bool {
339 stat("/dev/syd/sandbox/walk?") == 0
340}
341
342#[no_mangle]
346pub extern "C" fn syd_enable_walk() -> c_int {
347 stat("/dev/syd/sandbox/walk:on")
348}
349
350#[no_mangle]
354pub extern "C" fn syd_disable_walk() -> c_int {
355 stat("/dev/syd/sandbox/walk:off")
356}
357
358#[no_mangle]
362pub extern "C" fn syd_enabled_stat() -> bool {
363 stat("/dev/syd/sandbox/stat?") == 0
364}
365
366#[no_mangle]
370pub extern "C" fn syd_enable_stat() -> c_int {
371 stat("/dev/syd/sandbox/stat:on")
372}
373
374#[no_mangle]
378pub extern "C" fn syd_disable_stat() -> c_int {
379 stat("/dev/syd/sandbox/stat:off")
380}
381
382#[no_mangle]
386pub extern "C" fn syd_enabled_read() -> bool {
387 stat("/dev/syd/sandbox/read?") == 0
388}
389
390#[no_mangle]
394pub extern "C" fn syd_enable_read() -> c_int {
395 stat("/dev/syd/sandbox/read:on")
396}
397
398#[no_mangle]
402pub extern "C" fn syd_disable_read() -> c_int {
403 stat("/dev/syd/sandbox/read:off")
404}
405
406#[no_mangle]
410pub extern "C" fn syd_enabled_write() -> bool {
411 stat("/dev/syd/sandbox/write?") == 0
412}
413
414#[no_mangle]
418pub extern "C" fn syd_enable_write() -> c_int {
419 stat("/dev/syd/sandbox/write:on")
420}
421
422#[no_mangle]
426pub extern "C" fn syd_disable_write() -> c_int {
427 stat("/dev/syd/sandbox/write:off")
428}
429
430#[no_mangle]
434pub extern "C" fn syd_enabled_exec() -> bool {
435 stat("/dev/syd/sandbox/exec?") == 0
436}
437
438#[no_mangle]
442pub extern "C" fn syd_enable_exec() -> c_int {
443 stat("/dev/syd/sandbox/exec:on")
444}
445
446#[no_mangle]
450pub extern "C" fn syd_disable_exec() -> c_int {
451 stat("/dev/syd/sandbox/exec:off")
452}
453
454#[no_mangle]
458pub extern "C" fn syd_enabled_ioctl() -> bool {
459 stat("/dev/syd/sandbox/ioctl?") == 0
460}
461
462#[no_mangle]
466pub extern "C" fn syd_enable_ioctl() -> c_int {
467 stat("/dev/syd/sandbox/ioctl:on")
468}
469
470#[no_mangle]
474pub extern "C" fn syd_disable_ioctl() -> c_int {
475 stat("/dev/syd/sandbox/ioctl:off")
476}
477
478#[no_mangle]
482pub extern "C" fn syd_enabled_create() -> bool {
483 stat("/dev/syd/sandbox/create?") == 0
484}
485
486#[no_mangle]
490pub extern "C" fn syd_enable_create() -> c_int {
491 stat("/dev/syd/sandbox/create:on")
492}
493
494#[no_mangle]
498pub extern "C" fn syd_disable_create() -> c_int {
499 stat("/dev/syd/sandbox/create:off")
500}
501
502#[no_mangle]
506pub extern "C" fn syd_enabled_delete() -> bool {
507 stat("/dev/syd/sandbox/delete?") == 0
508}
509
510#[no_mangle]
514pub extern "C" fn syd_enable_delete() -> c_int {
515 stat("/dev/syd/sandbox/delete:on")
516}
517
518#[no_mangle]
522pub extern "C" fn syd_disable_delete() -> c_int {
523 stat("/dev/syd/sandbox/delete:off")
524}
525
526#[no_mangle]
530pub extern "C" fn syd_enabled_rename() -> bool {
531 stat("/dev/syd/sandbox/rename?") == 0
532}
533
534#[no_mangle]
538pub extern "C" fn syd_enable_rename() -> c_int {
539 stat("/dev/syd/sandbox/rename:on")
540}
541
542#[no_mangle]
546pub extern "C" fn syd_disable_rename() -> c_int {
547 stat("/dev/syd/sandbox/rename:off")
548}
549
550#[no_mangle]
554pub extern "C" fn syd_enabled_symlink() -> bool {
555 stat("/dev/syd/sandbox/symlink?") == 0
556}
557
558#[no_mangle]
562pub extern "C" fn syd_enable_symlink() -> c_int {
563 stat("/dev/syd/sandbox/symlink:on")
564}
565
566#[no_mangle]
570pub extern "C" fn syd_disable_symlink() -> c_int {
571 stat("/dev/syd/sandbox/symlink:off")
572}
573
574#[no_mangle]
578pub extern "C" fn syd_enabled_truncate() -> bool {
579 stat("/dev/syd/sandbox/truncate?") == 0
580}
581
582#[no_mangle]
586pub extern "C" fn syd_enable_truncate() -> c_int {
587 stat("/dev/syd/sandbox/truncate:on")
588}
589
590#[no_mangle]
594pub extern "C" fn syd_disable_truncate() -> c_int {
595 stat("/dev/syd/sandbox/truncate:off")
596}
597
598#[no_mangle]
602pub extern "C" fn syd_enabled_chdir() -> bool {
603 stat("/dev/syd/sandbox/chdir?") == 0
604}
605
606#[no_mangle]
610pub extern "C" fn syd_enable_chdir() -> c_int {
611 stat("/dev/syd/sandbox/chdir:on")
612}
613
614#[no_mangle]
618pub extern "C" fn syd_disable_chdir() -> c_int {
619 stat("/dev/syd/sandbox/chdir:off")
620}
621
622#[no_mangle]
626pub extern "C" fn syd_enabled_readdir() -> bool {
627 stat("/dev/syd/sandbox/readdir?") == 0
628}
629
630#[no_mangle]
634pub extern "C" fn syd_enable_readdir() -> c_int {
635 stat("/dev/syd/sandbox/readdir:on")
636}
637
638#[no_mangle]
642pub extern "C" fn syd_disable_readdir() -> c_int {
643 stat("/dev/syd/sandbox/readdir:off")
644}
645
646#[no_mangle]
650pub extern "C" fn syd_enabled_mkdir() -> bool {
651 stat("/dev/syd/sandbox/mkdir?") == 0
652}
653
654#[no_mangle]
658pub extern "C" fn syd_enable_mkdir() -> c_int {
659 stat("/dev/syd/sandbox/mkdir:on")
660}
661
662#[no_mangle]
666pub extern "C" fn syd_disable_mkdir() -> c_int {
667 stat("/dev/syd/sandbox/mkdir:off")
668}
669
670#[no_mangle]
674pub extern "C" fn syd_enabled_rmdir() -> bool {
675 stat("/dev/syd/sandbox/rmdir?") == 0
676}
677
678#[no_mangle]
682pub extern "C" fn syd_enable_rmdir() -> c_int {
683 stat("/dev/syd/sandbox/rmdir:on")
684}
685
686#[no_mangle]
690pub extern "C" fn syd_disable_rmdir() -> c_int {
691 stat("/dev/syd/sandbox/rmdir:off")
692}
693
694#[no_mangle]
698pub extern "C" fn syd_enabled_chown() -> bool {
699 stat("/dev/syd/sandbox/chown?") == 0
700}
701
702#[no_mangle]
706pub extern "C" fn syd_enable_chown() -> c_int {
707 stat("/dev/syd/sandbox/chown:on")
708}
709
710#[no_mangle]
714pub extern "C" fn syd_disable_chown() -> c_int {
715 stat("/dev/syd/sandbox/chown:off")
716}
717
718#[no_mangle]
722pub extern "C" fn syd_enabled_chgrp() -> bool {
723 stat("/dev/syd/sandbox/chgrp?") == 0
724}
725
726#[no_mangle]
730pub extern "C" fn syd_enable_chgrp() -> c_int {
731 stat("/dev/syd/sandbox/chgrp:on")
732}
733
734#[no_mangle]
738pub extern "C" fn syd_disable_chgrp() -> c_int {
739 stat("/dev/syd/sandbox/chgrp:off")
740}
741
742#[no_mangle]
746pub extern "C" fn syd_enabled_chmod() -> bool {
747 stat("/dev/syd/sandbox/chmod?") == 0
748}
749
750#[no_mangle]
754pub extern "C" fn syd_enable_chmod() -> c_int {
755 stat("/dev/syd/sandbox/chmod:on")
756}
757
758#[no_mangle]
762pub extern "C" fn syd_disable_chmod() -> c_int {
763 stat("/dev/syd/sandbox/chmod:off")
764}
765
766#[no_mangle]
770pub extern "C" fn syd_enabled_chattr() -> bool {
771 stat("/dev/syd/sandbox/chattr?") == 0
772}
773
774#[no_mangle]
778pub extern "C" fn syd_enable_chattr() -> c_int {
779 stat("/dev/syd/sandbox/chattr:on")
780}
781
782#[no_mangle]
786pub extern "C" fn syd_disable_chattr() -> c_int {
787 stat("/dev/syd/sandbox/chattr:off")
788}
789
790#[no_mangle]
794pub extern "C" fn syd_enabled_chroot() -> bool {
795 stat("/dev/syd/sandbox/chroot?") == 0
796}
797
798#[no_mangle]
802pub extern "C" fn syd_enable_chroot() -> c_int {
803 stat("/dev/syd/sandbox/chroot:on")
804}
805
806#[no_mangle]
810pub extern "C" fn syd_disable_chroot() -> c_int {
811 stat("/dev/syd/sandbox/chroot:off")
812}
813
814#[no_mangle]
818pub extern "C" fn syd_enabled_utime() -> bool {
819 stat("/dev/syd/sandbox/utime?") == 0
820}
821
822#[no_mangle]
826pub extern "C" fn syd_enable_utime() -> c_int {
827 stat("/dev/syd/sandbox/utime:on")
828}
829
830#[no_mangle]
834pub extern "C" fn syd_disable_utime() -> c_int {
835 stat("/dev/syd/sandbox/utime:off")
836}
837
838#[no_mangle]
842pub extern "C" fn syd_enabled_mkbdev() -> bool {
843 stat("/dev/syd/sandbox/mkbdev?") == 0
844}
845
846#[no_mangle]
850pub extern "C" fn syd_enable_mkbdev() -> c_int {
851 stat("/dev/syd/sandbox/mkbdev:on")
852}
853
854#[no_mangle]
858pub extern "C" fn syd_disable_mkbdev() -> c_int {
859 stat("/dev/syd/sandbox/mkbdev:off")
860}
861
862#[no_mangle]
866pub extern "C" fn syd_enabled_mkcdev() -> bool {
867 stat("/dev/syd/sandbox/mkcdev?") == 0
868}
869
870#[no_mangle]
874pub extern "C" fn syd_enable_mkcdev() -> c_int {
875 stat("/dev/syd/sandbox/mkcdev:on")
876}
877
878#[no_mangle]
882pub extern "C" fn syd_disable_mkcdev() -> c_int {
883 stat("/dev/syd/sandbox/mkcdev:off")
884}
885
886#[no_mangle]
890pub extern "C" fn syd_enabled_mkfifo() -> bool {
891 stat("/dev/syd/sandbox/mkfifo?") == 0
892}
893
894#[no_mangle]
898pub extern "C" fn syd_enable_mkfifo() -> c_int {
899 stat("/dev/syd/sandbox/mkfifo:on")
900}
901
902#[no_mangle]
906pub extern "C" fn syd_disable_mkfifo() -> c_int {
907 stat("/dev/syd/sandbox/mkfifo:off")
908}
909
910#[no_mangle]
914pub extern "C" fn syd_enabled_mktemp() -> bool {
915 stat("/dev/syd/sandbox/mktemp?") == 0
916}
917
918#[no_mangle]
922pub extern "C" fn syd_enable_mktemp() -> c_int {
923 stat("/dev/syd/sandbox/mktemp:on")
924}
925
926#[no_mangle]
930pub extern "C" fn syd_disable_mktemp() -> c_int {
931 stat("/dev/syd/sandbox/mktemp:off")
932}
933
934#[no_mangle]
938pub extern "C" fn syd_enabled_net() -> bool {
939 stat("/dev/syd/sandbox/net?") == 0
940}
941
942#[no_mangle]
946pub extern "C" fn syd_enable_net() -> c_int {
947 stat("/dev/syd/sandbox/net:on")
948}
949
950#[no_mangle]
954pub extern "C" fn syd_disable_net() -> c_int {
955 stat("/dev/syd/sandbox/net:off")
956}
957
958#[no_mangle]
962pub extern "C" fn syd_enabled_mem() -> bool {
963 stat("/dev/syd/sandbox/mem?") == 0
964}
965
966#[no_mangle]
970pub extern "C" fn syd_enable_mem() -> c_int {
971 stat("/dev/syd/sandbox/mem:on")
972}
973
974#[no_mangle]
978pub extern "C" fn syd_disable_mem() -> c_int {
979 stat("/dev/syd/sandbox/mem:off")
980}
981
982#[no_mangle]
986pub extern "C" fn syd_enabled_pid() -> bool {
987 stat("/dev/syd/sandbox/pid?") == 0
988}
989
990#[no_mangle]
994pub extern "C" fn syd_enable_pid() -> c_int {
995 stat("/dev/syd/sandbox/pid:on")
996}
997
998#[no_mangle]
1002pub extern "C" fn syd_disable_pid() -> c_int {
1003 stat("/dev/syd/sandbox/pid:off")
1004}
1005
1006#[no_mangle]
1010pub extern "C" fn syd_enabled_lock() -> bool {
1011 stat("/dev/syd/sandbox/lock?") == 0
1012}
1013
1014#[no_mangle]
1018pub extern "C" fn syd_enabled_crypt() -> bool {
1019 stat("/dev/syd/sandbox/crypt?") == 0
1020}
1021
1022#[no_mangle]
1026pub extern "C" fn syd_enabled_proxy() -> bool {
1027 stat("/dev/syd/sandbox/proxy?") == 0
1028}
1029
1030#[no_mangle]
1034pub extern "C" fn syd_enabled_force() -> bool {
1035 stat("/dev/syd/sandbox/force?") == 0
1036}
1037
1038#[no_mangle]
1042pub extern "C" fn syd_enable_force() -> c_int {
1043 stat("/dev/syd/sandbox/force:on")
1044}
1045
1046#[no_mangle]
1050pub extern "C" fn syd_disable_force() -> c_int {
1051 stat("/dev/syd/sandbox/force:off")
1052}
1053
1054#[no_mangle]
1058pub extern "C" fn syd_enabled_tpe() -> bool {
1059 stat("/dev/syd/sandbox/tpe?") == 0
1060}
1061
1062#[no_mangle]
1066pub extern "C" fn syd_enable_tpe() -> c_int {
1067 stat("/dev/syd/sandbox/tpe:on")
1068}
1069
1070#[no_mangle]
1074pub extern "C" fn syd_disable_tpe() -> c_int {
1075 stat("/dev/syd/sandbox/tpe:off")
1076}
1077
1078#[no_mangle]
1080pub extern "C" fn syd_default_walk(action: action_t) -> c_int {
1081 let action = match Action::try_from(action) {
1083 Ok(action) => action,
1084 Err(_) => return -EINVAL,
1085 };
1086 stat(&format!("/dev/syd/default/walk:{action}"))
1087}
1088
1089#[no_mangle]
1091pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
1092 let action = match Action::try_from(action) {
1094 Ok(action) => action,
1095 Err(_) => return -EINVAL,
1096 };
1097 stat(&format!("/dev/syd/default/stat:{action}"))
1098}
1099
1100#[no_mangle]
1102pub extern "C" fn syd_default_read(action: action_t) -> c_int {
1103 let action = match Action::try_from(action) {
1105 Ok(action) => action,
1106 Err(_) => return -EINVAL,
1107 };
1108 stat(&format!("/dev/syd/default/read:{action}"))
1109}
1110
1111#[no_mangle]
1113pub extern "C" fn syd_default_write(action: action_t) -> c_int {
1114 let action = match Action::try_from(action) {
1116 Ok(action) => action,
1117 Err(_) => return -EINVAL,
1118 };
1119 stat(&format!("/dev/syd/default/write:{action}"))
1120}
1121
1122#[no_mangle]
1124pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
1125 let action = match Action::try_from(action) {
1127 Ok(action) => action,
1128 Err(_) => return -EINVAL,
1129 };
1130 stat(&format!("/dev/syd/default/exec:{action}"))
1131}
1132
1133#[no_mangle]
1135pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
1136 let action = match Action::try_from(action) {
1138 Ok(action) => action,
1139 Err(_) => return -EINVAL,
1140 };
1141 stat(&format!("/dev/syd/default/ioctl:{action}"))
1142}
1143
1144#[no_mangle]
1146pub extern "C" fn syd_default_create(action: action_t) -> c_int {
1147 let action = match Action::try_from(action) {
1149 Ok(action) => action,
1150 Err(_) => return -EINVAL,
1151 };
1152 stat(&format!("/dev/syd/default/create:{action}"))
1153}
1154
1155#[no_mangle]
1157pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
1158 let action = match Action::try_from(action) {
1160 Ok(action) => action,
1161 Err(_) => return -EINVAL,
1162 };
1163 stat(&format!("/dev/syd/default/delete:{action}"))
1164}
1165
1166#[no_mangle]
1168pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
1169 let action = match Action::try_from(action) {
1171 Ok(action) => action,
1172 Err(_) => return -EINVAL,
1173 };
1174 stat(&format!("/dev/syd/default/rename:{action}"))
1175}
1176
1177#[no_mangle]
1179pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
1180 let action = match Action::try_from(action) {
1182 Ok(action) => action,
1183 Err(_) => return -EINVAL,
1184 };
1185 stat(&format!("/dev/syd/default/symlink:{action}"))
1186}
1187
1188#[no_mangle]
1190pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
1191 let action = match Action::try_from(action) {
1193 Ok(action) => action,
1194 Err(_) => return -EINVAL,
1195 };
1196 stat(&format!("/dev/syd/default/truncate:{action}"))
1197}
1198
1199#[no_mangle]
1201pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
1202 let action = match Action::try_from(action) {
1204 Ok(action) => action,
1205 Err(_) => return -EINVAL,
1206 };
1207 stat(&format!("/dev/syd/default/chdir:{action}"))
1208}
1209
1210#[no_mangle]
1212pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
1213 let action = match Action::try_from(action) {
1215 Ok(action) => action,
1216 Err(_) => return -EINVAL,
1217 };
1218 stat(&format!("/dev/syd/default/readdir:{action}"))
1219}
1220
1221#[no_mangle]
1223pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
1224 let action = match Action::try_from(action) {
1226 Ok(action) => action,
1227 Err(_) => return -EINVAL,
1228 };
1229 stat(&format!("/dev/syd/default/mkdir:{action}"))
1230}
1231
1232#[no_mangle]
1234pub extern "C" fn syd_default_rmdir(action: action_t) -> c_int {
1235 let action = match Action::try_from(action) {
1237 Ok(action) => action,
1238 Err(_) => return -EINVAL,
1239 };
1240 stat(&format!("/dev/syd/default/rmdir:{action}"))
1241}
1242
1243#[no_mangle]
1245pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1246 let action = match Action::try_from(action) {
1248 Ok(action) => action,
1249 Err(_) => return -EINVAL,
1250 };
1251 stat(&format!("/dev/syd/default/chown:{action}"))
1252}
1253
1254#[no_mangle]
1256pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1257 let action = match Action::try_from(action) {
1259 Ok(action) => action,
1260 Err(_) => return -EINVAL,
1261 };
1262 stat(&format!("/dev/syd/default/chgrp:{action}"))
1263}
1264
1265#[no_mangle]
1267pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1268 let action = match Action::try_from(action) {
1270 Ok(action) => action,
1271 Err(_) => return -EINVAL,
1272 };
1273 stat(&format!("/dev/syd/default/chmod:{action}"))
1274}
1275
1276#[no_mangle]
1278pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1279 let action = match Action::try_from(action) {
1281 Ok(action) => action,
1282 Err(_) => return -EINVAL,
1283 };
1284 stat(&format!("/dev/syd/default/chattr:{action}"))
1285}
1286
1287#[no_mangle]
1289pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1290 let action = match Action::try_from(action) {
1292 Ok(action) => action,
1293 Err(_) => return -EINVAL,
1294 };
1295 stat(&format!("/dev/syd/default/chroot:{action}"))
1296}
1297
1298#[no_mangle]
1300pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1301 let action = match Action::try_from(action) {
1303 Ok(action) => action,
1304 Err(_) => return -EINVAL,
1305 };
1306 stat(&format!("/dev/syd/default/utime:{action}"))
1307}
1308
1309#[no_mangle]
1311pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
1312 let action = match Action::try_from(action) {
1314 Ok(action) => action,
1315 Err(_) => return -EINVAL,
1316 };
1317 stat(&format!("/dev/syd/default/mkbdev:{action}"))
1318}
1319
1320#[no_mangle]
1322pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
1323 let action = match Action::try_from(action) {
1325 Ok(action) => action,
1326 Err(_) => return -EINVAL,
1327 };
1328 stat(&format!("/dev/syd/default/mkcdev:{action}"))
1329}
1330
1331#[no_mangle]
1333pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1334 let action = match Action::try_from(action) {
1336 Ok(action) => action,
1337 Err(_) => return -EINVAL,
1338 };
1339 stat(&format!("/dev/syd/default/mkfifo:{action}"))
1340}
1341
1342#[no_mangle]
1344pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1345 let action = match Action::try_from(action) {
1347 Ok(action) => action,
1348 Err(_) => return -EINVAL,
1349 };
1350 stat(&format!("/dev/syd/default/mktemp:{action}"))
1351}
1352
1353#[no_mangle]
1355pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1356 let action = match Action::try_from(action) {
1358 Ok(action) => action,
1359 Err(_) => return -EINVAL,
1360 };
1361 stat(&format!("/dev/syd/default/net:{action}"))
1362}
1363
1364#[no_mangle]
1366pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1367 let action = match Action::try_from(action) {
1369 Ok(action) => action,
1370 Err(_) => return -EINVAL,
1371 };
1372 stat(&format!("/dev/syd/default/block:{action}"))
1373}
1374
1375#[no_mangle]
1377pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1378 let action = match Action::try_from(action) {
1380 Ok(action) => action,
1381 Err(_) => return -EINVAL,
1382 };
1383 stat(&format!("/dev/syd/default/mem:{action}"))
1384}
1385
1386#[no_mangle]
1388pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1389 let action = match Action::try_from(action) {
1391 Ok(action) => action,
1392 Err(_) => return -EINVAL,
1393 };
1394 stat(&format!("/dev/syd/default/pid:{action}"))
1395}
1396
1397#[no_mangle]
1399pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1400 let action = match Action::try_from(action) {
1402 Ok(action) => action,
1403 Err(_) => return -EINVAL,
1404 };
1405 stat(&format!("/dev/syd/default/force:{action}"))
1406}
1407
1408#[no_mangle]
1410pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1411 let action = match Action::try_from(action) {
1413 Ok(action) => action,
1414 Err(_) => return -EINVAL,
1415 };
1416 stat(&format!("/dev/syd/default/segvguard:{action}"))
1417}
1418
1419#[no_mangle]
1421pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1422 let action = match Action::try_from(action) {
1424 Ok(action) => action,
1425 Err(_) => return -EINVAL,
1426 };
1427 stat(&format!("/dev/syd/default/tpe:{action}"))
1428}
1429
1430#[no_mangle]
1432pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1433 stat(&format!("/dev/syd/ioctl/deny+{request}"))
1434}
1435
1436#[no_mangle]
1451pub unsafe extern "C" fn syd_force_add(
1452 path: *const c_char,
1453 hash: *const c_char,
1454 action: action_t,
1455) -> c_int {
1456 let action = match Action::try_from(action) {
1458 Ok(action) => action,
1459 Err(_) => return -EINVAL,
1460 };
1461
1462 if path.is_null() || hash.is_null() {
1463 return -EFAULT;
1464 }
1465
1466 let path = unsafe { CStr::from_ptr(path) };
1468 let hash = unsafe { CStr::from_ptr(hash) };
1470 let path = match path.to_str() {
1471 Ok(s) => s,
1472 Err(_) => return -EINVAL,
1473 };
1474 let hash = match hash.to_str() {
1475 Ok(s) => s,
1476 Err(_) => return -EINVAL,
1477 };
1478
1479 stat(format!("/dev/syd/force+{path}:{hash}:{action}"))
1481}
1482
1483#[no_mangle]
1495pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1496 if path.is_null() {
1497 return -EFAULT;
1498 }
1499
1500 let path = unsafe { CStr::from_ptr(path) };
1502 let path = match path.to_str() {
1503 Ok(s) => s,
1504 Err(_) => return -EINVAL,
1505 };
1506
1507 stat(format!("/dev/syd/force-{path}"))
1509}
1510
1511#[no_mangle]
1513pub extern "C" fn syd_force_clr() -> c_int {
1514 stat("/dev/syd/force^")
1515}
1516
1517#[no_mangle]
1521pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
1522 let action = match Action::try_from(action) {
1524 Ok(action) => action,
1525 Err(_) => return -EINVAL,
1526 };
1527
1528 esyd(&format!("{action}/walk"), glob, b'+')
1530}
1531
1532#[no_mangle]
1537pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
1538 let action = match Action::try_from(action) {
1540 Ok(action) => action,
1541 Err(_) => return -EINVAL,
1542 };
1543
1544 esyd(&format!("{action}/walk"), glob, b'-')
1546}
1547
1548#[no_mangle]
1552pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
1553 let action = match Action::try_from(action) {
1555 Ok(action) => action,
1556 Err(_) => return -EINVAL,
1557 };
1558
1559 esyd(&format!("{action}/walk"), glob, b'^')
1561}
1562
1563#[no_mangle]
1567pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1568 let action = match Action::try_from(action) {
1570 Ok(action) => action,
1571 Err(_) => return -EINVAL,
1572 };
1573
1574 esyd(&format!("{action}/stat"), glob, b'+')
1576}
1577
1578#[no_mangle]
1583pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1584 let action = match Action::try_from(action) {
1586 Ok(action) => action,
1587 Err(_) => return -EINVAL,
1588 };
1589
1590 esyd(&format!("{action}/stat"), glob, b'-')
1592}
1593
1594#[no_mangle]
1598pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1599 let action = match Action::try_from(action) {
1601 Ok(action) => action,
1602 Err(_) => return -EINVAL,
1603 };
1604
1605 esyd(&format!("{action}/stat"), glob, b'^')
1607}
1608
1609#[no_mangle]
1613pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1614 let action = match Action::try_from(action) {
1616 Ok(action) => action,
1617 Err(_) => return -EINVAL,
1618 };
1619
1620 esyd(&format!("{action}/read"), glob, b'+')
1622}
1623
1624#[no_mangle]
1629pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1630 let action = match Action::try_from(action) {
1632 Ok(action) => action,
1633 Err(_) => return -EINVAL,
1634 };
1635
1636 esyd(&format!("{action}/read"), glob, b'-')
1638}
1639
1640#[no_mangle]
1644pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1645 let action = match Action::try_from(action) {
1647 Ok(action) => action,
1648 Err(_) => return -EINVAL,
1649 };
1650
1651 esyd(&format!("{action}/read"), glob, b'^')
1653}
1654
1655#[no_mangle]
1659pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1660 let action = match Action::try_from(action) {
1662 Ok(action) => action,
1663 Err(_) => return -EINVAL,
1664 };
1665
1666 esyd(&format!("{action}/write"), glob, b'+')
1668}
1669
1670#[no_mangle]
1675pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1676 let action = match Action::try_from(action) {
1678 Ok(action) => action,
1679 Err(_) => return -EINVAL,
1680 };
1681
1682 esyd(&format!("{action}/write"), glob, b'-')
1684}
1685
1686#[no_mangle]
1690pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1691 let action = match Action::try_from(action) {
1693 Ok(action) => action,
1694 Err(_) => return -EINVAL,
1695 };
1696
1697 esyd(&format!("{action}/write"), glob, b'^')
1699}
1700
1701#[no_mangle]
1705pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1706 let action = match Action::try_from(action) {
1708 Ok(action) => action,
1709 Err(_) => return -EINVAL,
1710 };
1711
1712 esyd(&format!("{action}/exec"), glob, b'+')
1714}
1715
1716#[no_mangle]
1721pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1722 let action = match Action::try_from(action) {
1724 Ok(action) => action,
1725 Err(_) => return -EINVAL,
1726 };
1727
1728 esyd(&format!("{action}/exec"), glob, b'-')
1730}
1731
1732#[no_mangle]
1736pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
1737 let action = match Action::try_from(action) {
1739 Ok(action) => action,
1740 Err(_) => return -EINVAL,
1741 };
1742
1743 esyd(&format!("{action}/exec"), glob, b'^')
1745}
1746
1747#[no_mangle]
1751pub extern "C" fn syd_ioctl_add(action: action_t, glob: *const c_char) -> c_int {
1752 let action = match Action::try_from(action) {
1754 Ok(action) => action,
1755 Err(_) => return -EINVAL,
1756 };
1757
1758 esyd(&format!("{action}/ioctl"), glob, b'+')
1760}
1761
1762#[no_mangle]
1767pub extern "C" fn syd_ioctl_del(action: action_t, glob: *const c_char) -> c_int {
1768 let action = match Action::try_from(action) {
1770 Ok(action) => action,
1771 Err(_) => return -EINVAL,
1772 };
1773
1774 esyd(&format!("{action}/ioctl"), glob, b'-')
1776}
1777
1778#[no_mangle]
1782pub extern "C" fn syd_ioctl_rem(action: action_t, glob: *const c_char) -> c_int {
1783 let action = match Action::try_from(action) {
1785 Ok(action) => action,
1786 Err(_) => return -EINVAL,
1787 };
1788
1789 esyd(&format!("{action}/ioctl"), glob, b'^')
1791}
1792
1793#[no_mangle]
1797pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
1798 let action = match Action::try_from(action) {
1800 Ok(action) => action,
1801 Err(_) => return -EINVAL,
1802 };
1803
1804 esyd(&format!("{action}/create"), glob, b'+')
1806}
1807
1808#[no_mangle]
1813pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
1814 let action = match Action::try_from(action) {
1816 Ok(action) => action,
1817 Err(_) => return -EINVAL,
1818 };
1819
1820 esyd(&format!("{action}/create"), glob, b'-')
1822}
1823
1824#[no_mangle]
1828pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
1829 let action = match Action::try_from(action) {
1831 Ok(action) => action,
1832 Err(_) => return -EINVAL,
1833 };
1834
1835 esyd(&format!("{action}/create"), glob, b'^')
1837}
1838
1839#[no_mangle]
1843pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
1844 let action = match Action::try_from(action) {
1846 Ok(action) => action,
1847 Err(_) => return -EINVAL,
1848 };
1849
1850 esyd(&format!("{action}/delete"), glob, b'+')
1852}
1853
1854#[no_mangle]
1859pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
1860 let action = match Action::try_from(action) {
1862 Ok(action) => action,
1863 Err(_) => return -EINVAL,
1864 };
1865
1866 esyd(&format!("{action}/delete"), glob, b'-')
1868}
1869
1870#[no_mangle]
1874pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
1875 let action = match Action::try_from(action) {
1877 Ok(action) => action,
1878 Err(_) => return -EINVAL,
1879 };
1880
1881 esyd(&format!("{action}/delete"), glob, b'^')
1883}
1884
1885#[no_mangle]
1889pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
1890 let action = match Action::try_from(action) {
1892 Ok(action) => action,
1893 Err(_) => return -EINVAL,
1894 };
1895
1896 esyd(&format!("{action}/rename"), glob, b'+')
1898}
1899
1900#[no_mangle]
1905pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
1906 let action = match Action::try_from(action) {
1908 Ok(action) => action,
1909 Err(_) => return -EINVAL,
1910 };
1911
1912 esyd(&format!("{action}/rename"), glob, b'-')
1914}
1915
1916#[no_mangle]
1920pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
1921 let action = match Action::try_from(action) {
1923 Ok(action) => action,
1924 Err(_) => return -EINVAL,
1925 };
1926
1927 esyd(&format!("{action}/rename"), glob, b'^')
1929}
1930
1931#[no_mangle]
1935pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
1936 let action = match Action::try_from(action) {
1938 Ok(action) => action,
1939 Err(_) => return -EINVAL,
1940 };
1941
1942 esyd(&format!("{action}/symlink"), glob, b'+')
1944}
1945
1946#[no_mangle]
1951pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
1952 let action = match Action::try_from(action) {
1954 Ok(action) => action,
1955 Err(_) => return -EINVAL,
1956 };
1957
1958 esyd(&format!("{action}/symlink"), glob, b'-')
1960}
1961
1962#[no_mangle]
1966pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
1967 let action = match Action::try_from(action) {
1969 Ok(action) => action,
1970 Err(_) => return -EINVAL,
1971 };
1972
1973 esyd(&format!("{action}/symlink"), glob, b'^')
1975}
1976
1977#[no_mangle]
1981pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
1982 let action = match Action::try_from(action) {
1984 Ok(action) => action,
1985 Err(_) => return -EINVAL,
1986 };
1987
1988 esyd(&format!("{action}/truncate"), glob, b'+')
1990}
1991
1992#[no_mangle]
1997pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
1998 let action = match Action::try_from(action) {
2000 Ok(action) => action,
2001 Err(_) => return -EINVAL,
2002 };
2003
2004 esyd(&format!("{action}/truncate"), glob, b'-')
2006}
2007
2008#[no_mangle]
2012pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
2013 let action = match Action::try_from(action) {
2015 Ok(action) => action,
2016 Err(_) => return -EINVAL,
2017 };
2018
2019 esyd(&format!("{action}/truncate"), glob, b'^')
2021}
2022
2023#[no_mangle]
2027pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
2028 let action = match Action::try_from(action) {
2030 Ok(action) => action,
2031 Err(_) => return -EINVAL,
2032 };
2033
2034 esyd(&format!("{action}/chdir"), glob, b'+')
2036}
2037
2038#[no_mangle]
2043pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
2044 let action = match Action::try_from(action) {
2046 Ok(action) => action,
2047 Err(_) => return -EINVAL,
2048 };
2049
2050 esyd(&format!("{action}/chdir"), glob, b'-')
2052}
2053
2054#[no_mangle]
2058pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
2059 let action = match Action::try_from(action) {
2061 Ok(action) => action,
2062 Err(_) => return -EINVAL,
2063 };
2064
2065 esyd(&format!("{action}/chdir"), glob, b'^')
2067}
2068
2069#[no_mangle]
2073pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
2074 let action = match Action::try_from(action) {
2076 Ok(action) => action,
2077 Err(_) => return -EINVAL,
2078 };
2079
2080 esyd(&format!("{action}/readdir"), glob, b'+')
2082}
2083
2084#[no_mangle]
2089pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
2090 let action = match Action::try_from(action) {
2092 Ok(action) => action,
2093 Err(_) => return -EINVAL,
2094 };
2095
2096 esyd(&format!("{action}/readdir"), glob, b'-')
2098}
2099
2100#[no_mangle]
2104pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
2105 let action = match Action::try_from(action) {
2107 Ok(action) => action,
2108 Err(_) => return -EINVAL,
2109 };
2110
2111 esyd(&format!("{action}/readdir"), glob, b'^')
2113}
2114
2115#[no_mangle]
2119pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
2120 let action = match Action::try_from(action) {
2122 Ok(action) => action,
2123 Err(_) => return -EINVAL,
2124 };
2125
2126 esyd(&format!("{action}/mkdir"), glob, b'+')
2128}
2129
2130#[no_mangle]
2135pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
2136 let action = match Action::try_from(action) {
2138 Ok(action) => action,
2139 Err(_) => return -EINVAL,
2140 };
2141
2142 esyd(&format!("{action}/mkdir"), glob, b'-')
2144}
2145
2146#[no_mangle]
2150pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2151 let action = match Action::try_from(action) {
2153 Ok(action) => action,
2154 Err(_) => return -EINVAL,
2155 };
2156
2157 esyd(&format!("{action}/mkdir"), glob, b'^')
2159}
2160
2161#[no_mangle]
2165pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
2166 let action = match Action::try_from(action) {
2168 Ok(action) => action,
2169 Err(_) => return -EINVAL,
2170 };
2171
2172 esyd(&format!("{action}/rmdir"), glob, b'+')
2174}
2175
2176#[no_mangle]
2181pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
2182 let action = match Action::try_from(action) {
2184 Ok(action) => action,
2185 Err(_) => return -EINVAL,
2186 };
2187
2188 esyd(&format!("{action}/rmdir"), glob, b'-')
2190}
2191
2192#[no_mangle]
2196pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
2197 let action = match Action::try_from(action) {
2199 Ok(action) => action,
2200 Err(_) => return -EINVAL,
2201 };
2202
2203 esyd(&format!("{action}/rmdir"), glob, b'^')
2205}
2206
2207#[no_mangle]
2211pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2212 let action = match Action::try_from(action) {
2214 Ok(action) => action,
2215 Err(_) => return -EINVAL,
2216 };
2217
2218 esyd(&format!("{action}/chown"), glob, b'+')
2220}
2221
2222#[no_mangle]
2227pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2228 let action = match Action::try_from(action) {
2230 Ok(action) => action,
2231 Err(_) => return -EINVAL,
2232 };
2233
2234 esyd(&format!("{action}/chown"), glob, b'-')
2236}
2237
2238#[no_mangle]
2242pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2243 let action = match Action::try_from(action) {
2245 Ok(action) => action,
2246 Err(_) => return -EINVAL,
2247 };
2248
2249 esyd(&format!("{action}/chown"), glob, b'^')
2251}
2252
2253#[no_mangle]
2257pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2258 let action = match Action::try_from(action) {
2260 Ok(action) => action,
2261 Err(_) => return -EINVAL,
2262 };
2263
2264 esyd(&format!("{action}/chgrp"), glob, b'+')
2266}
2267
2268#[no_mangle]
2273pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2274 let action = match Action::try_from(action) {
2276 Ok(action) => action,
2277 Err(_) => return -EINVAL,
2278 };
2279
2280 esyd(&format!("{action}/chgrp"), glob, b'-')
2282}
2283
2284#[no_mangle]
2288pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2289 let action = match Action::try_from(action) {
2291 Ok(action) => action,
2292 Err(_) => return -EINVAL,
2293 };
2294
2295 esyd(&format!("{action}/chgrp"), glob, b'^')
2297}
2298
2299#[no_mangle]
2303pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2304 let action = match Action::try_from(action) {
2306 Ok(action) => action,
2307 Err(_) => return -EINVAL,
2308 };
2309
2310 esyd(&format!("{action}/chmod"), glob, b'+')
2312}
2313
2314#[no_mangle]
2319pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2320 let action = match Action::try_from(action) {
2322 Ok(action) => action,
2323 Err(_) => return -EINVAL,
2324 };
2325
2326 esyd(&format!("{action}/chmod"), glob, b'-')
2328}
2329
2330#[no_mangle]
2334pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2335 let action = match Action::try_from(action) {
2337 Ok(action) => action,
2338 Err(_) => return -EINVAL,
2339 };
2340
2341 esyd(&format!("{action}/chmod"), glob, b'^')
2343}
2344
2345#[no_mangle]
2349pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2350 let action = match Action::try_from(action) {
2352 Ok(action) => action,
2353 Err(_) => return -EINVAL,
2354 };
2355
2356 esyd(&format!("{action}/chattr"), glob, b'+')
2358}
2359
2360#[no_mangle]
2365pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2366 let action = match Action::try_from(action) {
2368 Ok(action) => action,
2369 Err(_) => return -EINVAL,
2370 };
2371
2372 esyd(&format!("{action}/chattr"), glob, b'-')
2374}
2375
2376#[no_mangle]
2380pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2381 let action = match Action::try_from(action) {
2383 Ok(action) => action,
2384 Err(_) => return -EINVAL,
2385 };
2386
2387 esyd(&format!("{action}/chattr"), glob, b'^')
2389}
2390
2391#[no_mangle]
2395pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2396 let action = match Action::try_from(action) {
2398 Ok(action) => action,
2399 Err(_) => return -EINVAL,
2400 };
2401
2402 esyd(&format!("{action}/chroot"), glob, b'+')
2404}
2405
2406#[no_mangle]
2411pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2412 let action = match Action::try_from(action) {
2414 Ok(action) => action,
2415 Err(_) => return -EINVAL,
2416 };
2417
2418 esyd(&format!("{action}/chroot"), glob, b'-')
2420}
2421
2422#[no_mangle]
2426pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2427 let action = match Action::try_from(action) {
2429 Ok(action) => action,
2430 Err(_) => return -EINVAL,
2431 };
2432
2433 esyd(&format!("{action}/chroot"), glob, b'^')
2435}
2436
2437#[no_mangle]
2441pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2442 let action = match Action::try_from(action) {
2444 Ok(action) => action,
2445 Err(_) => return -EINVAL,
2446 };
2447
2448 esyd(&format!("{action}/utime"), glob, b'+')
2450}
2451
2452#[no_mangle]
2457pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2458 let action = match Action::try_from(action) {
2460 Ok(action) => action,
2461 Err(_) => return -EINVAL,
2462 };
2463
2464 esyd(&format!("{action}/utime"), glob, b'-')
2466}
2467
2468#[no_mangle]
2472pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2473 let action = match Action::try_from(action) {
2475 Ok(action) => action,
2476 Err(_) => return -EINVAL,
2477 };
2478
2479 esyd(&format!("{action}/utime"), glob, b'^')
2481}
2482
2483#[no_mangle]
2487pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
2488 let action = match Action::try_from(action) {
2490 Ok(action) => action,
2491 Err(_) => return -EINVAL,
2492 };
2493
2494 esyd(&format!("{action}/mkbdev"), glob, b'+')
2496}
2497
2498#[no_mangle]
2503pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
2504 let action = match Action::try_from(action) {
2506 Ok(action) => action,
2507 Err(_) => return -EINVAL,
2508 };
2509
2510 esyd(&format!("{action}/mkbdev"), glob, b'-')
2512}
2513
2514#[no_mangle]
2518pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
2519 let action = match Action::try_from(action) {
2521 Ok(action) => action,
2522 Err(_) => return -EINVAL,
2523 };
2524
2525 esyd(&format!("{action}/mkbdev"), glob, b'^')
2527}
2528
2529#[no_mangle]
2533pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
2534 let action = match Action::try_from(action) {
2536 Ok(action) => action,
2537 Err(_) => return -EINVAL,
2538 };
2539
2540 esyd(&format!("{action}/mkcdev"), glob, b'+')
2542}
2543
2544#[no_mangle]
2549pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
2550 let action = match Action::try_from(action) {
2552 Ok(action) => action,
2553 Err(_) => return -EINVAL,
2554 };
2555
2556 esyd(&format!("{action}/mkcdev"), glob, b'-')
2558}
2559
2560#[no_mangle]
2564pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
2565 let action = match Action::try_from(action) {
2567 Ok(action) => action,
2568 Err(_) => return -EINVAL,
2569 };
2570
2571 esyd(&format!("{action}/mkcdev"), glob, b'^')
2573}
2574
2575#[no_mangle]
2579pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2580 let action = match Action::try_from(action) {
2582 Ok(action) => action,
2583 Err(_) => return -EINVAL,
2584 };
2585
2586 esyd(&format!("{action}/mkfifo"), glob, b'+')
2588}
2589
2590#[no_mangle]
2595pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2596 let action = match Action::try_from(action) {
2598 Ok(action) => action,
2599 Err(_) => return -EINVAL,
2600 };
2601
2602 esyd(&format!("{action}/mkfifo"), glob, b'-')
2604}
2605
2606#[no_mangle]
2610pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2611 let action = match Action::try_from(action) {
2613 Ok(action) => action,
2614 Err(_) => return -EINVAL,
2615 };
2616
2617 esyd(&format!("{action}/mkfifo"), glob, b'^')
2619}
2620
2621#[no_mangle]
2625pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2626 let action = match Action::try_from(action) {
2628 Ok(action) => action,
2629 Err(_) => return -EINVAL,
2630 };
2631
2632 esyd(&format!("{action}/mktemp"), glob, b'+')
2634}
2635
2636#[no_mangle]
2641pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2642 let action = match Action::try_from(action) {
2644 Ok(action) => action,
2645 Err(_) => return -EINVAL,
2646 };
2647
2648 esyd(&format!("{action}/mktemp"), glob, b'-')
2650}
2651
2652#[no_mangle]
2656pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2657 let action = match Action::try_from(action) {
2659 Ok(action) => action,
2660 Err(_) => return -EINVAL,
2661 };
2662
2663 esyd(&format!("{action}/mktemp"), glob, b'^')
2665}
2666
2667#[no_mangle]
2671pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2672 let action = match Action::try_from(action) {
2674 Ok(action) => action,
2675 Err(_) => return -EINVAL,
2676 };
2677
2678 esyd(&format!("{action}/net/bind"), glob, b'+')
2680}
2681
2682#[no_mangle]
2687pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2688 let action = match Action::try_from(action) {
2690 Ok(action) => action,
2691 Err(_) => return -EINVAL,
2692 };
2693
2694 esyd(&format!("{action}/net/bind"), glob, b'-')
2696}
2697
2698#[no_mangle]
2702pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
2703 let action = match Action::try_from(action) {
2705 Ok(action) => action,
2706 Err(_) => return -EINVAL,
2707 };
2708
2709 esyd(&format!("{action}/net/bind"), glob, b'^')
2711}
2712
2713#[no_mangle]
2717pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
2718 let action = match Action::try_from(action) {
2720 Ok(action) => action,
2721 Err(_) => return -EINVAL,
2722 };
2723
2724 esyd(&format!("{action}/net/connect"), glob, b'+')
2726}
2727
2728#[no_mangle]
2733pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
2734 let action = match Action::try_from(action) {
2736 Ok(action) => action,
2737 Err(_) => return -EINVAL,
2738 };
2739
2740 esyd(&format!("{action}/net/connect"), glob, b'-')
2742}
2743
2744#[no_mangle]
2748pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
2749 let action = match Action::try_from(action) {
2751 Ok(action) => action,
2752 Err(_) => return -EINVAL,
2753 };
2754
2755 esyd(&format!("{action}/net/connect"), glob, b'^')
2757}
2758
2759#[no_mangle]
2763pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
2764 let action = match Action::try_from(action) {
2766 Ok(action) => action,
2767 Err(_) => return -EINVAL,
2768 };
2769
2770 esyd(&format!("{action}/net/sendfd"), glob, b'+')
2772}
2773
2774#[no_mangle]
2779pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
2780 let action = match Action::try_from(action) {
2782 Ok(action) => action,
2783 Err(_) => return -EINVAL,
2784 };
2785
2786 esyd(&format!("{action}/net/sendfd"), glob, b'-')
2788}
2789
2790#[no_mangle]
2794pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
2795 let action = match Action::try_from(action) {
2797 Ok(action) => action,
2798 Err(_) => return -EINVAL,
2799 };
2800
2801 esyd(&format!("{action}/net/sendfd"), glob, b'^')
2803}
2804
2805#[no_mangle]
2809pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
2810 let action = match Action::try_from(action) {
2812 Ok(action) => action,
2813 Err(_) => return -EINVAL,
2814 };
2815
2816 esyd(&format!("{action}/net/link"), family, b'+')
2818}
2819
2820#[no_mangle]
2825pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
2826 let action = match Action::try_from(action) {
2828 Ok(action) => action,
2829 Err(_) => return -EINVAL,
2830 };
2831
2832 esyd(&format!("{action}/net/link"), family, b'-')
2834}
2835
2836#[no_mangle]
2840pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
2841 let action = match Action::try_from(action) {
2843 Ok(action) => action,
2844 Err(_) => return -EINVAL,
2845 };
2846
2847 esyd(&format!("{action}/net/link"), family, b'^')
2849}
2850
2851#[no_mangle]
2857pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
2858 esyd("mem/max", size, b':')
2859}
2860
2861#[no_mangle]
2867pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
2868 esyd("mem/vm_max", size, b':')
2869}
2870
2871#[no_mangle]
2875pub extern "C" fn syd_pid_max(size: usize) -> c_int {
2876 stat(&format!("/dev/syd/pid/max:{size}"))
2877}
2878
2879#[no_mangle]
2884pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
2885 stat(&format!("/dev/syd/segvguard/expiry:{timeout}"))
2886}
2887
2888#[no_mangle]
2892pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
2893 stat(&format!("/dev/syd/segvguard/suspension:{timeout}"))
2894}
2895
2896#[no_mangle]
2900pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
2901 stat(&format!("/dev/syd/segvguard/maxcrashes:{max}"))
2902}
2903
2904#[no_mangle]
2930pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
2931 if file.is_null() || argv.is_null() {
2932 return -EFAULT;
2933 }
2934
2935 let file = CStr::from_ptr(file);
2937 let file = OsStr::from_bytes(file.to_bytes());
2938
2939 let mut path = OsString::from("/dev/syd/cmd/exec!");
2940 path.push(file);
2941
2942 let mut idx: isize = 0;
2943 while !(*argv.offset(idx)).is_null() {
2944 let arg = CStr::from_ptr(*argv.offset(idx));
2946 let arg = OsStr::from_bytes(arg.to_bytes());
2947
2948 path.push(OsStr::from_bytes(&[b'\x1F'])); path.push(arg);
2950
2951 idx = idx.saturating_add(1);
2952 }
2953
2954 let path = PathBuf::from(path);
2955 stat(path)
2956}