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 linux::fs::MetadataExt as LinuxMetadataExt,
72 raw::{c_char, c_int},
73 unix::{
74 ffi::OsStrExt,
75 fs::{FileTypeExt, MetadataExt as UnixMetadataExt},
76 },
77 },
78 path::{Path, PathBuf},
79};
80
81#[expect(non_camel_case_types)]
83pub type lock_state_t = u8;
84
85pub const LOCK_OFF: lock_state_t = 0;
87pub const LOCK_EXEC: lock_state_t = 1;
90pub const LOCK_DROP: lock_state_t = 2;
93pub const LOCK_READ: lock_state_t = 3;
96pub const LOCK_ON: lock_state_t = 4;
98
99#[repr(u8)]
101#[derive(Copy, Clone, Debug)]
102enum LockState {
103 Off = LOCK_OFF,
105 Exec = LOCK_EXEC,
108 Drop = LOCK_DROP,
111 Read = LOCK_READ,
114 On = LOCK_ON,
116}
117
118impl TryFrom<lock_state_t> for LockState {
119 type Error = ();
120
121 fn try_from(value: lock_state_t) -> Result<Self, Self::Error> {
122 match value {
123 LOCK_OFF => Ok(LockState::Off),
124 LOCK_EXEC => Ok(LockState::Exec),
125 LOCK_DROP => Ok(LockState::Drop),
126 LOCK_READ => Ok(LockState::Read),
127 LOCK_ON => Ok(LockState::On),
128 _ => Err(()),
129 }
130 }
131}
132
133impl fmt::Display for LockState {
134 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
135 let state_str = match self {
136 LockState::Off => "off",
137 LockState::Exec => "exec",
138 LockState::Drop => "drop",
139 LockState::Read => "read",
140 LockState::On => "on",
141 };
142 write!(f, "{state_str}")
143 }
144}
145
146#[expect(non_camel_case_types)]
148pub type action_t = u8;
149
150pub const ACTION_ALLOW: action_t = 0;
152pub const ACTION_WARN: action_t = 1;
154pub const ACTION_FILTER: action_t = 2;
156pub const ACTION_DENY: action_t = 3;
158pub const ACTION_PANIC: action_t = 4;
160pub const ACTION_STOP: action_t = 5;
162pub const ACTION_ABORT: action_t = 6;
164pub const ACTION_KILL: action_t = 7;
166pub const ACTION_EXIT: action_t = 8;
168
169#[repr(u8)]
171#[derive(Copy, Clone, Debug)]
172enum Action {
173 Allow = ACTION_ALLOW,
175 Warn = ACTION_WARN,
177 Filter = ACTION_FILTER,
179 Deny = ACTION_DENY,
181 Panic = ACTION_PANIC,
183 Stop = ACTION_STOP,
185 Abort = ACTION_ABORT,
187 Kill = ACTION_KILL,
189 Exit = ACTION_EXIT,
191}
192
193impl TryFrom<action_t> for Action {
194 type Error = ();
195
196 fn try_from(value: action_t) -> Result<Self, Self::Error> {
197 match value {
198 ACTION_ALLOW => Ok(Action::Allow),
199 ACTION_WARN => Ok(Action::Warn),
200 ACTION_FILTER => Ok(Action::Filter),
201 ACTION_DENY => Ok(Action::Deny),
202 ACTION_PANIC => Ok(Action::Panic),
203 ACTION_STOP => Ok(Action::Stop),
204 ACTION_ABORT => Ok(Action::Abort),
205 ACTION_KILL => Ok(Action::Kill),
206 ACTION_EXIT => Ok(Action::Exit),
207 _ => Err(()),
208 }
209 }
210}
211
212impl fmt::Display for Action {
213 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
214 let action_str = match self {
215 Action::Allow => "allow",
216 Action::Warn => "warn",
217 Action::Filter => "filter",
218 Action::Deny => "deny",
219 Action::Panic => "panic",
220 Action::Stop => "stop",
221 Action::Abort => "abort",
222 Action::Kill => "kill",
223 Action::Exit => "exit",
224 };
225 write!(f, "{action_str}")
226 }
227}
228
229const EFAULT: i32 = 14;
230const EINVAL: i32 = 22;
231const LIB_MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
232const SYD_ATIME: i64 = 505958400;
233const SYD_CTIME: i64 = -2036448000;
234const SYD_MTIME: i64 = -842745600;
235
236fn check_stat(stat: &Metadata) -> bool {
237 let lib_major = if let Ok(lib_major) = LIB_MAJOR.parse() {
238 lib_major
239 } else {
240 return false;
241 };
242
243 if !stat.file_type().is_char_device() {
245 return false;
246 }
247
248 if stat.st_atime() != SYD_ATIME {
250 return false;
251 }
252 if stat.st_ctime() != SYD_CTIME {
253 return false;
254 }
255 if stat.st_mtime() != SYD_MTIME {
256 return false;
257 }
258
259 let rdev = stat.rdev();
260
261 let api_major = (rdev >> 8) & 0xff;
262 let api_minor = rdev & 0xff;
263
264 api_major == lib_major && api_minor >= 1
267}
268
269fn stat<P: AsRef<Path>>(path: P) -> c_int {
270 match symlink_metadata(path) {
271 Ok(stat) if check_stat(&stat) => 0,
272 Ok(_) => -EINVAL,
273 Err(error) => match error.raw_os_error() {
274 Some(e) => e.checked_neg().unwrap_or(-EINVAL),
275 None => -EINVAL,
276 },
277 }
278}
279
280fn esyd<P: AsRef<Path>>(rule: P, elem: *const c_char, op: u8) -> c_int {
281 if !matches!(op, b'+' | b'-' | b'^' | b':') {
282 return -EINVAL;
283 }
284
285 if elem.is_null() {
286 return -EFAULT;
287 }
288
289 let elem = unsafe { CStr::from_ptr(elem) };
291 let elem = OsStr::from_bytes(elem.to_bytes());
292
293 let mut path = OsString::from("/dev/syd/");
295 path.push(rule.as_ref());
296 path.push(OsStr::from_bytes(&[op]));
297 path.push(elem);
298
299 let path = PathBuf::from(path);
301
302 stat(path)
303}
304
305#[no_mangle]
312pub extern "C" fn syd_api() -> c_int {
313 match stat("/dev/syd/3") {
314 0 => 3,
315 n => n,
316 }
317}
318
319#[no_mangle]
323pub extern "C" fn syd_check() -> c_int {
324 stat("/dev/syd")
325}
326
327#[no_mangle]
331pub extern "C" fn syd_panic() -> c_int {
332 stat("/dev/syd/panic")
333}
334
335#[no_mangle]
340pub extern "C" fn syd_reset() -> c_int {
341 stat("/dev/syd/reset")
342}
343
344#[no_mangle]
348pub extern "C" fn syd_load(fd: c_int) -> c_int {
349 let fd = match RawFd::try_from(fd) {
350 Ok(fd) if fd < 0 => return -EINVAL,
351 Ok(fd) => fd,
352 Err(_) => return -EINVAL,
353 };
354 stat(format!("/dev/syd/load/{fd}"))
355}
356
357#[no_mangle]
363pub extern "C" fn syd_lock(state: lock_state_t) -> c_int {
364 let state = match LockState::try_from(state) {
366 Ok(state) => state,
367 Err(_) => return -EINVAL,
368 };
369
370 stat(format!("/dev/syd/lock:{state}"))
371}
372
373#[no_mangle]
377pub extern "C" fn syd_enabled_fs() -> bool {
378 stat("/dev/syd/sandbox/fs?") == 0
379}
380
381#[no_mangle]
385pub extern "C" fn syd_enable_fs() -> c_int {
386 stat("/dev/syd/sandbox/fs:on")
387}
388
389#[no_mangle]
393pub extern "C" fn syd_disable_fs() -> c_int {
394 stat("/dev/syd/sandbox/fs:off")
395}
396
397#[no_mangle]
401pub extern "C" fn syd_enabled_walk() -> bool {
402 stat("/dev/syd/sandbox/walk?") == 0
403}
404
405#[no_mangle]
409pub extern "C" fn syd_enable_walk() -> c_int {
410 stat("/dev/syd/sandbox/walk:on")
411}
412
413#[no_mangle]
417pub extern "C" fn syd_disable_walk() -> c_int {
418 stat("/dev/syd/sandbox/walk:off")
419}
420
421#[no_mangle]
425pub extern "C" fn syd_enabled_list() -> bool {
426 stat("/dev/syd/sandbox/list?") == 0
427}
428
429#[no_mangle]
433pub extern "C" fn syd_enable_list() -> c_int {
434 stat("/dev/syd/sandbox/list:on")
435}
436
437#[no_mangle]
441pub extern "C" fn syd_disable_list() -> c_int {
442 stat("/dev/syd/sandbox/list:off")
443}
444
445#[no_mangle]
449pub extern "C" fn syd_enabled_stat() -> bool {
450 stat("/dev/syd/sandbox/stat?") == 0
451}
452
453#[no_mangle]
457pub extern "C" fn syd_enable_stat() -> c_int {
458 stat("/dev/syd/sandbox/stat:on")
459}
460
461#[no_mangle]
465pub extern "C" fn syd_disable_stat() -> c_int {
466 stat("/dev/syd/sandbox/stat:off")
467}
468
469#[no_mangle]
473pub extern "C" fn syd_enabled_read() -> bool {
474 stat("/dev/syd/sandbox/read?") == 0
475}
476
477#[no_mangle]
481pub extern "C" fn syd_enable_read() -> c_int {
482 stat("/dev/syd/sandbox/read:on")
483}
484
485#[no_mangle]
489pub extern "C" fn syd_disable_read() -> c_int {
490 stat("/dev/syd/sandbox/read:off")
491}
492
493#[no_mangle]
497pub extern "C" fn syd_enabled_write() -> bool {
498 stat("/dev/syd/sandbox/write?") == 0
499}
500
501#[no_mangle]
505pub extern "C" fn syd_enable_write() -> c_int {
506 stat("/dev/syd/sandbox/write:on")
507}
508
509#[no_mangle]
513pub extern "C" fn syd_disable_write() -> c_int {
514 stat("/dev/syd/sandbox/write:off")
515}
516
517#[no_mangle]
521pub extern "C" fn syd_enabled_exec() -> bool {
522 stat("/dev/syd/sandbox/exec?") == 0
523}
524
525#[no_mangle]
529pub extern "C" fn syd_enable_exec() -> c_int {
530 stat("/dev/syd/sandbox/exec:on")
531}
532
533#[no_mangle]
537pub extern "C" fn syd_disable_exec() -> c_int {
538 stat("/dev/syd/sandbox/exec:off")
539}
540
541#[no_mangle]
545pub extern "C" fn syd_enabled_ioctl() -> bool {
546 stat("/dev/syd/sandbox/ioctl?") == 0
547}
548
549#[no_mangle]
553pub extern "C" fn syd_enable_ioctl() -> c_int {
554 stat("/dev/syd/sandbox/ioctl:on")
555}
556
557#[no_mangle]
561pub extern "C" fn syd_disable_ioctl() -> c_int {
562 stat("/dev/syd/sandbox/ioctl:off")
563}
564
565#[no_mangle]
569pub extern "C" fn syd_enabled_create() -> bool {
570 stat("/dev/syd/sandbox/create?") == 0
571}
572
573#[no_mangle]
577pub extern "C" fn syd_enable_create() -> c_int {
578 stat("/dev/syd/sandbox/create:on")
579}
580
581#[no_mangle]
585pub extern "C" fn syd_disable_create() -> c_int {
586 stat("/dev/syd/sandbox/create:off")
587}
588
589#[no_mangle]
593pub extern "C" fn syd_enabled_delete() -> bool {
594 stat("/dev/syd/sandbox/delete?") == 0
595}
596
597#[no_mangle]
601pub extern "C" fn syd_enable_delete() -> c_int {
602 stat("/dev/syd/sandbox/delete:on")
603}
604
605#[no_mangle]
609pub extern "C" fn syd_disable_delete() -> c_int {
610 stat("/dev/syd/sandbox/delete:off")
611}
612
613#[no_mangle]
617pub extern "C" fn syd_enabled_rename() -> bool {
618 stat("/dev/syd/sandbox/rename?") == 0
619}
620
621#[no_mangle]
625pub extern "C" fn syd_enable_rename() -> c_int {
626 stat("/dev/syd/sandbox/rename:on")
627}
628
629#[no_mangle]
633pub extern "C" fn syd_disable_rename() -> c_int {
634 stat("/dev/syd/sandbox/rename:off")
635}
636
637#[no_mangle]
641pub extern "C" fn syd_enabled_readlink() -> bool {
642 stat("/dev/syd/sandbox/readlink?") == 0
643}
644
645#[no_mangle]
649pub extern "C" fn syd_enable_readlink() -> c_int {
650 stat("/dev/syd/sandbox/readlink:on")
651}
652
653#[no_mangle]
657pub extern "C" fn syd_disable_readlink() -> c_int {
658 stat("/dev/syd/sandbox/readlink:off")
659}
660
661#[no_mangle]
665pub extern "C" fn syd_enabled_symlink() -> bool {
666 stat("/dev/syd/sandbox/symlink?") == 0
667}
668
669#[no_mangle]
673pub extern "C" fn syd_enable_symlink() -> c_int {
674 stat("/dev/syd/sandbox/symlink:on")
675}
676
677#[no_mangle]
681pub extern "C" fn syd_disable_symlink() -> c_int {
682 stat("/dev/syd/sandbox/symlink:off")
683}
684
685#[no_mangle]
689pub extern "C" fn syd_enabled_truncate() -> bool {
690 stat("/dev/syd/sandbox/truncate?") == 0
691}
692
693#[no_mangle]
697pub extern "C" fn syd_enable_truncate() -> c_int {
698 stat("/dev/syd/sandbox/truncate:on")
699}
700
701#[no_mangle]
705pub extern "C" fn syd_disable_truncate() -> c_int {
706 stat("/dev/syd/sandbox/truncate:off")
707}
708
709#[no_mangle]
713pub extern "C" fn syd_enabled_chdir() -> bool {
714 stat("/dev/syd/sandbox/chdir?") == 0
715}
716
717#[no_mangle]
721pub extern "C" fn syd_enable_chdir() -> c_int {
722 stat("/dev/syd/sandbox/chdir:on")
723}
724
725#[no_mangle]
729pub extern "C" fn syd_disable_chdir() -> c_int {
730 stat("/dev/syd/sandbox/chdir:off")
731}
732
733#[no_mangle]
737pub extern "C" fn syd_enabled_readdir() -> bool {
738 stat("/dev/syd/sandbox/readdir?") == 0
739}
740
741#[no_mangle]
745pub extern "C" fn syd_enable_readdir() -> c_int {
746 stat("/dev/syd/sandbox/readdir:on")
747}
748
749#[no_mangle]
753pub extern "C" fn syd_disable_readdir() -> c_int {
754 stat("/dev/syd/sandbox/readdir:off")
755}
756
757#[no_mangle]
761pub extern "C" fn syd_enabled_mkdir() -> bool {
762 stat("/dev/syd/sandbox/mkdir?") == 0
763}
764
765#[no_mangle]
769pub extern "C" fn syd_enable_mkdir() -> c_int {
770 stat("/dev/syd/sandbox/mkdir:on")
771}
772
773#[no_mangle]
777pub extern "C" fn syd_disable_mkdir() -> c_int {
778 stat("/dev/syd/sandbox/mkdir:off")
779}
780
781#[no_mangle]
785pub extern "C" fn syd_enabled_rmdir() -> bool {
786 stat("/dev/syd/sandbox/rmdir?") == 0
787}
788
789#[no_mangle]
793pub extern "C" fn syd_enable_rmdir() -> c_int {
794 stat("/dev/syd/sandbox/rmdir:on")
795}
796
797#[no_mangle]
801pub extern "C" fn syd_disable_rmdir() -> c_int {
802 stat("/dev/syd/sandbox/rmdir:off")
803}
804
805#[no_mangle]
809pub extern "C" fn syd_enabled_chown() -> bool {
810 stat("/dev/syd/sandbox/chown?") == 0
811}
812
813#[no_mangle]
817pub extern "C" fn syd_enable_chown() -> c_int {
818 stat("/dev/syd/sandbox/chown:on")
819}
820
821#[no_mangle]
825pub extern "C" fn syd_disable_chown() -> c_int {
826 stat("/dev/syd/sandbox/chown:off")
827}
828
829#[no_mangle]
833pub extern "C" fn syd_enabled_chgrp() -> bool {
834 stat("/dev/syd/sandbox/chgrp?") == 0
835}
836
837#[no_mangle]
841pub extern "C" fn syd_enable_chgrp() -> c_int {
842 stat("/dev/syd/sandbox/chgrp:on")
843}
844
845#[no_mangle]
849pub extern "C" fn syd_disable_chgrp() -> c_int {
850 stat("/dev/syd/sandbox/chgrp:off")
851}
852
853#[no_mangle]
857pub extern "C" fn syd_enabled_chmod() -> bool {
858 stat("/dev/syd/sandbox/chmod?") == 0
859}
860
861#[no_mangle]
865pub extern "C" fn syd_enable_chmod() -> c_int {
866 stat("/dev/syd/sandbox/chmod:on")
867}
868
869#[no_mangle]
873pub extern "C" fn syd_disable_chmod() -> c_int {
874 stat("/dev/syd/sandbox/chmod:off")
875}
876
877#[no_mangle]
881pub extern "C" fn syd_enabled_chattr() -> bool {
882 stat("/dev/syd/sandbox/chattr?") == 0
883}
884
885#[no_mangle]
889pub extern "C" fn syd_enable_chattr() -> c_int {
890 stat("/dev/syd/sandbox/chattr:on")
891}
892
893#[no_mangle]
897pub extern "C" fn syd_disable_chattr() -> c_int {
898 stat("/dev/syd/sandbox/chattr:off")
899}
900
901#[no_mangle]
905pub extern "C" fn syd_enabled_chroot() -> bool {
906 stat("/dev/syd/sandbox/chroot?") == 0
907}
908
909#[no_mangle]
913pub extern "C" fn syd_enable_chroot() -> c_int {
914 stat("/dev/syd/sandbox/chroot:on")
915}
916
917#[no_mangle]
921pub extern "C" fn syd_disable_chroot() -> c_int {
922 stat("/dev/syd/sandbox/chroot:off")
923}
924
925#[no_mangle]
929pub extern "C" fn syd_enabled_notify() -> bool {
930 stat("/dev/syd/sandbox/notify?") == 0
931}
932
933#[no_mangle]
937pub extern "C" fn syd_enable_notify() -> c_int {
938 stat("/dev/syd/sandbox/notify:on")
939}
940
941#[no_mangle]
945pub extern "C" fn syd_disable_notify() -> c_int {
946 stat("/dev/syd/sandbox/notify:off")
947}
948
949#[no_mangle]
953pub extern "C" fn syd_enabled_utime() -> bool {
954 stat("/dev/syd/sandbox/utime?") == 0
955}
956
957#[no_mangle]
961pub extern "C" fn syd_enable_utime() -> c_int {
962 stat("/dev/syd/sandbox/utime:on")
963}
964
965#[no_mangle]
969pub extern "C" fn syd_disable_utime() -> c_int {
970 stat("/dev/syd/sandbox/utime:off")
971}
972
973#[no_mangle]
977pub extern "C" fn syd_enabled_mkbdev() -> bool {
978 stat("/dev/syd/sandbox/mkbdev?") == 0
979}
980
981#[no_mangle]
985pub extern "C" fn syd_enable_mkbdev() -> c_int {
986 stat("/dev/syd/sandbox/mkbdev:on")
987}
988
989#[no_mangle]
993pub extern "C" fn syd_disable_mkbdev() -> c_int {
994 stat("/dev/syd/sandbox/mkbdev:off")
995}
996
997#[no_mangle]
1001pub extern "C" fn syd_enabled_mkcdev() -> bool {
1002 stat("/dev/syd/sandbox/mkcdev?") == 0
1003}
1004
1005#[no_mangle]
1009pub extern "C" fn syd_enable_mkcdev() -> c_int {
1010 stat("/dev/syd/sandbox/mkcdev:on")
1011}
1012
1013#[no_mangle]
1017pub extern "C" fn syd_disable_mkcdev() -> c_int {
1018 stat("/dev/syd/sandbox/mkcdev:off")
1019}
1020
1021#[no_mangle]
1025pub extern "C" fn syd_enabled_mkfifo() -> bool {
1026 stat("/dev/syd/sandbox/mkfifo?") == 0
1027}
1028
1029#[no_mangle]
1033pub extern "C" fn syd_enable_mkfifo() -> c_int {
1034 stat("/dev/syd/sandbox/mkfifo:on")
1035}
1036
1037#[no_mangle]
1041pub extern "C" fn syd_disable_mkfifo() -> c_int {
1042 stat("/dev/syd/sandbox/mkfifo:off")
1043}
1044
1045#[no_mangle]
1049pub extern "C" fn syd_enabled_mktemp() -> bool {
1050 stat("/dev/syd/sandbox/mktemp?") == 0
1051}
1052
1053#[no_mangle]
1057pub extern "C" fn syd_enable_mktemp() -> c_int {
1058 stat("/dev/syd/sandbox/mktemp:on")
1059}
1060
1061#[no_mangle]
1065pub extern "C" fn syd_disable_mktemp() -> c_int {
1066 stat("/dev/syd/sandbox/mktemp:off")
1067}
1068
1069#[no_mangle]
1073pub extern "C" fn syd_enabled_net() -> bool {
1074 stat("/dev/syd/sandbox/net?") == 0
1075}
1076
1077#[no_mangle]
1081pub extern "C" fn syd_enable_net() -> c_int {
1082 stat("/dev/syd/sandbox/net:on")
1083}
1084
1085#[no_mangle]
1089pub extern "C" fn syd_disable_net() -> c_int {
1090 stat("/dev/syd/sandbox/net:off")
1091}
1092
1093#[no_mangle]
1097pub extern "C" fn syd_enabled_mem() -> bool {
1098 stat("/dev/syd/sandbox/mem?") == 0
1099}
1100
1101#[no_mangle]
1105pub extern "C" fn syd_disable_mem() -> c_int {
1106 stat("/dev/syd/sandbox/mem:off")
1107}
1108
1109#[no_mangle]
1113pub extern "C" fn syd_enabled_pid() -> bool {
1114 stat("/dev/syd/sandbox/pid?") == 0
1115}
1116
1117#[no_mangle]
1121pub extern "C" fn syd_enable_pid() -> c_int {
1122 stat("/dev/syd/sandbox/pid:on")
1123}
1124
1125#[no_mangle]
1129pub extern "C" fn syd_disable_pid() -> c_int {
1130 stat("/dev/syd/sandbox/pid:off")
1131}
1132
1133#[no_mangle]
1137pub extern "C" fn syd_enabled_lock() -> bool {
1138 stat("/dev/syd/sandbox/lock?") == 0
1139}
1140
1141#[no_mangle]
1145pub extern "C" fn syd_enabled_crypt() -> bool {
1146 stat("/dev/syd/sandbox/crypt?") == 0
1147}
1148
1149#[no_mangle]
1153pub extern "C" fn syd_enabled_proxy() -> bool {
1154 stat("/dev/syd/sandbox/proxy?") == 0
1155}
1156
1157#[no_mangle]
1161pub extern "C" fn syd_enabled_force() -> bool {
1162 stat("/dev/syd/sandbox/force?") == 0
1163}
1164
1165#[no_mangle]
1169pub extern "C" fn syd_disable_force() -> c_int {
1170 stat("/dev/syd/sandbox/force:off")
1171}
1172
1173#[no_mangle]
1177pub extern "C" fn syd_enabled_tpe() -> bool {
1178 stat("/dev/syd/sandbox/tpe?") == 0
1179}
1180
1181#[no_mangle]
1185pub extern "C" fn syd_enable_tpe() -> c_int {
1186 stat("/dev/syd/sandbox/tpe:on")
1187}
1188
1189#[no_mangle]
1193pub extern "C" fn syd_disable_tpe() -> c_int {
1194 stat("/dev/syd/sandbox/tpe:off")
1195}
1196
1197#[no_mangle]
1199pub extern "C" fn syd_default_fs(action: action_t) -> c_int {
1200 let action = match Action::try_from(action) {
1202 Ok(action) => action,
1203 Err(_) => return -EINVAL,
1204 };
1205 stat(format!("/dev/syd/default/fs:{action}"))
1206}
1207
1208#[no_mangle]
1210pub extern "C" fn syd_default_walk(action: action_t) -> c_int {
1211 let action = match Action::try_from(action) {
1213 Ok(action) => action,
1214 Err(_) => return -EINVAL,
1215 };
1216 stat(format!("/dev/syd/default/walk:{action}"))
1217}
1218
1219#[no_mangle]
1221pub extern "C" fn syd_default_list(action: action_t) -> c_int {
1222 let action = match Action::try_from(action) {
1224 Ok(action) => action,
1225 Err(_) => return -EINVAL,
1226 };
1227 stat(format!("/dev/syd/default/list:{action}"))
1228}
1229
1230#[no_mangle]
1232pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
1233 let action = match Action::try_from(action) {
1235 Ok(action) => action,
1236 Err(_) => return -EINVAL,
1237 };
1238 stat(format!("/dev/syd/default/stat:{action}"))
1239}
1240
1241#[no_mangle]
1243pub extern "C" fn syd_default_read(action: action_t) -> c_int {
1244 let action = match Action::try_from(action) {
1246 Ok(action) => action,
1247 Err(_) => return -EINVAL,
1248 };
1249 stat(format!("/dev/syd/default/read:{action}"))
1250}
1251
1252#[no_mangle]
1254pub extern "C" fn syd_default_write(action: action_t) -> c_int {
1255 let action = match Action::try_from(action) {
1257 Ok(action) => action,
1258 Err(_) => return -EINVAL,
1259 };
1260 stat(format!("/dev/syd/default/write:{action}"))
1261}
1262
1263#[no_mangle]
1265pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
1266 let action = match Action::try_from(action) {
1268 Ok(action) => action,
1269 Err(_) => return -EINVAL,
1270 };
1271 stat(format!("/dev/syd/default/exec:{action}"))
1272}
1273
1274#[no_mangle]
1276pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
1277 let action = match Action::try_from(action) {
1279 Ok(action) => action,
1280 Err(_) => return -EINVAL,
1281 };
1282 stat(format!("/dev/syd/default/ioctl:{action}"))
1283}
1284
1285#[no_mangle]
1287pub extern "C" fn syd_default_create(action: action_t) -> c_int {
1288 let action = match Action::try_from(action) {
1290 Ok(action) => action,
1291 Err(_) => return -EINVAL,
1292 };
1293 stat(format!("/dev/syd/default/create:{action}"))
1294}
1295
1296#[no_mangle]
1298pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
1299 let action = match Action::try_from(action) {
1301 Ok(action) => action,
1302 Err(_) => return -EINVAL,
1303 };
1304 stat(format!("/dev/syd/default/delete:{action}"))
1305}
1306
1307#[no_mangle]
1309pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
1310 let action = match Action::try_from(action) {
1312 Ok(action) => action,
1313 Err(_) => return -EINVAL,
1314 };
1315 stat(format!("/dev/syd/default/rename:{action}"))
1316}
1317
1318#[no_mangle]
1320pub extern "C" fn syd_default_readlink(action: action_t) -> c_int {
1321 let action = match Action::try_from(action) {
1323 Ok(action) => action,
1324 Err(_) => return -EINVAL,
1325 };
1326 stat(format!("/dev/syd/default/readlink:{action}"))
1327}
1328
1329#[no_mangle]
1331pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
1332 let action = match Action::try_from(action) {
1334 Ok(action) => action,
1335 Err(_) => return -EINVAL,
1336 };
1337 stat(format!("/dev/syd/default/symlink:{action}"))
1338}
1339
1340#[no_mangle]
1342pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
1343 let action = match Action::try_from(action) {
1345 Ok(action) => action,
1346 Err(_) => return -EINVAL,
1347 };
1348 stat(format!("/dev/syd/default/truncate:{action}"))
1349}
1350
1351#[no_mangle]
1353pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
1354 let action = match Action::try_from(action) {
1356 Ok(action) => action,
1357 Err(_) => return -EINVAL,
1358 };
1359 stat(format!("/dev/syd/default/chdir:{action}"))
1360}
1361
1362#[no_mangle]
1364pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
1365 let action = match Action::try_from(action) {
1367 Ok(action) => action,
1368 Err(_) => return -EINVAL,
1369 };
1370 stat(format!("/dev/syd/default/readdir:{action}"))
1371}
1372
1373#[no_mangle]
1375pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
1376 let action = match Action::try_from(action) {
1378 Ok(action) => action,
1379 Err(_) => return -EINVAL,
1380 };
1381 stat(format!("/dev/syd/default/mkdir:{action}"))
1382}
1383
1384#[no_mangle]
1386pub extern "C" fn syd_default_rmdir(action: action_t) -> c_int {
1387 let action = match Action::try_from(action) {
1389 Ok(action) => action,
1390 Err(_) => return -EINVAL,
1391 };
1392 stat(format!("/dev/syd/default/rmdir:{action}"))
1393}
1394
1395#[no_mangle]
1397pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1398 let action = match Action::try_from(action) {
1400 Ok(action) => action,
1401 Err(_) => return -EINVAL,
1402 };
1403 stat(format!("/dev/syd/default/chown:{action}"))
1404}
1405
1406#[no_mangle]
1408pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1409 let action = match Action::try_from(action) {
1411 Ok(action) => action,
1412 Err(_) => return -EINVAL,
1413 };
1414 stat(format!("/dev/syd/default/chgrp:{action}"))
1415}
1416
1417#[no_mangle]
1419pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1420 let action = match Action::try_from(action) {
1422 Ok(action) => action,
1423 Err(_) => return -EINVAL,
1424 };
1425 stat(format!("/dev/syd/default/chmod:{action}"))
1426}
1427
1428#[no_mangle]
1430pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1431 let action = match Action::try_from(action) {
1433 Ok(action) => action,
1434 Err(_) => return -EINVAL,
1435 };
1436 stat(format!("/dev/syd/default/chattr:{action}"))
1437}
1438
1439#[no_mangle]
1441pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1442 let action = match Action::try_from(action) {
1444 Ok(action) => action,
1445 Err(_) => return -EINVAL,
1446 };
1447 stat(format!("/dev/syd/default/chroot:{action}"))
1448}
1449
1450#[no_mangle]
1452pub extern "C" fn syd_default_notify(action: action_t) -> c_int {
1453 let action = match Action::try_from(action) {
1455 Ok(action) => action,
1456 Err(_) => return -EINVAL,
1457 };
1458 stat(format!("/dev/syd/default/notify:{action}"))
1459}
1460
1461#[no_mangle]
1463pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1464 let action = match Action::try_from(action) {
1466 Ok(action) => action,
1467 Err(_) => return -EINVAL,
1468 };
1469 stat(format!("/dev/syd/default/utime:{action}"))
1470}
1471
1472#[no_mangle]
1474pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
1475 let action = match Action::try_from(action) {
1477 Ok(action) => action,
1478 Err(_) => return -EINVAL,
1479 };
1480 stat(format!("/dev/syd/default/mkbdev:{action}"))
1481}
1482
1483#[no_mangle]
1485pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
1486 let action = match Action::try_from(action) {
1488 Ok(action) => action,
1489 Err(_) => return -EINVAL,
1490 };
1491 stat(format!("/dev/syd/default/mkcdev:{action}"))
1492}
1493
1494#[no_mangle]
1496pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1497 let action = match Action::try_from(action) {
1499 Ok(action) => action,
1500 Err(_) => return -EINVAL,
1501 };
1502 stat(format!("/dev/syd/default/mkfifo:{action}"))
1503}
1504
1505#[no_mangle]
1507pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1508 let action = match Action::try_from(action) {
1510 Ok(action) => action,
1511 Err(_) => return -EINVAL,
1512 };
1513 stat(format!("/dev/syd/default/mktemp:{action}"))
1514}
1515
1516#[no_mangle]
1518pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1519 let action = match Action::try_from(action) {
1521 Ok(action) => action,
1522 Err(_) => return -EINVAL,
1523 };
1524 stat(format!("/dev/syd/default/net:{action}"))
1525}
1526
1527#[no_mangle]
1529pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1530 let action = match Action::try_from(action) {
1532 Ok(action) => action,
1533 Err(_) => return -EINVAL,
1534 };
1535 stat(format!("/dev/syd/default/block:{action}"))
1536}
1537
1538#[no_mangle]
1540pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1541 let action = match Action::try_from(action) {
1543 Ok(action) => action,
1544 Err(_) => return -EINVAL,
1545 };
1546 stat(format!("/dev/syd/default/mem:{action}"))
1547}
1548
1549#[no_mangle]
1551pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1552 let action = match Action::try_from(action) {
1554 Ok(action) => action,
1555 Err(_) => return -EINVAL,
1556 };
1557 stat(format!("/dev/syd/default/pid:{action}"))
1558}
1559
1560#[no_mangle]
1562pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1563 let action = match Action::try_from(action) {
1565 Ok(action) => action,
1566 Err(_) => return -EINVAL,
1567 };
1568 stat(format!("/dev/syd/default/force:{action}"))
1569}
1570
1571#[no_mangle]
1573pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1574 let action = match Action::try_from(action) {
1576 Ok(action) => action,
1577 Err(_) => return -EINVAL,
1578 };
1579 stat(format!("/dev/syd/default/segvguard:{action}"))
1580}
1581
1582#[no_mangle]
1584pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1585 let action = match Action::try_from(action) {
1587 Ok(action) => action,
1588 Err(_) => return -EINVAL,
1589 };
1590 stat(format!("/dev/syd/default/tpe:{action}"))
1591}
1592
1593#[no_mangle]
1595pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1596 stat(format!("/dev/syd/deny/ioctl+{request}"))
1597}
1598
1599#[no_mangle]
1616pub unsafe extern "C" fn syd_force_add(
1617 path: *const c_char,
1618 alg: *const c_char,
1619 hash: *const c_char,
1620 action: action_t,
1621) -> c_int {
1622 let action = match Action::try_from(action) {
1624 Ok(action) => action,
1625 Err(_) => return -EINVAL,
1626 };
1627
1628 if path.is_null() || alg.is_null() || hash.is_null() {
1629 return -EFAULT;
1630 }
1631
1632 let path = unsafe { CStr::from_ptr(path) };
1634 let alg = unsafe { CStr::from_ptr(alg) };
1636 let hash = unsafe { CStr::from_ptr(hash) };
1638 let path = match path.to_str() {
1639 Ok(s) => s,
1640 Err(_) => return -EINVAL,
1641 };
1642 let alg = match alg.to_str() {
1643 Ok(s) => s,
1644 Err(_) => return -EINVAL,
1645 };
1646 let hash = match hash.to_str() {
1647 Ok(s) => s,
1648 Err(_) => return -EINVAL,
1649 };
1650
1651 stat(format!("/dev/syd/force+{path}:{alg}:{hash}:{action}"))
1653}
1654
1655#[no_mangle]
1667pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1668 if path.is_null() {
1669 return -EFAULT;
1670 }
1671
1672 let path = unsafe { CStr::from_ptr(path) };
1674 let path = match path.to_str() {
1675 Ok(s) => s,
1676 Err(_) => return -EINVAL,
1677 };
1678
1679 stat(format!("/dev/syd/force-{path}"))
1681}
1682
1683#[no_mangle]
1685pub extern "C" fn syd_force_clr() -> c_int {
1686 stat("/dev/syd/force^")
1687}
1688
1689#[no_mangle]
1693pub extern "C" fn syd_fs_add(action: action_t, name: *const c_char) -> c_int {
1694 let action = match Action::try_from(action) {
1696 Ok(action) => action,
1697 Err(_) => return -EINVAL,
1698 };
1699
1700 esyd(format!("{action}/fs"), name, b'+')
1702}
1703
1704#[no_mangle]
1709pub extern "C" fn syd_fs_del(action: action_t, name: *const c_char) -> c_int {
1710 let action = match Action::try_from(action) {
1712 Ok(action) => action,
1713 Err(_) => return -EINVAL,
1714 };
1715
1716 esyd(format!("{action}/fs"), name, b'-')
1718}
1719
1720#[no_mangle]
1724pub extern "C" fn syd_fs_rem(action: action_t, name: *const c_char) -> c_int {
1725 let action = match Action::try_from(action) {
1727 Ok(action) => action,
1728 Err(_) => return -EINVAL,
1729 };
1730
1731 esyd(format!("{action}/fs"), name, b'^')
1733}
1734
1735#[no_mangle]
1739pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
1740 let action = match Action::try_from(action) {
1742 Ok(action) => action,
1743 Err(_) => return -EINVAL,
1744 };
1745
1746 esyd(format!("{action}/walk"), glob, b'+')
1748}
1749
1750#[no_mangle]
1755pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
1756 let action = match Action::try_from(action) {
1758 Ok(action) => action,
1759 Err(_) => return -EINVAL,
1760 };
1761
1762 esyd(format!("{action}/walk"), glob, b'-')
1764}
1765
1766#[no_mangle]
1770pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
1771 let action = match Action::try_from(action) {
1773 Ok(action) => action,
1774 Err(_) => return -EINVAL,
1775 };
1776
1777 esyd(format!("{action}/walk"), glob, b'^')
1779}
1780
1781#[no_mangle]
1785pub extern "C" fn syd_list_add(action: action_t, glob: *const c_char) -> c_int {
1786 let action = match Action::try_from(action) {
1788 Ok(action) => action,
1789 Err(_) => return -EINVAL,
1790 };
1791
1792 esyd(format!("{action}/list"), glob, b'+')
1794}
1795
1796#[no_mangle]
1801pub extern "C" fn syd_list_del(action: action_t, glob: *const c_char) -> c_int {
1802 let action = match Action::try_from(action) {
1804 Ok(action) => action,
1805 Err(_) => return -EINVAL,
1806 };
1807
1808 esyd(format!("{action}/list"), glob, b'-')
1810}
1811
1812#[no_mangle]
1816pub extern "C" fn syd_list_rem(action: action_t, glob: *const c_char) -> c_int {
1817 let action = match Action::try_from(action) {
1819 Ok(action) => action,
1820 Err(_) => return -EINVAL,
1821 };
1822
1823 esyd(format!("{action}/list"), glob, b'^')
1825}
1826
1827#[no_mangle]
1831pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1832 let action = match Action::try_from(action) {
1834 Ok(action) => action,
1835 Err(_) => return -EINVAL,
1836 };
1837
1838 esyd(format!("{action}/stat"), glob, b'+')
1840}
1841
1842#[no_mangle]
1847pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1848 let action = match Action::try_from(action) {
1850 Ok(action) => action,
1851 Err(_) => return -EINVAL,
1852 };
1853
1854 esyd(format!("{action}/stat"), glob, b'-')
1856}
1857
1858#[no_mangle]
1862pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1863 let action = match Action::try_from(action) {
1865 Ok(action) => action,
1866 Err(_) => return -EINVAL,
1867 };
1868
1869 esyd(format!("{action}/stat"), glob, b'^')
1871}
1872
1873#[no_mangle]
1877pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1878 let action = match Action::try_from(action) {
1880 Ok(action) => action,
1881 Err(_) => return -EINVAL,
1882 };
1883
1884 esyd(format!("{action}/read"), glob, b'+')
1886}
1887
1888#[no_mangle]
1893pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1894 let action = match Action::try_from(action) {
1896 Ok(action) => action,
1897 Err(_) => return -EINVAL,
1898 };
1899
1900 esyd(format!("{action}/read"), glob, b'-')
1902}
1903
1904#[no_mangle]
1908pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1909 let action = match Action::try_from(action) {
1911 Ok(action) => action,
1912 Err(_) => return -EINVAL,
1913 };
1914
1915 esyd(format!("{action}/read"), glob, b'^')
1917}
1918
1919#[no_mangle]
1923pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1924 let action = match Action::try_from(action) {
1926 Ok(action) => action,
1927 Err(_) => return -EINVAL,
1928 };
1929
1930 esyd(format!("{action}/write"), glob, b'+')
1932}
1933
1934#[no_mangle]
1939pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1940 let action = match Action::try_from(action) {
1942 Ok(action) => action,
1943 Err(_) => return -EINVAL,
1944 };
1945
1946 esyd(format!("{action}/write"), glob, b'-')
1948}
1949
1950#[no_mangle]
1954pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1955 let action = match Action::try_from(action) {
1957 Ok(action) => action,
1958 Err(_) => return -EINVAL,
1959 };
1960
1961 esyd(format!("{action}/write"), glob, b'^')
1963}
1964
1965#[no_mangle]
1969pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1970 let action = match Action::try_from(action) {
1972 Ok(action) => action,
1973 Err(_) => return -EINVAL,
1974 };
1975
1976 esyd(format!("{action}/exec"), glob, b'+')
1978}
1979
1980#[no_mangle]
1985pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1986 let action = match Action::try_from(action) {
1988 Ok(action) => action,
1989 Err(_) => return -EINVAL,
1990 };
1991
1992 esyd(format!("{action}/exec"), glob, b'-')
1994}
1995
1996#[no_mangle]
2000pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
2001 let action = match Action::try_from(action) {
2003 Ok(action) => action,
2004 Err(_) => return -EINVAL,
2005 };
2006
2007 esyd(format!("{action}/exec"), glob, b'^')
2009}
2010
2011#[no_mangle]
2015pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
2016 let action = match Action::try_from(action) {
2018 Ok(action) => action,
2019 Err(_) => return -EINVAL,
2020 };
2021
2022 esyd(format!("{action}/create"), glob, b'+')
2024}
2025
2026#[no_mangle]
2031pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
2032 let action = match Action::try_from(action) {
2034 Ok(action) => action,
2035 Err(_) => return -EINVAL,
2036 };
2037
2038 esyd(format!("{action}/create"), glob, b'-')
2040}
2041
2042#[no_mangle]
2046pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
2047 let action = match Action::try_from(action) {
2049 Ok(action) => action,
2050 Err(_) => return -EINVAL,
2051 };
2052
2053 esyd(format!("{action}/create"), glob, b'^')
2055}
2056
2057#[no_mangle]
2061pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
2062 let action = match Action::try_from(action) {
2064 Ok(action) => action,
2065 Err(_) => return -EINVAL,
2066 };
2067
2068 esyd(format!("{action}/delete"), glob, b'+')
2070}
2071
2072#[no_mangle]
2077pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
2078 let action = match Action::try_from(action) {
2080 Ok(action) => action,
2081 Err(_) => return -EINVAL,
2082 };
2083
2084 esyd(format!("{action}/delete"), glob, b'-')
2086}
2087
2088#[no_mangle]
2092pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
2093 let action = match Action::try_from(action) {
2095 Ok(action) => action,
2096 Err(_) => return -EINVAL,
2097 };
2098
2099 esyd(format!("{action}/delete"), glob, b'^')
2101}
2102
2103#[no_mangle]
2107pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
2108 let action = match Action::try_from(action) {
2110 Ok(action) => action,
2111 Err(_) => return -EINVAL,
2112 };
2113
2114 esyd(format!("{action}/rename"), glob, b'+')
2116}
2117
2118#[no_mangle]
2123pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
2124 let action = match Action::try_from(action) {
2126 Ok(action) => action,
2127 Err(_) => return -EINVAL,
2128 };
2129
2130 esyd(format!("{action}/rename"), glob, b'-')
2132}
2133
2134#[no_mangle]
2138pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
2139 let action = match Action::try_from(action) {
2141 Ok(action) => action,
2142 Err(_) => return -EINVAL,
2143 };
2144
2145 esyd(format!("{action}/rename"), glob, b'^')
2147}
2148
2149#[no_mangle]
2153pub extern "C" fn syd_readlink_add(action: action_t, glob: *const c_char) -> c_int {
2154 let action = match Action::try_from(action) {
2156 Ok(action) => action,
2157 Err(_) => return -EINVAL,
2158 };
2159
2160 esyd(format!("{action}/readlink"), glob, b'+')
2162}
2163
2164#[no_mangle]
2169pub extern "C" fn syd_readlink_del(action: action_t, glob: *const c_char) -> c_int {
2170 let action = match Action::try_from(action) {
2172 Ok(action) => action,
2173 Err(_) => return -EINVAL,
2174 };
2175
2176 esyd(format!("{action}/readlink"), glob, b'-')
2178}
2179
2180#[no_mangle]
2184pub extern "C" fn syd_readlink_rem(action: action_t, glob: *const c_char) -> c_int {
2185 let action = match Action::try_from(action) {
2187 Ok(action) => action,
2188 Err(_) => return -EINVAL,
2189 };
2190
2191 esyd(format!("{action}/readlink"), glob, b'^')
2193}
2194
2195#[no_mangle]
2199pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
2200 let action = match Action::try_from(action) {
2202 Ok(action) => action,
2203 Err(_) => return -EINVAL,
2204 };
2205
2206 esyd(format!("{action}/symlink"), glob, b'+')
2208}
2209
2210#[no_mangle]
2215pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
2216 let action = match Action::try_from(action) {
2218 Ok(action) => action,
2219 Err(_) => return -EINVAL,
2220 };
2221
2222 esyd(format!("{action}/symlink"), glob, b'-')
2224}
2225
2226#[no_mangle]
2230pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
2231 let action = match Action::try_from(action) {
2233 Ok(action) => action,
2234 Err(_) => return -EINVAL,
2235 };
2236
2237 esyd(format!("{action}/symlink"), glob, b'^')
2239}
2240
2241#[no_mangle]
2245pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
2246 let action = match Action::try_from(action) {
2248 Ok(action) => action,
2249 Err(_) => return -EINVAL,
2250 };
2251
2252 esyd(format!("{action}/truncate"), glob, b'+')
2254}
2255
2256#[no_mangle]
2261pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
2262 let action = match Action::try_from(action) {
2264 Ok(action) => action,
2265 Err(_) => return -EINVAL,
2266 };
2267
2268 esyd(format!("{action}/truncate"), glob, b'-')
2270}
2271
2272#[no_mangle]
2276pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
2277 let action = match Action::try_from(action) {
2279 Ok(action) => action,
2280 Err(_) => return -EINVAL,
2281 };
2282
2283 esyd(format!("{action}/truncate"), glob, b'^')
2285}
2286
2287#[no_mangle]
2291pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
2292 let action = match Action::try_from(action) {
2294 Ok(action) => action,
2295 Err(_) => return -EINVAL,
2296 };
2297
2298 esyd(format!("{action}/chdir"), glob, b'+')
2300}
2301
2302#[no_mangle]
2307pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
2308 let action = match Action::try_from(action) {
2310 Ok(action) => action,
2311 Err(_) => return -EINVAL,
2312 };
2313
2314 esyd(format!("{action}/chdir"), glob, b'-')
2316}
2317
2318#[no_mangle]
2322pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
2323 let action = match Action::try_from(action) {
2325 Ok(action) => action,
2326 Err(_) => return -EINVAL,
2327 };
2328
2329 esyd(format!("{action}/chdir"), glob, b'^')
2331}
2332
2333#[no_mangle]
2337pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
2338 let action = match Action::try_from(action) {
2340 Ok(action) => action,
2341 Err(_) => return -EINVAL,
2342 };
2343
2344 esyd(format!("{action}/readdir"), glob, b'+')
2346}
2347
2348#[no_mangle]
2353pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
2354 let action = match Action::try_from(action) {
2356 Ok(action) => action,
2357 Err(_) => return -EINVAL,
2358 };
2359
2360 esyd(format!("{action}/readdir"), glob, b'-')
2362}
2363
2364#[no_mangle]
2368pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
2369 let action = match Action::try_from(action) {
2371 Ok(action) => action,
2372 Err(_) => return -EINVAL,
2373 };
2374
2375 esyd(format!("{action}/readdir"), glob, b'^')
2377}
2378
2379#[no_mangle]
2383pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
2384 let action = match Action::try_from(action) {
2386 Ok(action) => action,
2387 Err(_) => return -EINVAL,
2388 };
2389
2390 esyd(format!("{action}/mkdir"), glob, b'+')
2392}
2393
2394#[no_mangle]
2399pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
2400 let action = match Action::try_from(action) {
2402 Ok(action) => action,
2403 Err(_) => return -EINVAL,
2404 };
2405
2406 esyd(format!("{action}/mkdir"), glob, b'-')
2408}
2409
2410#[no_mangle]
2414pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2415 let action = match Action::try_from(action) {
2417 Ok(action) => action,
2418 Err(_) => return -EINVAL,
2419 };
2420
2421 esyd(format!("{action}/mkdir"), glob, b'^')
2423}
2424
2425#[no_mangle]
2429pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
2430 let action = match Action::try_from(action) {
2432 Ok(action) => action,
2433 Err(_) => return -EINVAL,
2434 };
2435
2436 esyd(format!("{action}/rmdir"), glob, b'+')
2438}
2439
2440#[no_mangle]
2445pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
2446 let action = match Action::try_from(action) {
2448 Ok(action) => action,
2449 Err(_) => return -EINVAL,
2450 };
2451
2452 esyd(format!("{action}/rmdir"), glob, b'-')
2454}
2455
2456#[no_mangle]
2460pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
2461 let action = match Action::try_from(action) {
2463 Ok(action) => action,
2464 Err(_) => return -EINVAL,
2465 };
2466
2467 esyd(format!("{action}/rmdir"), glob, b'^')
2469}
2470
2471#[no_mangle]
2475pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2476 let action = match Action::try_from(action) {
2478 Ok(action) => action,
2479 Err(_) => return -EINVAL,
2480 };
2481
2482 esyd(format!("{action}/chown"), glob, b'+')
2484}
2485
2486#[no_mangle]
2491pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2492 let action = match Action::try_from(action) {
2494 Ok(action) => action,
2495 Err(_) => return -EINVAL,
2496 };
2497
2498 esyd(format!("{action}/chown"), glob, b'-')
2500}
2501
2502#[no_mangle]
2506pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2507 let action = match Action::try_from(action) {
2509 Ok(action) => action,
2510 Err(_) => return -EINVAL,
2511 };
2512
2513 esyd(format!("{action}/chown"), glob, b'^')
2515}
2516
2517#[no_mangle]
2521pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2522 let action = match Action::try_from(action) {
2524 Ok(action) => action,
2525 Err(_) => return -EINVAL,
2526 };
2527
2528 esyd(format!("{action}/chgrp"), glob, b'+')
2530}
2531
2532#[no_mangle]
2537pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2538 let action = match Action::try_from(action) {
2540 Ok(action) => action,
2541 Err(_) => return -EINVAL,
2542 };
2543
2544 esyd(format!("{action}/chgrp"), glob, b'-')
2546}
2547
2548#[no_mangle]
2552pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2553 let action = match Action::try_from(action) {
2555 Ok(action) => action,
2556 Err(_) => return -EINVAL,
2557 };
2558
2559 esyd(format!("{action}/chgrp"), glob, b'^')
2561}
2562
2563#[no_mangle]
2567pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2568 let action = match Action::try_from(action) {
2570 Ok(action) => action,
2571 Err(_) => return -EINVAL,
2572 };
2573
2574 esyd(format!("{action}/chmod"), glob, b'+')
2576}
2577
2578#[no_mangle]
2583pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2584 let action = match Action::try_from(action) {
2586 Ok(action) => action,
2587 Err(_) => return -EINVAL,
2588 };
2589
2590 esyd(format!("{action}/chmod"), glob, b'-')
2592}
2593
2594#[no_mangle]
2598pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2599 let action = match Action::try_from(action) {
2601 Ok(action) => action,
2602 Err(_) => return -EINVAL,
2603 };
2604
2605 esyd(format!("{action}/chmod"), glob, b'^')
2607}
2608
2609#[no_mangle]
2613pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2614 let action = match Action::try_from(action) {
2616 Ok(action) => action,
2617 Err(_) => return -EINVAL,
2618 };
2619
2620 esyd(format!("{action}/chattr"), glob, b'+')
2622}
2623
2624#[no_mangle]
2629pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2630 let action = match Action::try_from(action) {
2632 Ok(action) => action,
2633 Err(_) => return -EINVAL,
2634 };
2635
2636 esyd(format!("{action}/chattr"), glob, b'-')
2638}
2639
2640#[no_mangle]
2644pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2645 let action = match Action::try_from(action) {
2647 Ok(action) => action,
2648 Err(_) => return -EINVAL,
2649 };
2650
2651 esyd(format!("{action}/chattr"), glob, b'^')
2653}
2654
2655#[no_mangle]
2659pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2660 let action = match Action::try_from(action) {
2662 Ok(action) => action,
2663 Err(_) => return -EINVAL,
2664 };
2665
2666 esyd(format!("{action}/chroot"), glob, b'+')
2668}
2669
2670#[no_mangle]
2675pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2676 let action = match Action::try_from(action) {
2678 Ok(action) => action,
2679 Err(_) => return -EINVAL,
2680 };
2681
2682 esyd(format!("{action}/chroot"), glob, b'-')
2684}
2685
2686#[no_mangle]
2690pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2691 let action = match Action::try_from(action) {
2693 Ok(action) => action,
2694 Err(_) => return -EINVAL,
2695 };
2696
2697 esyd(format!("{action}/chroot"), glob, b'^')
2699}
2700
2701#[no_mangle]
2705pub extern "C" fn syd_notify_add(action: action_t, glob: *const c_char) -> c_int {
2706 let action = match Action::try_from(action) {
2708 Ok(action) => action,
2709 Err(_) => return -EINVAL,
2710 };
2711
2712 esyd(format!("{action}/notify"), glob, b'+')
2714}
2715
2716#[no_mangle]
2721pub extern "C" fn syd_notify_del(action: action_t, glob: *const c_char) -> c_int {
2722 let action = match Action::try_from(action) {
2724 Ok(action) => action,
2725 Err(_) => return -EINVAL,
2726 };
2727
2728 esyd(format!("{action}/notify"), glob, b'-')
2730}
2731
2732#[no_mangle]
2736pub extern "C" fn syd_notify_rem(action: action_t, glob: *const c_char) -> c_int {
2737 let action = match Action::try_from(action) {
2739 Ok(action) => action,
2740 Err(_) => return -EINVAL,
2741 };
2742
2743 esyd(format!("{action}/notify"), glob, b'^')
2745}
2746
2747#[no_mangle]
2751pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2752 let action = match Action::try_from(action) {
2754 Ok(action) => action,
2755 Err(_) => return -EINVAL,
2756 };
2757
2758 esyd(format!("{action}/utime"), glob, b'+')
2760}
2761
2762#[no_mangle]
2767pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2768 let action = match Action::try_from(action) {
2770 Ok(action) => action,
2771 Err(_) => return -EINVAL,
2772 };
2773
2774 esyd(format!("{action}/utime"), glob, b'-')
2776}
2777
2778#[no_mangle]
2782pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2783 let action = match Action::try_from(action) {
2785 Ok(action) => action,
2786 Err(_) => return -EINVAL,
2787 };
2788
2789 esyd(format!("{action}/utime"), glob, b'^')
2791}
2792
2793#[no_mangle]
2797pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
2798 let action = match Action::try_from(action) {
2800 Ok(action) => action,
2801 Err(_) => return -EINVAL,
2802 };
2803
2804 esyd(format!("{action}/mkbdev"), glob, b'+')
2806}
2807
2808#[no_mangle]
2813pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
2814 let action = match Action::try_from(action) {
2816 Ok(action) => action,
2817 Err(_) => return -EINVAL,
2818 };
2819
2820 esyd(format!("{action}/mkbdev"), glob, b'-')
2822}
2823
2824#[no_mangle]
2828pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
2829 let action = match Action::try_from(action) {
2831 Ok(action) => action,
2832 Err(_) => return -EINVAL,
2833 };
2834
2835 esyd(format!("{action}/mkbdev"), glob, b'^')
2837}
2838
2839#[no_mangle]
2843pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
2844 let action = match Action::try_from(action) {
2846 Ok(action) => action,
2847 Err(_) => return -EINVAL,
2848 };
2849
2850 esyd(format!("{action}/mkcdev"), glob, b'+')
2852}
2853
2854#[no_mangle]
2859pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
2860 let action = match Action::try_from(action) {
2862 Ok(action) => action,
2863 Err(_) => return -EINVAL,
2864 };
2865
2866 esyd(format!("{action}/mkcdev"), glob, b'-')
2868}
2869
2870#[no_mangle]
2874pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
2875 let action = match Action::try_from(action) {
2877 Ok(action) => action,
2878 Err(_) => return -EINVAL,
2879 };
2880
2881 esyd(format!("{action}/mkcdev"), glob, b'^')
2883}
2884
2885#[no_mangle]
2889pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2890 let action = match Action::try_from(action) {
2892 Ok(action) => action,
2893 Err(_) => return -EINVAL,
2894 };
2895
2896 esyd(format!("{action}/mkfifo"), glob, b'+')
2898}
2899
2900#[no_mangle]
2905pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2906 let action = match Action::try_from(action) {
2908 Ok(action) => action,
2909 Err(_) => return -EINVAL,
2910 };
2911
2912 esyd(format!("{action}/mkfifo"), glob, b'-')
2914}
2915
2916#[no_mangle]
2920pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2921 let action = match Action::try_from(action) {
2923 Ok(action) => action,
2924 Err(_) => return -EINVAL,
2925 };
2926
2927 esyd(format!("{action}/mkfifo"), glob, b'^')
2929}
2930
2931#[no_mangle]
2935pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2936 let action = match Action::try_from(action) {
2938 Ok(action) => action,
2939 Err(_) => return -EINVAL,
2940 };
2941
2942 esyd(format!("{action}/mktemp"), glob, b'+')
2944}
2945
2946#[no_mangle]
2951pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2952 let action = match Action::try_from(action) {
2954 Ok(action) => action,
2955 Err(_) => return -EINVAL,
2956 };
2957
2958 esyd(format!("{action}/mktemp"), glob, b'-')
2960}
2961
2962#[no_mangle]
2966pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2967 let action = match Action::try_from(action) {
2969 Ok(action) => action,
2970 Err(_) => return -EINVAL,
2971 };
2972
2973 esyd(format!("{action}/mktemp"), glob, b'^')
2975}
2976
2977#[no_mangle]
2981pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2982 let action = match Action::try_from(action) {
2984 Ok(action) => action,
2985 Err(_) => return -EINVAL,
2986 };
2987
2988 esyd(format!("{action}/net/bind"), glob, b'+')
2990}
2991
2992#[no_mangle]
2997pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2998 let action = match Action::try_from(action) {
3000 Ok(action) => action,
3001 Err(_) => return -EINVAL,
3002 };
3003
3004 esyd(format!("{action}/net/bind"), glob, b'-')
3006}
3007
3008#[no_mangle]
3012pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
3013 let action = match Action::try_from(action) {
3015 Ok(action) => action,
3016 Err(_) => return -EINVAL,
3017 };
3018
3019 esyd(format!("{action}/net/bind"), glob, b'^')
3021}
3022
3023#[no_mangle]
3027pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
3028 let action = match Action::try_from(action) {
3030 Ok(action) => action,
3031 Err(_) => return -EINVAL,
3032 };
3033
3034 esyd(format!("{action}/net/connect"), glob, b'+')
3036}
3037
3038#[no_mangle]
3043pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
3044 let action = match Action::try_from(action) {
3046 Ok(action) => action,
3047 Err(_) => return -EINVAL,
3048 };
3049
3050 esyd(format!("{action}/net/connect"), glob, b'-')
3052}
3053
3054#[no_mangle]
3058pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
3059 let action = match Action::try_from(action) {
3061 Ok(action) => action,
3062 Err(_) => return -EINVAL,
3063 };
3064
3065 esyd(format!("{action}/net/connect"), glob, b'^')
3067}
3068
3069#[no_mangle]
3073pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
3074 let action = match Action::try_from(action) {
3076 Ok(action) => action,
3077 Err(_) => return -EINVAL,
3078 };
3079
3080 esyd(format!("{action}/net/sendfd"), glob, b'+')
3082}
3083
3084#[no_mangle]
3089pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
3090 let action = match Action::try_from(action) {
3092 Ok(action) => action,
3093 Err(_) => return -EINVAL,
3094 };
3095
3096 esyd(format!("{action}/net/sendfd"), glob, b'-')
3098}
3099
3100#[no_mangle]
3104pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
3105 let action = match Action::try_from(action) {
3107 Ok(action) => action,
3108 Err(_) => return -EINVAL,
3109 };
3110
3111 esyd(format!("{action}/net/sendfd"), glob, b'^')
3113}
3114
3115#[no_mangle]
3119pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
3120 let action = match Action::try_from(action) {
3122 Ok(action) => action,
3123 Err(_) => return -EINVAL,
3124 };
3125
3126 esyd(format!("{action}/net/link"), family, b'+')
3128}
3129
3130#[no_mangle]
3135pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
3136 let action = match Action::try_from(action) {
3138 Ok(action) => action,
3139 Err(_) => return -EINVAL,
3140 };
3141
3142 esyd(format!("{action}/net/link"), family, b'-')
3144}
3145
3146#[no_mangle]
3150pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
3151 let action = match Action::try_from(action) {
3153 Ok(action) => action,
3154 Err(_) => return -EINVAL,
3155 };
3156
3157 esyd(format!("{action}/net/link"), family, b'^')
3159}
3160
3161#[no_mangle]
3167pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
3168 esyd("mem/max", size, b':')
3169}
3170
3171#[no_mangle]
3177pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
3178 esyd("mem/vm_max", size, b':')
3179}
3180
3181#[no_mangle]
3185pub extern "C" fn syd_pid_max(size: usize) -> c_int {
3186 stat(format!("/dev/syd/pid/max:{size}"))
3187}
3188
3189#[no_mangle]
3194pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
3195 stat(format!("/dev/syd/segvguard/expiry:{timeout}"))
3196}
3197
3198#[no_mangle]
3202pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
3203 stat(format!("/dev/syd/segvguard/suspension:{timeout}"))
3204}
3205
3206#[no_mangle]
3210pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
3211 stat(format!("/dev/syd/segvguard/maxcrashes:{max}"))
3212}
3213
3214#[no_mangle]
3240pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
3241 if file.is_null() || argv.is_null() {
3242 return -EFAULT;
3243 }
3244
3245 let file = CStr::from_ptr(file);
3247 let file = OsStr::from_bytes(file.to_bytes());
3248
3249 let mut path = OsString::from("/dev/syd/cmd/exec!");
3250 path.push(file);
3251
3252 let mut idx: isize = 0;
3253 while !(*argv.offset(idx)).is_null() {
3254 let arg = CStr::from_ptr(*argv.offset(idx));
3256 let arg = OsStr::from_bytes(arg.to_bytes());
3257
3258 path.push(OsStr::from_bytes(b"\x1F")); path.push(arg);
3260
3261 idx = idx.saturating_add(1);
3262 }
3263
3264 let path = PathBuf::from(path);
3265 stat(path)
3266}