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_stat() -> bool {
339 stat("/dev/syd/sandbox/stat?") == 0
340}
341
342#[no_mangle]
346pub extern "C" fn syd_enable_stat() -> c_int {
347 stat("/dev/syd/sandbox/stat:on")
348}
349
350#[no_mangle]
354pub extern "C" fn syd_disable_stat() -> c_int {
355 stat("/dev/syd/sandbox/stat:off")
356}
357
358#[no_mangle]
362pub extern "C" fn syd_enabled_read() -> bool {
363 stat("/dev/syd/sandbox/read?") == 0
364}
365
366#[no_mangle]
370pub extern "C" fn syd_enable_read() -> c_int {
371 stat("/dev/syd/sandbox/read:on")
372}
373
374#[no_mangle]
378pub extern "C" fn syd_disable_read() -> c_int {
379 stat("/dev/syd/sandbox/read:off")
380}
381
382#[no_mangle]
386pub extern "C" fn syd_enabled_write() -> bool {
387 stat("/dev/syd/sandbox/write?") == 0
388}
389
390#[no_mangle]
394pub extern "C" fn syd_enable_write() -> c_int {
395 stat("/dev/syd/sandbox/write:on")
396}
397
398#[no_mangle]
402pub extern "C" fn syd_disable_write() -> c_int {
403 stat("/dev/syd/sandbox/write:off")
404}
405
406#[no_mangle]
410pub extern "C" fn syd_enabled_exec() -> bool {
411 stat("/dev/syd/sandbox/exec?") == 0
412}
413
414#[no_mangle]
418pub extern "C" fn syd_enable_exec() -> c_int {
419 stat("/dev/syd/sandbox/exec:on")
420}
421
422#[no_mangle]
426pub extern "C" fn syd_disable_exec() -> c_int {
427 stat("/dev/syd/sandbox/exec:off")
428}
429
430#[no_mangle]
434pub extern "C" fn syd_enabled_ioctl() -> bool {
435 stat("/dev/syd/sandbox/ioctl?") == 0
436}
437
438#[no_mangle]
442pub extern "C" fn syd_enable_ioctl() -> c_int {
443 stat("/dev/syd/sandbox/ioctl:on")
444}
445
446#[no_mangle]
450pub extern "C" fn syd_disable_ioctl() -> c_int {
451 stat("/dev/syd/sandbox/ioctl:off")
452}
453
454#[no_mangle]
458pub extern "C" fn syd_enabled_create() -> bool {
459 stat("/dev/syd/sandbox/create?") == 0
460}
461
462#[no_mangle]
466pub extern "C" fn syd_enable_create() -> c_int {
467 stat("/dev/syd/sandbox/create:on")
468}
469
470#[no_mangle]
474pub extern "C" fn syd_disable_create() -> c_int {
475 stat("/dev/syd/sandbox/create:off")
476}
477
478#[no_mangle]
482pub extern "C" fn syd_enabled_delete() -> bool {
483 stat("/dev/syd/sandbox/delete?") == 0
484}
485
486#[no_mangle]
490pub extern "C" fn syd_enable_delete() -> c_int {
491 stat("/dev/syd/sandbox/delete:on")
492}
493
494#[no_mangle]
498pub extern "C" fn syd_disable_delete() -> c_int {
499 stat("/dev/syd/sandbox/delete:off")
500}
501
502#[no_mangle]
506pub extern "C" fn syd_enabled_rename() -> bool {
507 stat("/dev/syd/sandbox/rename?") == 0
508}
509
510#[no_mangle]
514pub extern "C" fn syd_enable_rename() -> c_int {
515 stat("/dev/syd/sandbox/rename:on")
516}
517
518#[no_mangle]
522pub extern "C" fn syd_disable_rename() -> c_int {
523 stat("/dev/syd/sandbox/rename:off")
524}
525
526#[no_mangle]
530pub extern "C" fn syd_enabled_symlink() -> bool {
531 stat("/dev/syd/sandbox/symlink?") == 0
532}
533
534#[no_mangle]
538pub extern "C" fn syd_enable_symlink() -> c_int {
539 stat("/dev/syd/sandbox/symlink:on")
540}
541
542#[no_mangle]
546pub extern "C" fn syd_disable_symlink() -> c_int {
547 stat("/dev/syd/sandbox/symlink:off")
548}
549
550#[no_mangle]
554pub extern "C" fn syd_enabled_truncate() -> bool {
555 stat("/dev/syd/sandbox/truncate?") == 0
556}
557
558#[no_mangle]
562pub extern "C" fn syd_enable_truncate() -> c_int {
563 stat("/dev/syd/sandbox/truncate:on")
564}
565
566#[no_mangle]
570pub extern "C" fn syd_disable_truncate() -> c_int {
571 stat("/dev/syd/sandbox/truncate:off")
572}
573
574#[no_mangle]
578pub extern "C" fn syd_enabled_chdir() -> bool {
579 stat("/dev/syd/sandbox/chdir?") == 0
580}
581
582#[no_mangle]
586pub extern "C" fn syd_enable_chdir() -> c_int {
587 stat("/dev/syd/sandbox/chdir:on")
588}
589
590#[no_mangle]
594pub extern "C" fn syd_disable_chdir() -> c_int {
595 stat("/dev/syd/sandbox/chdir:off")
596}
597
598#[no_mangle]
602pub extern "C" fn syd_enabled_readdir() -> bool {
603 stat("/dev/syd/sandbox/readdir?") == 0
604}
605
606#[no_mangle]
610pub extern "C" fn syd_enable_readdir() -> c_int {
611 stat("/dev/syd/sandbox/readdir:on")
612}
613
614#[no_mangle]
618pub extern "C" fn syd_disable_readdir() -> c_int {
619 stat("/dev/syd/sandbox/readdir:off")
620}
621
622#[no_mangle]
626pub extern "C" fn syd_enabled_mkdir() -> bool {
627 stat("/dev/syd/sandbox/mkdir?") == 0
628}
629
630#[no_mangle]
634pub extern "C" fn syd_enable_mkdir() -> c_int {
635 stat("/dev/syd/sandbox/mkdir:on")
636}
637
638#[no_mangle]
642pub extern "C" fn syd_disable_mkdir() -> c_int {
643 stat("/dev/syd/sandbox/mkdir:off")
644}
645
646#[no_mangle]
650pub extern "C" fn syd_enabled_chown() -> bool {
651 stat("/dev/syd/sandbox/chown?") == 0
652}
653
654#[no_mangle]
658pub extern "C" fn syd_enable_chown() -> c_int {
659 stat("/dev/syd/sandbox/chown:on")
660}
661
662#[no_mangle]
666pub extern "C" fn syd_disable_chown() -> c_int {
667 stat("/dev/syd/sandbox/chown:off")
668}
669
670#[no_mangle]
674pub extern "C" fn syd_enabled_chgrp() -> bool {
675 stat("/dev/syd/sandbox/chgrp?") == 0
676}
677
678#[no_mangle]
682pub extern "C" fn syd_enable_chgrp() -> c_int {
683 stat("/dev/syd/sandbox/chgrp:on")
684}
685
686#[no_mangle]
690pub extern "C" fn syd_disable_chgrp() -> c_int {
691 stat("/dev/syd/sandbox/chgrp:off")
692}
693
694#[no_mangle]
698pub extern "C" fn syd_enabled_chmod() -> bool {
699 stat("/dev/syd/sandbox/chmod?") == 0
700}
701
702#[no_mangle]
706pub extern "C" fn syd_enable_chmod() -> c_int {
707 stat("/dev/syd/sandbox/chmod:on")
708}
709
710#[no_mangle]
714pub extern "C" fn syd_disable_chmod() -> c_int {
715 stat("/dev/syd/sandbox/chmod:off")
716}
717
718#[no_mangle]
722pub extern "C" fn syd_enabled_chattr() -> bool {
723 stat("/dev/syd/sandbox/chattr?") == 0
724}
725
726#[no_mangle]
730pub extern "C" fn syd_enable_chattr() -> c_int {
731 stat("/dev/syd/sandbox/chattr:on")
732}
733
734#[no_mangle]
738pub extern "C" fn syd_disable_chattr() -> c_int {
739 stat("/dev/syd/sandbox/chattr:off")
740}
741
742#[no_mangle]
746pub extern "C" fn syd_enabled_chroot() -> bool {
747 stat("/dev/syd/sandbox/chroot?") == 0
748}
749
750#[no_mangle]
754pub extern "C" fn syd_enable_chroot() -> c_int {
755 stat("/dev/syd/sandbox/chroot:on")
756}
757
758#[no_mangle]
762pub extern "C" fn syd_disable_chroot() -> c_int {
763 stat("/dev/syd/sandbox/chroot:off")
764}
765
766#[no_mangle]
770pub extern "C" fn syd_enabled_utime() -> bool {
771 stat("/dev/syd/sandbox/utime?") == 0
772}
773
774#[no_mangle]
778pub extern "C" fn syd_enable_utime() -> c_int {
779 stat("/dev/syd/sandbox/utime:on")
780}
781
782#[no_mangle]
786pub extern "C" fn syd_disable_utime() -> c_int {
787 stat("/dev/syd/sandbox/utime:off")
788}
789
790#[no_mangle]
794pub extern "C" fn syd_enabled_mkdev() -> bool {
795 stat("/dev/syd/sandbox/mkdev?") == 0
796}
797
798#[no_mangle]
802pub extern "C" fn syd_enable_mkdev() -> c_int {
803 stat("/dev/syd/sandbox/mkdev:on")
804}
805
806#[no_mangle]
810pub extern "C" fn syd_disable_mkdev() -> c_int {
811 stat("/dev/syd/sandbox/mkdev:off")
812}
813
814#[no_mangle]
818pub extern "C" fn syd_enabled_mkfifo() -> bool {
819 stat("/dev/syd/sandbox/mkfifo?") == 0
820}
821
822#[no_mangle]
826pub extern "C" fn syd_enable_mkfifo() -> c_int {
827 stat("/dev/syd/sandbox/mkfifo:on")
828}
829
830#[no_mangle]
834pub extern "C" fn syd_disable_mkfifo() -> c_int {
835 stat("/dev/syd/sandbox/mkfifo:off")
836}
837
838#[no_mangle]
842pub extern "C" fn syd_enabled_mktemp() -> bool {
843 stat("/dev/syd/sandbox/mktemp?") == 0
844}
845
846#[no_mangle]
850pub extern "C" fn syd_enable_mktemp() -> c_int {
851 stat("/dev/syd/sandbox/mktemp:on")
852}
853
854#[no_mangle]
858pub extern "C" fn syd_disable_mktemp() -> c_int {
859 stat("/dev/syd/sandbox/mktemp:off")
860}
861
862#[no_mangle]
866pub extern "C" fn syd_enabled_net() -> bool {
867 stat("/dev/syd/sandbox/net?") == 0
868}
869
870#[no_mangle]
874pub extern "C" fn syd_enable_net() -> c_int {
875 stat("/dev/syd/sandbox/net:on")
876}
877
878#[no_mangle]
882pub extern "C" fn syd_disable_net() -> c_int {
883 stat("/dev/syd/sandbox/net:off")
884}
885
886#[no_mangle]
890pub extern "C" fn syd_enabled_mem() -> bool {
891 stat("/dev/syd/sandbox/mem?") == 0
892}
893
894#[no_mangle]
898pub extern "C" fn syd_enable_mem() -> c_int {
899 stat("/dev/syd/sandbox/mem:on")
900}
901
902#[no_mangle]
906pub extern "C" fn syd_disable_mem() -> c_int {
907 stat("/dev/syd/sandbox/mem:off")
908}
909
910#[no_mangle]
914pub extern "C" fn syd_enabled_pid() -> bool {
915 stat("/dev/syd/sandbox/pid?") == 0
916}
917
918#[no_mangle]
922pub extern "C" fn syd_enable_pid() -> c_int {
923 stat("/dev/syd/sandbox/pid:on")
924}
925
926#[no_mangle]
930pub extern "C" fn syd_disable_pid() -> c_int {
931 stat("/dev/syd/sandbox/pid:off")
932}
933
934#[no_mangle]
938pub extern "C" fn syd_enabled_lock() -> bool {
939 stat("/dev/syd/sandbox/lock?") == 0
940}
941
942#[no_mangle]
946pub extern "C" fn syd_enabled_crypt() -> bool {
947 stat("/dev/syd/sandbox/crypt?") == 0
948}
949
950#[no_mangle]
954pub extern "C" fn syd_enabled_proxy() -> bool {
955 stat("/dev/syd/sandbox/proxy?") == 0
956}
957
958#[no_mangle]
962pub extern "C" fn syd_enabled_force() -> bool {
963 stat("/dev/syd/sandbox/force?") == 0
964}
965
966#[no_mangle]
970pub extern "C" fn syd_enable_force() -> c_int {
971 stat("/dev/syd/sandbox/force:on")
972}
973
974#[no_mangle]
978pub extern "C" fn syd_disable_force() -> c_int {
979 stat("/dev/syd/sandbox/force:off")
980}
981
982#[no_mangle]
986pub extern "C" fn syd_enabled_tpe() -> bool {
987 stat("/dev/syd/sandbox/tpe?") == 0
988}
989
990#[no_mangle]
994pub extern "C" fn syd_enable_tpe() -> c_int {
995 stat("/dev/syd/sandbox/tpe:on")
996}
997
998#[no_mangle]
1002pub extern "C" fn syd_disable_tpe() -> c_int {
1003 stat("/dev/syd/sandbox/tpe:off")
1004}
1005
1006#[no_mangle]
1008pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
1009 let action = match Action::try_from(action) {
1011 Ok(action) => action,
1012 Err(_) => return -EINVAL,
1013 };
1014 stat(&format!("/dev/syd/default/stat:{action}"))
1015}
1016
1017#[no_mangle]
1019pub extern "C" fn syd_default_read(action: action_t) -> c_int {
1020 let action = match Action::try_from(action) {
1022 Ok(action) => action,
1023 Err(_) => return -EINVAL,
1024 };
1025 stat(&format!("/dev/syd/default/read:{action}"))
1026}
1027
1028#[no_mangle]
1030pub extern "C" fn syd_default_write(action: action_t) -> c_int {
1031 let action = match Action::try_from(action) {
1033 Ok(action) => action,
1034 Err(_) => return -EINVAL,
1035 };
1036 stat(&format!("/dev/syd/default/write:{action}"))
1037}
1038
1039#[no_mangle]
1041pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
1042 let action = match Action::try_from(action) {
1044 Ok(action) => action,
1045 Err(_) => return -EINVAL,
1046 };
1047 stat(&format!("/dev/syd/default/exec:{action}"))
1048}
1049
1050#[no_mangle]
1052pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
1053 let action = match Action::try_from(action) {
1055 Ok(action) => action,
1056 Err(_) => return -EINVAL,
1057 };
1058 stat(&format!("/dev/syd/default/ioctl:{action}"))
1059}
1060
1061#[no_mangle]
1063pub extern "C" fn syd_default_create(action: action_t) -> c_int {
1064 let action = match Action::try_from(action) {
1066 Ok(action) => action,
1067 Err(_) => return -EINVAL,
1068 };
1069 stat(&format!("/dev/syd/default/create:{action}"))
1070}
1071
1072#[no_mangle]
1074pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
1075 let action = match Action::try_from(action) {
1077 Ok(action) => action,
1078 Err(_) => return -EINVAL,
1079 };
1080 stat(&format!("/dev/syd/default/delete:{action}"))
1081}
1082
1083#[no_mangle]
1085pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
1086 let action = match Action::try_from(action) {
1088 Ok(action) => action,
1089 Err(_) => return -EINVAL,
1090 };
1091 stat(&format!("/dev/syd/default/rename:{action}"))
1092}
1093
1094#[no_mangle]
1096pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
1097 let action = match Action::try_from(action) {
1099 Ok(action) => action,
1100 Err(_) => return -EINVAL,
1101 };
1102 stat(&format!("/dev/syd/default/symlink:{action}"))
1103}
1104
1105#[no_mangle]
1107pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
1108 let action = match Action::try_from(action) {
1110 Ok(action) => action,
1111 Err(_) => return -EINVAL,
1112 };
1113 stat(&format!("/dev/syd/default/truncate:{action}"))
1114}
1115
1116#[no_mangle]
1118pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
1119 let action = match Action::try_from(action) {
1121 Ok(action) => action,
1122 Err(_) => return -EINVAL,
1123 };
1124 stat(&format!("/dev/syd/default/chdir:{action}"))
1125}
1126
1127#[no_mangle]
1129pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
1130 let action = match Action::try_from(action) {
1132 Ok(action) => action,
1133 Err(_) => return -EINVAL,
1134 };
1135 stat(&format!("/dev/syd/default/readdir:{action}"))
1136}
1137
1138#[no_mangle]
1140pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
1141 let action = match Action::try_from(action) {
1143 Ok(action) => action,
1144 Err(_) => return -EINVAL,
1145 };
1146 stat(&format!("/dev/syd/default/mkdir:{action}"))
1147}
1148
1149#[no_mangle]
1151pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1152 let action = match Action::try_from(action) {
1154 Ok(action) => action,
1155 Err(_) => return -EINVAL,
1156 };
1157 stat(&format!("/dev/syd/default/chown:{action}"))
1158}
1159
1160#[no_mangle]
1162pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1163 let action = match Action::try_from(action) {
1165 Ok(action) => action,
1166 Err(_) => return -EINVAL,
1167 };
1168 stat(&format!("/dev/syd/default/chgrp:{action}"))
1169}
1170
1171#[no_mangle]
1173pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1174 let action = match Action::try_from(action) {
1176 Ok(action) => action,
1177 Err(_) => return -EINVAL,
1178 };
1179 stat(&format!("/dev/syd/default/chmod:{action}"))
1180}
1181
1182#[no_mangle]
1184pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1185 let action = match Action::try_from(action) {
1187 Ok(action) => action,
1188 Err(_) => return -EINVAL,
1189 };
1190 stat(&format!("/dev/syd/default/chattr:{action}"))
1191}
1192
1193#[no_mangle]
1195pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1196 let action = match Action::try_from(action) {
1198 Ok(action) => action,
1199 Err(_) => return -EINVAL,
1200 };
1201 stat(&format!("/dev/syd/default/chroot:{action}"))
1202}
1203
1204#[no_mangle]
1206pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1207 let action = match Action::try_from(action) {
1209 Ok(action) => action,
1210 Err(_) => return -EINVAL,
1211 };
1212 stat(&format!("/dev/syd/default/utime:{action}"))
1213}
1214
1215#[no_mangle]
1217pub extern "C" fn syd_default_mkdev(action: action_t) -> c_int {
1218 let action = match Action::try_from(action) {
1220 Ok(action) => action,
1221 Err(_) => return -EINVAL,
1222 };
1223 stat(&format!("/dev/syd/default/mkdev:{action}"))
1224}
1225
1226#[no_mangle]
1228pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1229 let action = match Action::try_from(action) {
1231 Ok(action) => action,
1232 Err(_) => return -EINVAL,
1233 };
1234 stat(&format!("/dev/syd/default/mkfifo:{action}"))
1235}
1236
1237#[no_mangle]
1239pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1240 let action = match Action::try_from(action) {
1242 Ok(action) => action,
1243 Err(_) => return -EINVAL,
1244 };
1245 stat(&format!("/dev/syd/default/mktemp:{action}"))
1246}
1247
1248#[no_mangle]
1250pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1251 let action = match Action::try_from(action) {
1253 Ok(action) => action,
1254 Err(_) => return -EINVAL,
1255 };
1256 stat(&format!("/dev/syd/default/net:{action}"))
1257}
1258
1259#[no_mangle]
1261pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1262 let action = match Action::try_from(action) {
1264 Ok(action) => action,
1265 Err(_) => return -EINVAL,
1266 };
1267 stat(&format!("/dev/syd/default/block:{action}"))
1268}
1269
1270#[no_mangle]
1272pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1273 let action = match Action::try_from(action) {
1275 Ok(action) => action,
1276 Err(_) => return -EINVAL,
1277 };
1278 stat(&format!("/dev/syd/default/mem:{action}"))
1279}
1280
1281#[no_mangle]
1283pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1284 let action = match Action::try_from(action) {
1286 Ok(action) => action,
1287 Err(_) => return -EINVAL,
1288 };
1289 stat(&format!("/dev/syd/default/pid:{action}"))
1290}
1291
1292#[no_mangle]
1294pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1295 let action = match Action::try_from(action) {
1297 Ok(action) => action,
1298 Err(_) => return -EINVAL,
1299 };
1300 stat(&format!("/dev/syd/default/force:{action}"))
1301}
1302
1303#[no_mangle]
1305pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1306 let action = match Action::try_from(action) {
1308 Ok(action) => action,
1309 Err(_) => return -EINVAL,
1310 };
1311 stat(&format!("/dev/syd/default/segvguard:{action}"))
1312}
1313
1314#[no_mangle]
1316pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1317 let action = match Action::try_from(action) {
1319 Ok(action) => action,
1320 Err(_) => return -EINVAL,
1321 };
1322 stat(&format!("/dev/syd/default/tpe:{action}"))
1323}
1324
1325#[no_mangle]
1327pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1328 stat(&format!("/dev/syd/ioctl/deny+{request}"))
1329}
1330
1331#[no_mangle]
1346pub unsafe extern "C" fn syd_force_add(
1347 path: *const c_char,
1348 hash: *const c_char,
1349 action: action_t,
1350) -> c_int {
1351 let action = match Action::try_from(action) {
1353 Ok(action) => action,
1354 Err(_) => return -EINVAL,
1355 };
1356
1357 if path.is_null() || hash.is_null() {
1358 return -EFAULT;
1359 }
1360
1361 let path = unsafe { CStr::from_ptr(path) };
1363 let hash = unsafe { CStr::from_ptr(hash) };
1365 let path = match path.to_str() {
1366 Ok(s) => s,
1367 Err(_) => return -EINVAL,
1368 };
1369 let hash = match hash.to_str() {
1370 Ok(s) => s,
1371 Err(_) => return -EINVAL,
1372 };
1373
1374 stat(format!("/dev/syd/force+{path}:{hash}:{action}"))
1376}
1377
1378#[no_mangle]
1390pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1391 if path.is_null() {
1392 return -EFAULT;
1393 }
1394
1395 let path = unsafe { CStr::from_ptr(path) };
1397 let path = match path.to_str() {
1398 Ok(s) => s,
1399 Err(_) => return -EINVAL,
1400 };
1401
1402 stat(format!("/dev/syd/force-{path}"))
1404}
1405
1406#[no_mangle]
1408pub extern "C" fn syd_force_clr() -> c_int {
1409 stat("/dev/syd/force^")
1410}
1411
1412#[no_mangle]
1416pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1417 let action = match Action::try_from(action) {
1419 Ok(action) => action,
1420 Err(_) => return -EINVAL,
1421 };
1422
1423 esyd(&format!("{action}/stat"), glob, b'+')
1425}
1426
1427#[no_mangle]
1432pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1433 let action = match Action::try_from(action) {
1435 Ok(action) => action,
1436 Err(_) => return -EINVAL,
1437 };
1438
1439 esyd(&format!("{action}/stat"), glob, b'-')
1441}
1442
1443#[no_mangle]
1447pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1448 let action = match Action::try_from(action) {
1450 Ok(action) => action,
1451 Err(_) => return -EINVAL,
1452 };
1453
1454 esyd(&format!("{action}/stat"), glob, b'^')
1456}
1457
1458#[no_mangle]
1462pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1463 let action = match Action::try_from(action) {
1465 Ok(action) => action,
1466 Err(_) => return -EINVAL,
1467 };
1468
1469 esyd(&format!("{action}/read"), glob, b'+')
1471}
1472
1473#[no_mangle]
1478pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1479 let action = match Action::try_from(action) {
1481 Ok(action) => action,
1482 Err(_) => return -EINVAL,
1483 };
1484
1485 esyd(&format!("{action}/read"), glob, b'-')
1487}
1488
1489#[no_mangle]
1493pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1494 let action = match Action::try_from(action) {
1496 Ok(action) => action,
1497 Err(_) => return -EINVAL,
1498 };
1499
1500 esyd(&format!("{action}/read"), glob, b'^')
1502}
1503
1504#[no_mangle]
1508pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1509 let action = match Action::try_from(action) {
1511 Ok(action) => action,
1512 Err(_) => return -EINVAL,
1513 };
1514
1515 esyd(&format!("{action}/write"), glob, b'+')
1517}
1518
1519#[no_mangle]
1524pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1525 let action = match Action::try_from(action) {
1527 Ok(action) => action,
1528 Err(_) => return -EINVAL,
1529 };
1530
1531 esyd(&format!("{action}/write"), glob, b'-')
1533}
1534
1535#[no_mangle]
1539pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1540 let action = match Action::try_from(action) {
1542 Ok(action) => action,
1543 Err(_) => return -EINVAL,
1544 };
1545
1546 esyd(&format!("{action}/write"), glob, b'^')
1548}
1549
1550#[no_mangle]
1554pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1555 let action = match Action::try_from(action) {
1557 Ok(action) => action,
1558 Err(_) => return -EINVAL,
1559 };
1560
1561 esyd(&format!("{action}/exec"), glob, b'+')
1563}
1564
1565#[no_mangle]
1570pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1571 let action = match Action::try_from(action) {
1573 Ok(action) => action,
1574 Err(_) => return -EINVAL,
1575 };
1576
1577 esyd(&format!("{action}/exec"), glob, b'-')
1579}
1580
1581#[no_mangle]
1585pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
1586 let action = match Action::try_from(action) {
1588 Ok(action) => action,
1589 Err(_) => return -EINVAL,
1590 };
1591
1592 esyd(&format!("{action}/exec"), glob, b'^')
1594}
1595
1596#[no_mangle]
1600pub extern "C" fn syd_ioctl_add(action: action_t, glob: *const c_char) -> c_int {
1601 let action = match Action::try_from(action) {
1603 Ok(action) => action,
1604 Err(_) => return -EINVAL,
1605 };
1606
1607 esyd(&format!("{action}/ioctl"), glob, b'+')
1609}
1610
1611#[no_mangle]
1616pub extern "C" fn syd_ioctl_del(action: action_t, glob: *const c_char) -> c_int {
1617 let action = match Action::try_from(action) {
1619 Ok(action) => action,
1620 Err(_) => return -EINVAL,
1621 };
1622
1623 esyd(&format!("{action}/ioctl"), glob, b'-')
1625}
1626
1627#[no_mangle]
1631pub extern "C" fn syd_ioctl_rem(action: action_t, glob: *const c_char) -> c_int {
1632 let action = match Action::try_from(action) {
1634 Ok(action) => action,
1635 Err(_) => return -EINVAL,
1636 };
1637
1638 esyd(&format!("{action}/ioctl"), glob, b'^')
1640}
1641
1642#[no_mangle]
1646pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
1647 let action = match Action::try_from(action) {
1649 Ok(action) => action,
1650 Err(_) => return -EINVAL,
1651 };
1652
1653 esyd(&format!("{action}/create"), glob, b'+')
1655}
1656
1657#[no_mangle]
1662pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
1663 let action = match Action::try_from(action) {
1665 Ok(action) => action,
1666 Err(_) => return -EINVAL,
1667 };
1668
1669 esyd(&format!("{action}/create"), glob, b'-')
1671}
1672
1673#[no_mangle]
1677pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
1678 let action = match Action::try_from(action) {
1680 Ok(action) => action,
1681 Err(_) => return -EINVAL,
1682 };
1683
1684 esyd(&format!("{action}/create"), glob, b'^')
1686}
1687
1688#[no_mangle]
1692pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
1693 let action = match Action::try_from(action) {
1695 Ok(action) => action,
1696 Err(_) => return -EINVAL,
1697 };
1698
1699 esyd(&format!("{action}/delete"), glob, b'+')
1701}
1702
1703#[no_mangle]
1708pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
1709 let action = match Action::try_from(action) {
1711 Ok(action) => action,
1712 Err(_) => return -EINVAL,
1713 };
1714
1715 esyd(&format!("{action}/delete"), glob, b'-')
1717}
1718
1719#[no_mangle]
1723pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
1724 let action = match Action::try_from(action) {
1726 Ok(action) => action,
1727 Err(_) => return -EINVAL,
1728 };
1729
1730 esyd(&format!("{action}/delete"), glob, b'^')
1732}
1733
1734#[no_mangle]
1738pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
1739 let action = match Action::try_from(action) {
1741 Ok(action) => action,
1742 Err(_) => return -EINVAL,
1743 };
1744
1745 esyd(&format!("{action}/rename"), glob, b'+')
1747}
1748
1749#[no_mangle]
1754pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
1755 let action = match Action::try_from(action) {
1757 Ok(action) => action,
1758 Err(_) => return -EINVAL,
1759 };
1760
1761 esyd(&format!("{action}/rename"), glob, b'-')
1763}
1764
1765#[no_mangle]
1769pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
1770 let action = match Action::try_from(action) {
1772 Ok(action) => action,
1773 Err(_) => return -EINVAL,
1774 };
1775
1776 esyd(&format!("{action}/rename"), glob, b'^')
1778}
1779
1780#[no_mangle]
1784pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
1785 let action = match Action::try_from(action) {
1787 Ok(action) => action,
1788 Err(_) => return -EINVAL,
1789 };
1790
1791 esyd(&format!("{action}/symlink"), glob, b'+')
1793}
1794
1795#[no_mangle]
1800pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
1801 let action = match Action::try_from(action) {
1803 Ok(action) => action,
1804 Err(_) => return -EINVAL,
1805 };
1806
1807 esyd(&format!("{action}/symlink"), glob, b'-')
1809}
1810
1811#[no_mangle]
1815pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
1816 let action = match Action::try_from(action) {
1818 Ok(action) => action,
1819 Err(_) => return -EINVAL,
1820 };
1821
1822 esyd(&format!("{action}/symlink"), glob, b'^')
1824}
1825
1826#[no_mangle]
1830pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
1831 let action = match Action::try_from(action) {
1833 Ok(action) => action,
1834 Err(_) => return -EINVAL,
1835 };
1836
1837 esyd(&format!("{action}/truncate"), glob, b'+')
1839}
1840
1841#[no_mangle]
1846pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
1847 let action = match Action::try_from(action) {
1849 Ok(action) => action,
1850 Err(_) => return -EINVAL,
1851 };
1852
1853 esyd(&format!("{action}/truncate"), glob, b'-')
1855}
1856
1857#[no_mangle]
1861pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
1862 let action = match Action::try_from(action) {
1864 Ok(action) => action,
1865 Err(_) => return -EINVAL,
1866 };
1867
1868 esyd(&format!("{action}/truncate"), glob, b'^')
1870}
1871
1872#[no_mangle]
1876pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
1877 let action = match Action::try_from(action) {
1879 Ok(action) => action,
1880 Err(_) => return -EINVAL,
1881 };
1882
1883 esyd(&format!("{action}/chdir"), glob, b'+')
1885}
1886
1887#[no_mangle]
1892pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
1893 let action = match Action::try_from(action) {
1895 Ok(action) => action,
1896 Err(_) => return -EINVAL,
1897 };
1898
1899 esyd(&format!("{action}/chdir"), glob, b'-')
1901}
1902
1903#[no_mangle]
1907pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
1908 let action = match Action::try_from(action) {
1910 Ok(action) => action,
1911 Err(_) => return -EINVAL,
1912 };
1913
1914 esyd(&format!("{action}/chdir"), glob, b'^')
1916}
1917
1918#[no_mangle]
1922pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
1923 let action = match Action::try_from(action) {
1925 Ok(action) => action,
1926 Err(_) => return -EINVAL,
1927 };
1928
1929 esyd(&format!("{action}/readdir"), glob, b'+')
1931}
1932
1933#[no_mangle]
1938pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
1939 let action = match Action::try_from(action) {
1941 Ok(action) => action,
1942 Err(_) => return -EINVAL,
1943 };
1944
1945 esyd(&format!("{action}/readdir"), glob, b'-')
1947}
1948
1949#[no_mangle]
1953pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
1954 let action = match Action::try_from(action) {
1956 Ok(action) => action,
1957 Err(_) => return -EINVAL,
1958 };
1959
1960 esyd(&format!("{action}/readdir"), glob, b'^')
1962}
1963
1964#[no_mangle]
1968pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
1969 let action = match Action::try_from(action) {
1971 Ok(action) => action,
1972 Err(_) => return -EINVAL,
1973 };
1974
1975 esyd(&format!("{action}/mkdir"), glob, b'+')
1977}
1978
1979#[no_mangle]
1984pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
1985 let action = match Action::try_from(action) {
1987 Ok(action) => action,
1988 Err(_) => return -EINVAL,
1989 };
1990
1991 esyd(&format!("{action}/mkdir"), glob, b'-')
1993}
1994
1995#[no_mangle]
1999pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2000 let action = match Action::try_from(action) {
2002 Ok(action) => action,
2003 Err(_) => return -EINVAL,
2004 };
2005
2006 esyd(&format!("{action}/mkdir"), glob, b'^')
2008}
2009
2010#[no_mangle]
2014pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2015 let action = match Action::try_from(action) {
2017 Ok(action) => action,
2018 Err(_) => return -EINVAL,
2019 };
2020
2021 esyd(&format!("{action}/chown"), glob, b'+')
2023}
2024
2025#[no_mangle]
2030pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2031 let action = match Action::try_from(action) {
2033 Ok(action) => action,
2034 Err(_) => return -EINVAL,
2035 };
2036
2037 esyd(&format!("{action}/chown"), glob, b'-')
2039}
2040
2041#[no_mangle]
2045pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2046 let action = match Action::try_from(action) {
2048 Ok(action) => action,
2049 Err(_) => return -EINVAL,
2050 };
2051
2052 esyd(&format!("{action}/chown"), glob, b'^')
2054}
2055
2056#[no_mangle]
2060pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2061 let action = match Action::try_from(action) {
2063 Ok(action) => action,
2064 Err(_) => return -EINVAL,
2065 };
2066
2067 esyd(&format!("{action}/chgrp"), glob, b'+')
2069}
2070
2071#[no_mangle]
2076pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2077 let action = match Action::try_from(action) {
2079 Ok(action) => action,
2080 Err(_) => return -EINVAL,
2081 };
2082
2083 esyd(&format!("{action}/chgrp"), glob, b'-')
2085}
2086
2087#[no_mangle]
2091pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2092 let action = match Action::try_from(action) {
2094 Ok(action) => action,
2095 Err(_) => return -EINVAL,
2096 };
2097
2098 esyd(&format!("{action}/chgrp"), glob, b'^')
2100}
2101
2102#[no_mangle]
2106pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2107 let action = match Action::try_from(action) {
2109 Ok(action) => action,
2110 Err(_) => return -EINVAL,
2111 };
2112
2113 esyd(&format!("{action}/chmod"), glob, b'+')
2115}
2116
2117#[no_mangle]
2122pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2123 let action = match Action::try_from(action) {
2125 Ok(action) => action,
2126 Err(_) => return -EINVAL,
2127 };
2128
2129 esyd(&format!("{action}/chmod"), glob, b'-')
2131}
2132
2133#[no_mangle]
2137pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2138 let action = match Action::try_from(action) {
2140 Ok(action) => action,
2141 Err(_) => return -EINVAL,
2142 };
2143
2144 esyd(&format!("{action}/chmod"), glob, b'^')
2146}
2147
2148#[no_mangle]
2152pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2153 let action = match Action::try_from(action) {
2155 Ok(action) => action,
2156 Err(_) => return -EINVAL,
2157 };
2158
2159 esyd(&format!("{action}/chattr"), glob, b'+')
2161}
2162
2163#[no_mangle]
2168pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2169 let action = match Action::try_from(action) {
2171 Ok(action) => action,
2172 Err(_) => return -EINVAL,
2173 };
2174
2175 esyd(&format!("{action}/chattr"), glob, b'-')
2177}
2178
2179#[no_mangle]
2183pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2184 let action = match Action::try_from(action) {
2186 Ok(action) => action,
2187 Err(_) => return -EINVAL,
2188 };
2189
2190 esyd(&format!("{action}/chattr"), glob, b'^')
2192}
2193
2194#[no_mangle]
2198pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2199 let action = match Action::try_from(action) {
2201 Ok(action) => action,
2202 Err(_) => return -EINVAL,
2203 };
2204
2205 esyd(&format!("{action}/chroot"), glob, b'+')
2207}
2208
2209#[no_mangle]
2214pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2215 let action = match Action::try_from(action) {
2217 Ok(action) => action,
2218 Err(_) => return -EINVAL,
2219 };
2220
2221 esyd(&format!("{action}/chroot"), glob, b'-')
2223}
2224
2225#[no_mangle]
2229pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2230 let action = match Action::try_from(action) {
2232 Ok(action) => action,
2233 Err(_) => return -EINVAL,
2234 };
2235
2236 esyd(&format!("{action}/chroot"), glob, b'^')
2238}
2239
2240#[no_mangle]
2244pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2245 let action = match Action::try_from(action) {
2247 Ok(action) => action,
2248 Err(_) => return -EINVAL,
2249 };
2250
2251 esyd(&format!("{action}/utime"), glob, b'+')
2253}
2254
2255#[no_mangle]
2260pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2261 let action = match Action::try_from(action) {
2263 Ok(action) => action,
2264 Err(_) => return -EINVAL,
2265 };
2266
2267 esyd(&format!("{action}/utime"), glob, b'-')
2269}
2270
2271#[no_mangle]
2275pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2276 let action = match Action::try_from(action) {
2278 Ok(action) => action,
2279 Err(_) => return -EINVAL,
2280 };
2281
2282 esyd(&format!("{action}/utime"), glob, b'^')
2284}
2285
2286#[no_mangle]
2290pub extern "C" fn syd_mkdev_add(action: action_t, glob: *const c_char) -> c_int {
2291 let action = match Action::try_from(action) {
2293 Ok(action) => action,
2294 Err(_) => return -EINVAL,
2295 };
2296
2297 esyd(&format!("{action}/mkdev"), glob, b'+')
2299}
2300
2301#[no_mangle]
2306pub extern "C" fn syd_mkdev_del(action: action_t, glob: *const c_char) -> c_int {
2307 let action = match Action::try_from(action) {
2309 Ok(action) => action,
2310 Err(_) => return -EINVAL,
2311 };
2312
2313 esyd(&format!("{action}/mkdev"), glob, b'-')
2315}
2316
2317#[no_mangle]
2321pub extern "C" fn syd_mkdev_rem(action: action_t, glob: *const c_char) -> c_int {
2322 let action = match Action::try_from(action) {
2324 Ok(action) => action,
2325 Err(_) => return -EINVAL,
2326 };
2327
2328 esyd(&format!("{action}/mkdev"), glob, b'^')
2330}
2331
2332#[no_mangle]
2336pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2337 let action = match Action::try_from(action) {
2339 Ok(action) => action,
2340 Err(_) => return -EINVAL,
2341 };
2342
2343 esyd(&format!("{action}/mkfifo"), glob, b'+')
2345}
2346
2347#[no_mangle]
2352pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2353 let action = match Action::try_from(action) {
2355 Ok(action) => action,
2356 Err(_) => return -EINVAL,
2357 };
2358
2359 esyd(&format!("{action}/mkfifo"), glob, b'-')
2361}
2362
2363#[no_mangle]
2367pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2368 let action = match Action::try_from(action) {
2370 Ok(action) => action,
2371 Err(_) => return -EINVAL,
2372 };
2373
2374 esyd(&format!("{action}/mkfifo"), glob, b'^')
2376}
2377
2378#[no_mangle]
2382pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2383 let action = match Action::try_from(action) {
2385 Ok(action) => action,
2386 Err(_) => return -EINVAL,
2387 };
2388
2389 esyd(&format!("{action}/mktemp"), glob, b'+')
2391}
2392
2393#[no_mangle]
2398pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2399 let action = match Action::try_from(action) {
2401 Ok(action) => action,
2402 Err(_) => return -EINVAL,
2403 };
2404
2405 esyd(&format!("{action}/mktemp"), glob, b'-')
2407}
2408
2409#[no_mangle]
2413pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2414 let action = match Action::try_from(action) {
2416 Ok(action) => action,
2417 Err(_) => return -EINVAL,
2418 };
2419
2420 esyd(&format!("{action}/mktemp"), glob, b'^')
2422}
2423
2424#[no_mangle]
2428pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2429 let action = match Action::try_from(action) {
2431 Ok(action) => action,
2432 Err(_) => return -EINVAL,
2433 };
2434
2435 esyd(&format!("{action}/net/bind"), glob, b'+')
2437}
2438
2439#[no_mangle]
2444pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2445 let action = match Action::try_from(action) {
2447 Ok(action) => action,
2448 Err(_) => return -EINVAL,
2449 };
2450
2451 esyd(&format!("{action}/net/bind"), glob, b'-')
2453}
2454
2455#[no_mangle]
2459pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
2460 let action = match Action::try_from(action) {
2462 Ok(action) => action,
2463 Err(_) => return -EINVAL,
2464 };
2465
2466 esyd(&format!("{action}/net/bind"), glob, b'^')
2468}
2469
2470#[no_mangle]
2474pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
2475 let action = match Action::try_from(action) {
2477 Ok(action) => action,
2478 Err(_) => return -EINVAL,
2479 };
2480
2481 esyd(&format!("{action}/net/connect"), glob, b'+')
2483}
2484
2485#[no_mangle]
2490pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
2491 let action = match Action::try_from(action) {
2493 Ok(action) => action,
2494 Err(_) => return -EINVAL,
2495 };
2496
2497 esyd(&format!("{action}/net/connect"), glob, b'-')
2499}
2500
2501#[no_mangle]
2505pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
2506 let action = match Action::try_from(action) {
2508 Ok(action) => action,
2509 Err(_) => return -EINVAL,
2510 };
2511
2512 esyd(&format!("{action}/net/connect"), glob, b'^')
2514}
2515
2516#[no_mangle]
2520pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
2521 let action = match Action::try_from(action) {
2523 Ok(action) => action,
2524 Err(_) => return -EINVAL,
2525 };
2526
2527 esyd(&format!("{action}/net/sendfd"), glob, b'+')
2529}
2530
2531#[no_mangle]
2536pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
2537 let action = match Action::try_from(action) {
2539 Ok(action) => action,
2540 Err(_) => return -EINVAL,
2541 };
2542
2543 esyd(&format!("{action}/net/sendfd"), glob, b'-')
2545}
2546
2547#[no_mangle]
2551pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
2552 let action = match Action::try_from(action) {
2554 Ok(action) => action,
2555 Err(_) => return -EINVAL,
2556 };
2557
2558 esyd(&format!("{action}/net/sendfd"), glob, b'^')
2560}
2561
2562#[no_mangle]
2566pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
2567 let action = match Action::try_from(action) {
2569 Ok(action) => action,
2570 Err(_) => return -EINVAL,
2571 };
2572
2573 esyd(&format!("{action}/net/link"), family, b'+')
2575}
2576
2577#[no_mangle]
2582pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
2583 let action = match Action::try_from(action) {
2585 Ok(action) => action,
2586 Err(_) => return -EINVAL,
2587 };
2588
2589 esyd(&format!("{action}/net/link"), family, b'-')
2591}
2592
2593#[no_mangle]
2597pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
2598 let action = match Action::try_from(action) {
2600 Ok(action) => action,
2601 Err(_) => return -EINVAL,
2602 };
2603
2604 esyd(&format!("{action}/net/link"), family, b'^')
2606}
2607
2608#[no_mangle]
2614pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
2615 esyd("mem/max", size, b':')
2616}
2617
2618#[no_mangle]
2624pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
2625 esyd("mem/vm_max", size, b':')
2626}
2627
2628#[no_mangle]
2632pub extern "C" fn syd_pid_max(size: usize) -> c_int {
2633 stat(&format!("/dev/syd/pid/max:{size}"))
2634}
2635
2636#[no_mangle]
2641pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
2642 stat(&format!("/dev/syd/segvguard/expiry:{timeout}"))
2643}
2644
2645#[no_mangle]
2649pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
2650 stat(&format!("/dev/syd/segvguard/suspension:{timeout}"))
2651}
2652
2653#[no_mangle]
2657pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
2658 stat(&format!("/dev/syd/segvguard/maxcrashes:{max}"))
2659}
2660
2661#[no_mangle]
2687pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
2688 if file.is_null() || argv.is_null() {
2689 return -EFAULT;
2690 }
2691
2692 let file = CStr::from_ptr(file);
2694 let file = OsStr::from_bytes(file.to_bytes());
2695
2696 let mut path = OsString::from("/dev/syd/cmd/exec!");
2697 path.push(file);
2698
2699 let mut idx: isize = 0;
2700 while !(*argv.offset(idx)).is_null() {
2701 let arg = CStr::from_ptr(*argv.offset(idx));
2703 let arg = OsStr::from_bytes(arg.to_bytes());
2704
2705 path.push(OsStr::from_bytes(&[b'\x1F'])); path.push(arg);
2707
2708 idx = idx.saturating_add(1);
2709 }
2710
2711 let path = PathBuf::from(path);
2712 stat(path)
2713}