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: &'static 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_stat() -> bool {
426 stat("/dev/syd/sandbox/stat?") == 0
427}
428
429#[no_mangle]
433pub extern "C" fn syd_enable_stat() -> c_int {
434 stat("/dev/syd/sandbox/stat:on")
435}
436
437#[no_mangle]
441pub extern "C" fn syd_disable_stat() -> c_int {
442 stat("/dev/syd/sandbox/stat:off")
443}
444
445#[no_mangle]
449pub extern "C" fn syd_enabled_read() -> bool {
450 stat("/dev/syd/sandbox/read?") == 0
451}
452
453#[no_mangle]
457pub extern "C" fn syd_enable_read() -> c_int {
458 stat("/dev/syd/sandbox/read:on")
459}
460
461#[no_mangle]
465pub extern "C" fn syd_disable_read() -> c_int {
466 stat("/dev/syd/sandbox/read:off")
467}
468
469#[no_mangle]
473pub extern "C" fn syd_enabled_write() -> bool {
474 stat("/dev/syd/sandbox/write?") == 0
475}
476
477#[no_mangle]
481pub extern "C" fn syd_enable_write() -> c_int {
482 stat("/dev/syd/sandbox/write:on")
483}
484
485#[no_mangle]
489pub extern "C" fn syd_disable_write() -> c_int {
490 stat("/dev/syd/sandbox/write:off")
491}
492
493#[no_mangle]
497pub extern "C" fn syd_enabled_exec() -> bool {
498 stat("/dev/syd/sandbox/exec?") == 0
499}
500
501#[no_mangle]
505pub extern "C" fn syd_enable_exec() -> c_int {
506 stat("/dev/syd/sandbox/exec:on")
507}
508
509#[no_mangle]
513pub extern "C" fn syd_disable_exec() -> c_int {
514 stat("/dev/syd/sandbox/exec:off")
515}
516
517#[no_mangle]
521pub extern "C" fn syd_enabled_ioctl() -> bool {
522 stat("/dev/syd/sandbox/ioctl?") == 0
523}
524
525#[no_mangle]
529pub extern "C" fn syd_enable_ioctl() -> c_int {
530 stat("/dev/syd/sandbox/ioctl:on")
531}
532
533#[no_mangle]
537pub extern "C" fn syd_disable_ioctl() -> c_int {
538 stat("/dev/syd/sandbox/ioctl:off")
539}
540
541#[no_mangle]
545pub extern "C" fn syd_enabled_create() -> bool {
546 stat("/dev/syd/sandbox/create?") == 0
547}
548
549#[no_mangle]
553pub extern "C" fn syd_enable_create() -> c_int {
554 stat("/dev/syd/sandbox/create:on")
555}
556
557#[no_mangle]
561pub extern "C" fn syd_disable_create() -> c_int {
562 stat("/dev/syd/sandbox/create:off")
563}
564
565#[no_mangle]
569pub extern "C" fn syd_enabled_delete() -> bool {
570 stat("/dev/syd/sandbox/delete?") == 0
571}
572
573#[no_mangle]
577pub extern "C" fn syd_enable_delete() -> c_int {
578 stat("/dev/syd/sandbox/delete:on")
579}
580
581#[no_mangle]
585pub extern "C" fn syd_disable_delete() -> c_int {
586 stat("/dev/syd/sandbox/delete:off")
587}
588
589#[no_mangle]
593pub extern "C" fn syd_enabled_rename() -> bool {
594 stat("/dev/syd/sandbox/rename?") == 0
595}
596
597#[no_mangle]
601pub extern "C" fn syd_enable_rename() -> c_int {
602 stat("/dev/syd/sandbox/rename:on")
603}
604
605#[no_mangle]
609pub extern "C" fn syd_disable_rename() -> c_int {
610 stat("/dev/syd/sandbox/rename:off")
611}
612
613#[no_mangle]
617pub extern "C" fn syd_enabled_symlink() -> bool {
618 stat("/dev/syd/sandbox/symlink?") == 0
619}
620
621#[no_mangle]
625pub extern "C" fn syd_enable_symlink() -> c_int {
626 stat("/dev/syd/sandbox/symlink:on")
627}
628
629#[no_mangle]
633pub extern "C" fn syd_disable_symlink() -> c_int {
634 stat("/dev/syd/sandbox/symlink:off")
635}
636
637#[no_mangle]
641pub extern "C" fn syd_enabled_truncate() -> bool {
642 stat("/dev/syd/sandbox/truncate?") == 0
643}
644
645#[no_mangle]
649pub extern "C" fn syd_enable_truncate() -> c_int {
650 stat("/dev/syd/sandbox/truncate:on")
651}
652
653#[no_mangle]
657pub extern "C" fn syd_disable_truncate() -> c_int {
658 stat("/dev/syd/sandbox/truncate:off")
659}
660
661#[no_mangle]
665pub extern "C" fn syd_enabled_chdir() -> bool {
666 stat("/dev/syd/sandbox/chdir?") == 0
667}
668
669#[no_mangle]
673pub extern "C" fn syd_enable_chdir() -> c_int {
674 stat("/dev/syd/sandbox/chdir:on")
675}
676
677#[no_mangle]
681pub extern "C" fn syd_disable_chdir() -> c_int {
682 stat("/dev/syd/sandbox/chdir:off")
683}
684
685#[no_mangle]
689pub extern "C" fn syd_enabled_readdir() -> bool {
690 stat("/dev/syd/sandbox/readdir?") == 0
691}
692
693#[no_mangle]
697pub extern "C" fn syd_enable_readdir() -> c_int {
698 stat("/dev/syd/sandbox/readdir:on")
699}
700
701#[no_mangle]
705pub extern "C" fn syd_disable_readdir() -> c_int {
706 stat("/dev/syd/sandbox/readdir:off")
707}
708
709#[no_mangle]
713pub extern "C" fn syd_enabled_mkdir() -> bool {
714 stat("/dev/syd/sandbox/mkdir?") == 0
715}
716
717#[no_mangle]
721pub extern "C" fn syd_enable_mkdir() -> c_int {
722 stat("/dev/syd/sandbox/mkdir:on")
723}
724
725#[no_mangle]
729pub extern "C" fn syd_disable_mkdir() -> c_int {
730 stat("/dev/syd/sandbox/mkdir:off")
731}
732
733#[no_mangle]
737pub extern "C" fn syd_enabled_rmdir() -> bool {
738 stat("/dev/syd/sandbox/rmdir?") == 0
739}
740
741#[no_mangle]
745pub extern "C" fn syd_enable_rmdir() -> c_int {
746 stat("/dev/syd/sandbox/rmdir:on")
747}
748
749#[no_mangle]
753pub extern "C" fn syd_disable_rmdir() -> c_int {
754 stat("/dev/syd/sandbox/rmdir:off")
755}
756
757#[no_mangle]
761pub extern "C" fn syd_enabled_chown() -> bool {
762 stat("/dev/syd/sandbox/chown?") == 0
763}
764
765#[no_mangle]
769pub extern "C" fn syd_enable_chown() -> c_int {
770 stat("/dev/syd/sandbox/chown:on")
771}
772
773#[no_mangle]
777pub extern "C" fn syd_disable_chown() -> c_int {
778 stat("/dev/syd/sandbox/chown:off")
779}
780
781#[no_mangle]
785pub extern "C" fn syd_enabled_chgrp() -> bool {
786 stat("/dev/syd/sandbox/chgrp?") == 0
787}
788
789#[no_mangle]
793pub extern "C" fn syd_enable_chgrp() -> c_int {
794 stat("/dev/syd/sandbox/chgrp:on")
795}
796
797#[no_mangle]
801pub extern "C" fn syd_disable_chgrp() -> c_int {
802 stat("/dev/syd/sandbox/chgrp:off")
803}
804
805#[no_mangle]
809pub extern "C" fn syd_enabled_chmod() -> bool {
810 stat("/dev/syd/sandbox/chmod?") == 0
811}
812
813#[no_mangle]
817pub extern "C" fn syd_enable_chmod() -> c_int {
818 stat("/dev/syd/sandbox/chmod:on")
819}
820
821#[no_mangle]
825pub extern "C" fn syd_disable_chmod() -> c_int {
826 stat("/dev/syd/sandbox/chmod:off")
827}
828
829#[no_mangle]
833pub extern "C" fn syd_enabled_chattr() -> bool {
834 stat("/dev/syd/sandbox/chattr?") == 0
835}
836
837#[no_mangle]
841pub extern "C" fn syd_enable_chattr() -> c_int {
842 stat("/dev/syd/sandbox/chattr:on")
843}
844
845#[no_mangle]
849pub extern "C" fn syd_disable_chattr() -> c_int {
850 stat("/dev/syd/sandbox/chattr:off")
851}
852
853#[no_mangle]
857pub extern "C" fn syd_enabled_chroot() -> bool {
858 stat("/dev/syd/sandbox/chroot?") == 0
859}
860
861#[no_mangle]
865pub extern "C" fn syd_enable_chroot() -> c_int {
866 stat("/dev/syd/sandbox/chroot:on")
867}
868
869#[no_mangle]
873pub extern "C" fn syd_disable_chroot() -> c_int {
874 stat("/dev/syd/sandbox/chroot:off")
875}
876
877#[no_mangle]
881pub extern "C" fn syd_enabled_notify() -> bool {
882 stat("/dev/syd/sandbox/notify?") == 0
883}
884
885#[no_mangle]
889pub extern "C" fn syd_enable_notify() -> c_int {
890 stat("/dev/syd/sandbox/notify:on")
891}
892
893#[no_mangle]
897pub extern "C" fn syd_disable_notify() -> c_int {
898 stat("/dev/syd/sandbox/notify:off")
899}
900
901#[no_mangle]
905pub extern "C" fn syd_enabled_utime() -> bool {
906 stat("/dev/syd/sandbox/utime?") == 0
907}
908
909#[no_mangle]
913pub extern "C" fn syd_enable_utime() -> c_int {
914 stat("/dev/syd/sandbox/utime:on")
915}
916
917#[no_mangle]
921pub extern "C" fn syd_disable_utime() -> c_int {
922 stat("/dev/syd/sandbox/utime:off")
923}
924
925#[no_mangle]
929pub extern "C" fn syd_enabled_mkbdev() -> bool {
930 stat("/dev/syd/sandbox/mkbdev?") == 0
931}
932
933#[no_mangle]
937pub extern "C" fn syd_enable_mkbdev() -> c_int {
938 stat("/dev/syd/sandbox/mkbdev:on")
939}
940
941#[no_mangle]
945pub extern "C" fn syd_disable_mkbdev() -> c_int {
946 stat("/dev/syd/sandbox/mkbdev:off")
947}
948
949#[no_mangle]
953pub extern "C" fn syd_enabled_mkcdev() -> bool {
954 stat("/dev/syd/sandbox/mkcdev?") == 0
955}
956
957#[no_mangle]
961pub extern "C" fn syd_enable_mkcdev() -> c_int {
962 stat("/dev/syd/sandbox/mkcdev:on")
963}
964
965#[no_mangle]
969pub extern "C" fn syd_disable_mkcdev() -> c_int {
970 stat("/dev/syd/sandbox/mkcdev:off")
971}
972
973#[no_mangle]
977pub extern "C" fn syd_enabled_mkfifo() -> bool {
978 stat("/dev/syd/sandbox/mkfifo?") == 0
979}
980
981#[no_mangle]
985pub extern "C" fn syd_enable_mkfifo() -> c_int {
986 stat("/dev/syd/sandbox/mkfifo:on")
987}
988
989#[no_mangle]
993pub extern "C" fn syd_disable_mkfifo() -> c_int {
994 stat("/dev/syd/sandbox/mkfifo:off")
995}
996
997#[no_mangle]
1001pub extern "C" fn syd_enabled_mktemp() -> bool {
1002 stat("/dev/syd/sandbox/mktemp?") == 0
1003}
1004
1005#[no_mangle]
1009pub extern "C" fn syd_enable_mktemp() -> c_int {
1010 stat("/dev/syd/sandbox/mktemp:on")
1011}
1012
1013#[no_mangle]
1017pub extern "C" fn syd_disable_mktemp() -> c_int {
1018 stat("/dev/syd/sandbox/mktemp:off")
1019}
1020
1021#[no_mangle]
1025pub extern "C" fn syd_enabled_net() -> bool {
1026 stat("/dev/syd/sandbox/net?") == 0
1027}
1028
1029#[no_mangle]
1033pub extern "C" fn syd_enable_net() -> c_int {
1034 stat("/dev/syd/sandbox/net:on")
1035}
1036
1037#[no_mangle]
1041pub extern "C" fn syd_disable_net() -> c_int {
1042 stat("/dev/syd/sandbox/net:off")
1043}
1044
1045#[no_mangle]
1049pub extern "C" fn syd_enabled_mem() -> bool {
1050 stat("/dev/syd/sandbox/mem?") == 0
1051}
1052
1053#[no_mangle]
1057pub extern "C" fn syd_disable_mem() -> c_int {
1058 stat("/dev/syd/sandbox/mem:off")
1059}
1060
1061#[no_mangle]
1065pub extern "C" fn syd_enabled_pid() -> bool {
1066 stat("/dev/syd/sandbox/pid?") == 0
1067}
1068
1069#[no_mangle]
1073pub extern "C" fn syd_enable_pid() -> c_int {
1074 stat("/dev/syd/sandbox/pid:on")
1075}
1076
1077#[no_mangle]
1081pub extern "C" fn syd_disable_pid() -> c_int {
1082 stat("/dev/syd/sandbox/pid:off")
1083}
1084
1085#[no_mangle]
1089pub extern "C" fn syd_enabled_lock() -> bool {
1090 stat("/dev/syd/sandbox/lock?") == 0
1091}
1092
1093#[no_mangle]
1097pub extern "C" fn syd_enabled_crypt() -> bool {
1098 stat("/dev/syd/sandbox/crypt?") == 0
1099}
1100
1101#[no_mangle]
1105pub extern "C" fn syd_enabled_proxy() -> bool {
1106 stat("/dev/syd/sandbox/proxy?") == 0
1107}
1108
1109#[no_mangle]
1113pub extern "C" fn syd_enabled_force() -> bool {
1114 stat("/dev/syd/sandbox/force?") == 0
1115}
1116
1117#[no_mangle]
1121pub extern "C" fn syd_disable_force() -> c_int {
1122 stat("/dev/syd/sandbox/force:off")
1123}
1124
1125#[no_mangle]
1129pub extern "C" fn syd_enabled_tpe() -> bool {
1130 stat("/dev/syd/sandbox/tpe?") == 0
1131}
1132
1133#[no_mangle]
1137pub extern "C" fn syd_enable_tpe() -> c_int {
1138 stat("/dev/syd/sandbox/tpe:on")
1139}
1140
1141#[no_mangle]
1145pub extern "C" fn syd_disable_tpe() -> c_int {
1146 stat("/dev/syd/sandbox/tpe:off")
1147}
1148
1149#[no_mangle]
1151pub extern "C" fn syd_default_fs(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/fs:{action}"))
1158}
1159
1160#[no_mangle]
1162pub extern "C" fn syd_default_walk(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/walk:{action}"))
1169}
1170
1171#[no_mangle]
1173pub extern "C" fn syd_default_stat(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/stat:{action}"))
1180}
1181
1182#[no_mangle]
1184pub extern "C" fn syd_default_read(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/read:{action}"))
1191}
1192
1193#[no_mangle]
1195pub extern "C" fn syd_default_write(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/write:{action}"))
1202}
1203
1204#[no_mangle]
1206pub extern "C" fn syd_default_exec(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/exec:{action}"))
1213}
1214
1215#[no_mangle]
1217pub extern "C" fn syd_default_ioctl(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/ioctl:{action}"))
1224}
1225
1226#[no_mangle]
1228pub extern "C" fn syd_default_create(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/create:{action}"))
1235}
1236
1237#[no_mangle]
1239pub extern "C" fn syd_default_delete(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/delete:{action}"))
1246}
1247
1248#[no_mangle]
1250pub extern "C" fn syd_default_rename(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/rename:{action}"))
1257}
1258
1259#[no_mangle]
1261pub extern "C" fn syd_default_symlink(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/symlink:{action}"))
1268}
1269
1270#[no_mangle]
1272pub extern "C" fn syd_default_truncate(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/truncate:{action}"))
1279}
1280
1281#[no_mangle]
1283pub extern "C" fn syd_default_chdir(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/chdir:{action}"))
1290}
1291
1292#[no_mangle]
1294pub extern "C" fn syd_default_readdir(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/readdir:{action}"))
1301}
1302
1303#[no_mangle]
1305pub extern "C" fn syd_default_mkdir(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/mkdir:{action}"))
1312}
1313
1314#[no_mangle]
1316pub extern "C" fn syd_default_rmdir(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/rmdir:{action}"))
1323}
1324
1325#[no_mangle]
1327pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1328 let action = match Action::try_from(action) {
1330 Ok(action) => action,
1331 Err(_) => return -EINVAL,
1332 };
1333 stat(&format!("/dev/syd/default/chown:{action}"))
1334}
1335
1336#[no_mangle]
1338pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1339 let action = match Action::try_from(action) {
1341 Ok(action) => action,
1342 Err(_) => return -EINVAL,
1343 };
1344 stat(&format!("/dev/syd/default/chgrp:{action}"))
1345}
1346
1347#[no_mangle]
1349pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1350 let action = match Action::try_from(action) {
1352 Ok(action) => action,
1353 Err(_) => return -EINVAL,
1354 };
1355 stat(&format!("/dev/syd/default/chmod:{action}"))
1356}
1357
1358#[no_mangle]
1360pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1361 let action = match Action::try_from(action) {
1363 Ok(action) => action,
1364 Err(_) => return -EINVAL,
1365 };
1366 stat(&format!("/dev/syd/default/chattr:{action}"))
1367}
1368
1369#[no_mangle]
1371pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1372 let action = match Action::try_from(action) {
1374 Ok(action) => action,
1375 Err(_) => return -EINVAL,
1376 };
1377 stat(&format!("/dev/syd/default/chroot:{action}"))
1378}
1379
1380#[no_mangle]
1382pub extern "C" fn syd_default_notify(action: action_t) -> c_int {
1383 let action = match Action::try_from(action) {
1385 Ok(action) => action,
1386 Err(_) => return -EINVAL,
1387 };
1388 stat(&format!("/dev/syd/default/notify:{action}"))
1389}
1390
1391#[no_mangle]
1393pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1394 let action = match Action::try_from(action) {
1396 Ok(action) => action,
1397 Err(_) => return -EINVAL,
1398 };
1399 stat(&format!("/dev/syd/default/utime:{action}"))
1400}
1401
1402#[no_mangle]
1404pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
1405 let action = match Action::try_from(action) {
1407 Ok(action) => action,
1408 Err(_) => return -EINVAL,
1409 };
1410 stat(&format!("/dev/syd/default/mkbdev:{action}"))
1411}
1412
1413#[no_mangle]
1415pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
1416 let action = match Action::try_from(action) {
1418 Ok(action) => action,
1419 Err(_) => return -EINVAL,
1420 };
1421 stat(&format!("/dev/syd/default/mkcdev:{action}"))
1422}
1423
1424#[no_mangle]
1426pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1427 let action = match Action::try_from(action) {
1429 Ok(action) => action,
1430 Err(_) => return -EINVAL,
1431 };
1432 stat(&format!("/dev/syd/default/mkfifo:{action}"))
1433}
1434
1435#[no_mangle]
1437pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1438 let action = match Action::try_from(action) {
1440 Ok(action) => action,
1441 Err(_) => return -EINVAL,
1442 };
1443 stat(&format!("/dev/syd/default/mktemp:{action}"))
1444}
1445
1446#[no_mangle]
1448pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1449 let action = match Action::try_from(action) {
1451 Ok(action) => action,
1452 Err(_) => return -EINVAL,
1453 };
1454 stat(&format!("/dev/syd/default/net:{action}"))
1455}
1456
1457#[no_mangle]
1459pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1460 let action = match Action::try_from(action) {
1462 Ok(action) => action,
1463 Err(_) => return -EINVAL,
1464 };
1465 stat(&format!("/dev/syd/default/block:{action}"))
1466}
1467
1468#[no_mangle]
1470pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1471 let action = match Action::try_from(action) {
1473 Ok(action) => action,
1474 Err(_) => return -EINVAL,
1475 };
1476 stat(&format!("/dev/syd/default/mem:{action}"))
1477}
1478
1479#[no_mangle]
1481pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1482 let action = match Action::try_from(action) {
1484 Ok(action) => action,
1485 Err(_) => return -EINVAL,
1486 };
1487 stat(&format!("/dev/syd/default/pid:{action}"))
1488}
1489
1490#[no_mangle]
1492pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1493 let action = match Action::try_from(action) {
1495 Ok(action) => action,
1496 Err(_) => return -EINVAL,
1497 };
1498 stat(&format!("/dev/syd/default/force:{action}"))
1499}
1500
1501#[no_mangle]
1503pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1504 let action = match Action::try_from(action) {
1506 Ok(action) => action,
1507 Err(_) => return -EINVAL,
1508 };
1509 stat(&format!("/dev/syd/default/segvguard:{action}"))
1510}
1511
1512#[no_mangle]
1514pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1515 let action = match Action::try_from(action) {
1517 Ok(action) => action,
1518 Err(_) => return -EINVAL,
1519 };
1520 stat(&format!("/dev/syd/default/tpe:{action}"))
1521}
1522
1523#[no_mangle]
1525pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1526 stat(&format!("/dev/syd/deny/ioctl+{request}"))
1527}
1528
1529#[no_mangle]
1546pub unsafe extern "C" fn syd_force_add(
1547 path: *const c_char,
1548 alg: *const c_char,
1549 hash: *const c_char,
1550 action: action_t,
1551) -> c_int {
1552 let action = match Action::try_from(action) {
1554 Ok(action) => action,
1555 Err(_) => return -EINVAL,
1556 };
1557
1558 if path.is_null() || alg.is_null() || hash.is_null() {
1559 return -EFAULT;
1560 }
1561
1562 let path = unsafe { CStr::from_ptr(path) };
1564 let alg = unsafe { CStr::from_ptr(alg) };
1566 let hash = unsafe { CStr::from_ptr(hash) };
1568 let path = match path.to_str() {
1569 Ok(s) => s,
1570 Err(_) => return -EINVAL,
1571 };
1572 let alg = match alg.to_str() {
1573 Ok(s) => s,
1574 Err(_) => return -EINVAL,
1575 };
1576 let hash = match hash.to_str() {
1577 Ok(s) => s,
1578 Err(_) => return -EINVAL,
1579 };
1580
1581 stat(format!("/dev/syd/force+{path}:{alg}:{hash}:{action}"))
1583}
1584
1585#[no_mangle]
1597pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1598 if path.is_null() {
1599 return -EFAULT;
1600 }
1601
1602 let path = unsafe { CStr::from_ptr(path) };
1604 let path = match path.to_str() {
1605 Ok(s) => s,
1606 Err(_) => return -EINVAL,
1607 };
1608
1609 stat(format!("/dev/syd/force-{path}"))
1611}
1612
1613#[no_mangle]
1615pub extern "C" fn syd_force_clr() -> c_int {
1616 stat("/dev/syd/force^")
1617}
1618
1619#[no_mangle]
1623pub extern "C" fn syd_fs_add(action: action_t, name: *const c_char) -> c_int {
1624 let action = match Action::try_from(action) {
1626 Ok(action) => action,
1627 Err(_) => return -EINVAL,
1628 };
1629
1630 esyd(&format!("{action}/fs"), name, b'+')
1632}
1633
1634#[no_mangle]
1639pub extern "C" fn syd_fs_del(action: action_t, name: *const c_char) -> c_int {
1640 let action = match Action::try_from(action) {
1642 Ok(action) => action,
1643 Err(_) => return -EINVAL,
1644 };
1645
1646 esyd(&format!("{action}/fs"), name, b'-')
1648}
1649
1650#[no_mangle]
1654pub extern "C" fn syd_fs_rem(action: action_t, name: *const c_char) -> c_int {
1655 let action = match Action::try_from(action) {
1657 Ok(action) => action,
1658 Err(_) => return -EINVAL,
1659 };
1660
1661 esyd(&format!("{action}/fs"), name, b'^')
1663}
1664
1665#[no_mangle]
1669pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
1670 let action = match Action::try_from(action) {
1672 Ok(action) => action,
1673 Err(_) => return -EINVAL,
1674 };
1675
1676 esyd(&format!("{action}/walk"), glob, b'+')
1678}
1679
1680#[no_mangle]
1685pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
1686 let action = match Action::try_from(action) {
1688 Ok(action) => action,
1689 Err(_) => return -EINVAL,
1690 };
1691
1692 esyd(&format!("{action}/walk"), glob, b'-')
1694}
1695
1696#[no_mangle]
1700pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
1701 let action = match Action::try_from(action) {
1703 Ok(action) => action,
1704 Err(_) => return -EINVAL,
1705 };
1706
1707 esyd(&format!("{action}/walk"), glob, b'^')
1709}
1710
1711#[no_mangle]
1715pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1716 let action = match Action::try_from(action) {
1718 Ok(action) => action,
1719 Err(_) => return -EINVAL,
1720 };
1721
1722 esyd(&format!("{action}/stat"), glob, b'+')
1724}
1725
1726#[no_mangle]
1731pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1732 let action = match Action::try_from(action) {
1734 Ok(action) => action,
1735 Err(_) => return -EINVAL,
1736 };
1737
1738 esyd(&format!("{action}/stat"), glob, b'-')
1740}
1741
1742#[no_mangle]
1746pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1747 let action = match Action::try_from(action) {
1749 Ok(action) => action,
1750 Err(_) => return -EINVAL,
1751 };
1752
1753 esyd(&format!("{action}/stat"), glob, b'^')
1755}
1756
1757#[no_mangle]
1761pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1762 let action = match Action::try_from(action) {
1764 Ok(action) => action,
1765 Err(_) => return -EINVAL,
1766 };
1767
1768 esyd(&format!("{action}/read"), glob, b'+')
1770}
1771
1772#[no_mangle]
1777pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1778 let action = match Action::try_from(action) {
1780 Ok(action) => action,
1781 Err(_) => return -EINVAL,
1782 };
1783
1784 esyd(&format!("{action}/read"), glob, b'-')
1786}
1787
1788#[no_mangle]
1792pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1793 let action = match Action::try_from(action) {
1795 Ok(action) => action,
1796 Err(_) => return -EINVAL,
1797 };
1798
1799 esyd(&format!("{action}/read"), glob, b'^')
1801}
1802
1803#[no_mangle]
1807pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1808 let action = match Action::try_from(action) {
1810 Ok(action) => action,
1811 Err(_) => return -EINVAL,
1812 };
1813
1814 esyd(&format!("{action}/write"), glob, b'+')
1816}
1817
1818#[no_mangle]
1823pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1824 let action = match Action::try_from(action) {
1826 Ok(action) => action,
1827 Err(_) => return -EINVAL,
1828 };
1829
1830 esyd(&format!("{action}/write"), glob, b'-')
1832}
1833
1834#[no_mangle]
1838pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1839 let action = match Action::try_from(action) {
1841 Ok(action) => action,
1842 Err(_) => return -EINVAL,
1843 };
1844
1845 esyd(&format!("{action}/write"), glob, b'^')
1847}
1848
1849#[no_mangle]
1853pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1854 let action = match Action::try_from(action) {
1856 Ok(action) => action,
1857 Err(_) => return -EINVAL,
1858 };
1859
1860 esyd(&format!("{action}/exec"), glob, b'+')
1862}
1863
1864#[no_mangle]
1869pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1870 let action = match Action::try_from(action) {
1872 Ok(action) => action,
1873 Err(_) => return -EINVAL,
1874 };
1875
1876 esyd(&format!("{action}/exec"), glob, b'-')
1878}
1879
1880#[no_mangle]
1884pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
1885 let action = match Action::try_from(action) {
1887 Ok(action) => action,
1888 Err(_) => return -EINVAL,
1889 };
1890
1891 esyd(&format!("{action}/exec"), glob, b'^')
1893}
1894
1895#[no_mangle]
1899pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
1900 let action = match Action::try_from(action) {
1902 Ok(action) => action,
1903 Err(_) => return -EINVAL,
1904 };
1905
1906 esyd(&format!("{action}/create"), glob, b'+')
1908}
1909
1910#[no_mangle]
1915pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
1916 let action = match Action::try_from(action) {
1918 Ok(action) => action,
1919 Err(_) => return -EINVAL,
1920 };
1921
1922 esyd(&format!("{action}/create"), glob, b'-')
1924}
1925
1926#[no_mangle]
1930pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
1931 let action = match Action::try_from(action) {
1933 Ok(action) => action,
1934 Err(_) => return -EINVAL,
1935 };
1936
1937 esyd(&format!("{action}/create"), glob, b'^')
1939}
1940
1941#[no_mangle]
1945pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
1946 let action = match Action::try_from(action) {
1948 Ok(action) => action,
1949 Err(_) => return -EINVAL,
1950 };
1951
1952 esyd(&format!("{action}/delete"), glob, b'+')
1954}
1955
1956#[no_mangle]
1961pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
1962 let action = match Action::try_from(action) {
1964 Ok(action) => action,
1965 Err(_) => return -EINVAL,
1966 };
1967
1968 esyd(&format!("{action}/delete"), glob, b'-')
1970}
1971
1972#[no_mangle]
1976pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
1977 let action = match Action::try_from(action) {
1979 Ok(action) => action,
1980 Err(_) => return -EINVAL,
1981 };
1982
1983 esyd(&format!("{action}/delete"), glob, b'^')
1985}
1986
1987#[no_mangle]
1991pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
1992 let action = match Action::try_from(action) {
1994 Ok(action) => action,
1995 Err(_) => return -EINVAL,
1996 };
1997
1998 esyd(&format!("{action}/rename"), glob, b'+')
2000}
2001
2002#[no_mangle]
2007pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
2008 let action = match Action::try_from(action) {
2010 Ok(action) => action,
2011 Err(_) => return -EINVAL,
2012 };
2013
2014 esyd(&format!("{action}/rename"), glob, b'-')
2016}
2017
2018#[no_mangle]
2022pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
2023 let action = match Action::try_from(action) {
2025 Ok(action) => action,
2026 Err(_) => return -EINVAL,
2027 };
2028
2029 esyd(&format!("{action}/rename"), glob, b'^')
2031}
2032
2033#[no_mangle]
2037pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
2038 let action = match Action::try_from(action) {
2040 Ok(action) => action,
2041 Err(_) => return -EINVAL,
2042 };
2043
2044 esyd(&format!("{action}/symlink"), glob, b'+')
2046}
2047
2048#[no_mangle]
2053pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
2054 let action = match Action::try_from(action) {
2056 Ok(action) => action,
2057 Err(_) => return -EINVAL,
2058 };
2059
2060 esyd(&format!("{action}/symlink"), glob, b'-')
2062}
2063
2064#[no_mangle]
2068pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
2069 let action = match Action::try_from(action) {
2071 Ok(action) => action,
2072 Err(_) => return -EINVAL,
2073 };
2074
2075 esyd(&format!("{action}/symlink"), glob, b'^')
2077}
2078
2079#[no_mangle]
2083pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
2084 let action = match Action::try_from(action) {
2086 Ok(action) => action,
2087 Err(_) => return -EINVAL,
2088 };
2089
2090 esyd(&format!("{action}/truncate"), glob, b'+')
2092}
2093
2094#[no_mangle]
2099pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
2100 let action = match Action::try_from(action) {
2102 Ok(action) => action,
2103 Err(_) => return -EINVAL,
2104 };
2105
2106 esyd(&format!("{action}/truncate"), glob, b'-')
2108}
2109
2110#[no_mangle]
2114pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
2115 let action = match Action::try_from(action) {
2117 Ok(action) => action,
2118 Err(_) => return -EINVAL,
2119 };
2120
2121 esyd(&format!("{action}/truncate"), glob, b'^')
2123}
2124
2125#[no_mangle]
2129pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
2130 let action = match Action::try_from(action) {
2132 Ok(action) => action,
2133 Err(_) => return -EINVAL,
2134 };
2135
2136 esyd(&format!("{action}/chdir"), glob, b'+')
2138}
2139
2140#[no_mangle]
2145pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
2146 let action = match Action::try_from(action) {
2148 Ok(action) => action,
2149 Err(_) => return -EINVAL,
2150 };
2151
2152 esyd(&format!("{action}/chdir"), glob, b'-')
2154}
2155
2156#[no_mangle]
2160pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
2161 let action = match Action::try_from(action) {
2163 Ok(action) => action,
2164 Err(_) => return -EINVAL,
2165 };
2166
2167 esyd(&format!("{action}/chdir"), glob, b'^')
2169}
2170
2171#[no_mangle]
2175pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
2176 let action = match Action::try_from(action) {
2178 Ok(action) => action,
2179 Err(_) => return -EINVAL,
2180 };
2181
2182 esyd(&format!("{action}/readdir"), glob, b'+')
2184}
2185
2186#[no_mangle]
2191pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
2192 let action = match Action::try_from(action) {
2194 Ok(action) => action,
2195 Err(_) => return -EINVAL,
2196 };
2197
2198 esyd(&format!("{action}/readdir"), glob, b'-')
2200}
2201
2202#[no_mangle]
2206pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
2207 let action = match Action::try_from(action) {
2209 Ok(action) => action,
2210 Err(_) => return -EINVAL,
2211 };
2212
2213 esyd(&format!("{action}/readdir"), glob, b'^')
2215}
2216
2217#[no_mangle]
2221pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
2222 let action = match Action::try_from(action) {
2224 Ok(action) => action,
2225 Err(_) => return -EINVAL,
2226 };
2227
2228 esyd(&format!("{action}/mkdir"), glob, b'+')
2230}
2231
2232#[no_mangle]
2237pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
2238 let action = match Action::try_from(action) {
2240 Ok(action) => action,
2241 Err(_) => return -EINVAL,
2242 };
2243
2244 esyd(&format!("{action}/mkdir"), glob, b'-')
2246}
2247
2248#[no_mangle]
2252pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2253 let action = match Action::try_from(action) {
2255 Ok(action) => action,
2256 Err(_) => return -EINVAL,
2257 };
2258
2259 esyd(&format!("{action}/mkdir"), glob, b'^')
2261}
2262
2263#[no_mangle]
2267pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
2268 let action = match Action::try_from(action) {
2270 Ok(action) => action,
2271 Err(_) => return -EINVAL,
2272 };
2273
2274 esyd(&format!("{action}/rmdir"), glob, b'+')
2276}
2277
2278#[no_mangle]
2283pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
2284 let action = match Action::try_from(action) {
2286 Ok(action) => action,
2287 Err(_) => return -EINVAL,
2288 };
2289
2290 esyd(&format!("{action}/rmdir"), glob, b'-')
2292}
2293
2294#[no_mangle]
2298pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
2299 let action = match Action::try_from(action) {
2301 Ok(action) => action,
2302 Err(_) => return -EINVAL,
2303 };
2304
2305 esyd(&format!("{action}/rmdir"), glob, b'^')
2307}
2308
2309#[no_mangle]
2313pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2314 let action = match Action::try_from(action) {
2316 Ok(action) => action,
2317 Err(_) => return -EINVAL,
2318 };
2319
2320 esyd(&format!("{action}/chown"), glob, b'+')
2322}
2323
2324#[no_mangle]
2329pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2330 let action = match Action::try_from(action) {
2332 Ok(action) => action,
2333 Err(_) => return -EINVAL,
2334 };
2335
2336 esyd(&format!("{action}/chown"), glob, b'-')
2338}
2339
2340#[no_mangle]
2344pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2345 let action = match Action::try_from(action) {
2347 Ok(action) => action,
2348 Err(_) => return -EINVAL,
2349 };
2350
2351 esyd(&format!("{action}/chown"), glob, b'^')
2353}
2354
2355#[no_mangle]
2359pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2360 let action = match Action::try_from(action) {
2362 Ok(action) => action,
2363 Err(_) => return -EINVAL,
2364 };
2365
2366 esyd(&format!("{action}/chgrp"), glob, b'+')
2368}
2369
2370#[no_mangle]
2375pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2376 let action = match Action::try_from(action) {
2378 Ok(action) => action,
2379 Err(_) => return -EINVAL,
2380 };
2381
2382 esyd(&format!("{action}/chgrp"), glob, b'-')
2384}
2385
2386#[no_mangle]
2390pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2391 let action = match Action::try_from(action) {
2393 Ok(action) => action,
2394 Err(_) => return -EINVAL,
2395 };
2396
2397 esyd(&format!("{action}/chgrp"), glob, b'^')
2399}
2400
2401#[no_mangle]
2405pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2406 let action = match Action::try_from(action) {
2408 Ok(action) => action,
2409 Err(_) => return -EINVAL,
2410 };
2411
2412 esyd(&format!("{action}/chmod"), glob, b'+')
2414}
2415
2416#[no_mangle]
2421pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2422 let action = match Action::try_from(action) {
2424 Ok(action) => action,
2425 Err(_) => return -EINVAL,
2426 };
2427
2428 esyd(&format!("{action}/chmod"), glob, b'-')
2430}
2431
2432#[no_mangle]
2436pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2437 let action = match Action::try_from(action) {
2439 Ok(action) => action,
2440 Err(_) => return -EINVAL,
2441 };
2442
2443 esyd(&format!("{action}/chmod"), glob, b'^')
2445}
2446
2447#[no_mangle]
2451pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2452 let action = match Action::try_from(action) {
2454 Ok(action) => action,
2455 Err(_) => return -EINVAL,
2456 };
2457
2458 esyd(&format!("{action}/chattr"), glob, b'+')
2460}
2461
2462#[no_mangle]
2467pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2468 let action = match Action::try_from(action) {
2470 Ok(action) => action,
2471 Err(_) => return -EINVAL,
2472 };
2473
2474 esyd(&format!("{action}/chattr"), glob, b'-')
2476}
2477
2478#[no_mangle]
2482pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2483 let action = match Action::try_from(action) {
2485 Ok(action) => action,
2486 Err(_) => return -EINVAL,
2487 };
2488
2489 esyd(&format!("{action}/chattr"), glob, b'^')
2491}
2492
2493#[no_mangle]
2497pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2498 let action = match Action::try_from(action) {
2500 Ok(action) => action,
2501 Err(_) => return -EINVAL,
2502 };
2503
2504 esyd(&format!("{action}/chroot"), glob, b'+')
2506}
2507
2508#[no_mangle]
2513pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2514 let action = match Action::try_from(action) {
2516 Ok(action) => action,
2517 Err(_) => return -EINVAL,
2518 };
2519
2520 esyd(&format!("{action}/chroot"), glob, b'-')
2522}
2523
2524#[no_mangle]
2528pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2529 let action = match Action::try_from(action) {
2531 Ok(action) => action,
2532 Err(_) => return -EINVAL,
2533 };
2534
2535 esyd(&format!("{action}/chroot"), glob, b'^')
2537}
2538
2539#[no_mangle]
2543pub extern "C" fn syd_notify_add(action: action_t, glob: *const c_char) -> c_int {
2544 let action = match Action::try_from(action) {
2546 Ok(action) => action,
2547 Err(_) => return -EINVAL,
2548 };
2549
2550 esyd(&format!("{action}/notify"), glob, b'+')
2552}
2553
2554#[no_mangle]
2559pub extern "C" fn syd_notify_del(action: action_t, glob: *const c_char) -> c_int {
2560 let action = match Action::try_from(action) {
2562 Ok(action) => action,
2563 Err(_) => return -EINVAL,
2564 };
2565
2566 esyd(&format!("{action}/notify"), glob, b'-')
2568}
2569
2570#[no_mangle]
2574pub extern "C" fn syd_notify_rem(action: action_t, glob: *const c_char) -> c_int {
2575 let action = match Action::try_from(action) {
2577 Ok(action) => action,
2578 Err(_) => return -EINVAL,
2579 };
2580
2581 esyd(&format!("{action}/notify"), glob, b'^')
2583}
2584
2585#[no_mangle]
2589pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2590 let action = match Action::try_from(action) {
2592 Ok(action) => action,
2593 Err(_) => return -EINVAL,
2594 };
2595
2596 esyd(&format!("{action}/utime"), glob, b'+')
2598}
2599
2600#[no_mangle]
2605pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2606 let action = match Action::try_from(action) {
2608 Ok(action) => action,
2609 Err(_) => return -EINVAL,
2610 };
2611
2612 esyd(&format!("{action}/utime"), glob, b'-')
2614}
2615
2616#[no_mangle]
2620pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2621 let action = match Action::try_from(action) {
2623 Ok(action) => action,
2624 Err(_) => return -EINVAL,
2625 };
2626
2627 esyd(&format!("{action}/utime"), glob, b'^')
2629}
2630
2631#[no_mangle]
2635pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
2636 let action = match Action::try_from(action) {
2638 Ok(action) => action,
2639 Err(_) => return -EINVAL,
2640 };
2641
2642 esyd(&format!("{action}/mkbdev"), glob, b'+')
2644}
2645
2646#[no_mangle]
2651pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
2652 let action = match Action::try_from(action) {
2654 Ok(action) => action,
2655 Err(_) => return -EINVAL,
2656 };
2657
2658 esyd(&format!("{action}/mkbdev"), glob, b'-')
2660}
2661
2662#[no_mangle]
2666pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
2667 let action = match Action::try_from(action) {
2669 Ok(action) => action,
2670 Err(_) => return -EINVAL,
2671 };
2672
2673 esyd(&format!("{action}/mkbdev"), glob, b'^')
2675}
2676
2677#[no_mangle]
2681pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
2682 let action = match Action::try_from(action) {
2684 Ok(action) => action,
2685 Err(_) => return -EINVAL,
2686 };
2687
2688 esyd(&format!("{action}/mkcdev"), glob, b'+')
2690}
2691
2692#[no_mangle]
2697pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
2698 let action = match Action::try_from(action) {
2700 Ok(action) => action,
2701 Err(_) => return -EINVAL,
2702 };
2703
2704 esyd(&format!("{action}/mkcdev"), glob, b'-')
2706}
2707
2708#[no_mangle]
2712pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
2713 let action = match Action::try_from(action) {
2715 Ok(action) => action,
2716 Err(_) => return -EINVAL,
2717 };
2718
2719 esyd(&format!("{action}/mkcdev"), glob, b'^')
2721}
2722
2723#[no_mangle]
2727pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2728 let action = match Action::try_from(action) {
2730 Ok(action) => action,
2731 Err(_) => return -EINVAL,
2732 };
2733
2734 esyd(&format!("{action}/mkfifo"), glob, b'+')
2736}
2737
2738#[no_mangle]
2743pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2744 let action = match Action::try_from(action) {
2746 Ok(action) => action,
2747 Err(_) => return -EINVAL,
2748 };
2749
2750 esyd(&format!("{action}/mkfifo"), glob, b'-')
2752}
2753
2754#[no_mangle]
2758pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2759 let action = match Action::try_from(action) {
2761 Ok(action) => action,
2762 Err(_) => return -EINVAL,
2763 };
2764
2765 esyd(&format!("{action}/mkfifo"), glob, b'^')
2767}
2768
2769#[no_mangle]
2773pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2774 let action = match Action::try_from(action) {
2776 Ok(action) => action,
2777 Err(_) => return -EINVAL,
2778 };
2779
2780 esyd(&format!("{action}/mktemp"), glob, b'+')
2782}
2783
2784#[no_mangle]
2789pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2790 let action = match Action::try_from(action) {
2792 Ok(action) => action,
2793 Err(_) => return -EINVAL,
2794 };
2795
2796 esyd(&format!("{action}/mktemp"), glob, b'-')
2798}
2799
2800#[no_mangle]
2804pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2805 let action = match Action::try_from(action) {
2807 Ok(action) => action,
2808 Err(_) => return -EINVAL,
2809 };
2810
2811 esyd(&format!("{action}/mktemp"), glob, b'^')
2813}
2814
2815#[no_mangle]
2819pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2820 let action = match Action::try_from(action) {
2822 Ok(action) => action,
2823 Err(_) => return -EINVAL,
2824 };
2825
2826 esyd(&format!("{action}/net/bind"), glob, b'+')
2828}
2829
2830#[no_mangle]
2835pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2836 let action = match Action::try_from(action) {
2838 Ok(action) => action,
2839 Err(_) => return -EINVAL,
2840 };
2841
2842 esyd(&format!("{action}/net/bind"), glob, b'-')
2844}
2845
2846#[no_mangle]
2850pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
2851 let action = match Action::try_from(action) {
2853 Ok(action) => action,
2854 Err(_) => return -EINVAL,
2855 };
2856
2857 esyd(&format!("{action}/net/bind"), glob, b'^')
2859}
2860
2861#[no_mangle]
2865pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
2866 let action = match Action::try_from(action) {
2868 Ok(action) => action,
2869 Err(_) => return -EINVAL,
2870 };
2871
2872 esyd(&format!("{action}/net/connect"), glob, b'+')
2874}
2875
2876#[no_mangle]
2881pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
2882 let action = match Action::try_from(action) {
2884 Ok(action) => action,
2885 Err(_) => return -EINVAL,
2886 };
2887
2888 esyd(&format!("{action}/net/connect"), glob, b'-')
2890}
2891
2892#[no_mangle]
2896pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
2897 let action = match Action::try_from(action) {
2899 Ok(action) => action,
2900 Err(_) => return -EINVAL,
2901 };
2902
2903 esyd(&format!("{action}/net/connect"), glob, b'^')
2905}
2906
2907#[no_mangle]
2911pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
2912 let action = match Action::try_from(action) {
2914 Ok(action) => action,
2915 Err(_) => return -EINVAL,
2916 };
2917
2918 esyd(&format!("{action}/net/sendfd"), glob, b'+')
2920}
2921
2922#[no_mangle]
2927pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
2928 let action = match Action::try_from(action) {
2930 Ok(action) => action,
2931 Err(_) => return -EINVAL,
2932 };
2933
2934 esyd(&format!("{action}/net/sendfd"), glob, b'-')
2936}
2937
2938#[no_mangle]
2942pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
2943 let action = match Action::try_from(action) {
2945 Ok(action) => action,
2946 Err(_) => return -EINVAL,
2947 };
2948
2949 esyd(&format!("{action}/net/sendfd"), glob, b'^')
2951}
2952
2953#[no_mangle]
2957pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
2958 let action = match Action::try_from(action) {
2960 Ok(action) => action,
2961 Err(_) => return -EINVAL,
2962 };
2963
2964 esyd(&format!("{action}/net/link"), family, b'+')
2966}
2967
2968#[no_mangle]
2973pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
2974 let action = match Action::try_from(action) {
2976 Ok(action) => action,
2977 Err(_) => return -EINVAL,
2978 };
2979
2980 esyd(&format!("{action}/net/link"), family, b'-')
2982}
2983
2984#[no_mangle]
2988pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
2989 let action = match Action::try_from(action) {
2991 Ok(action) => action,
2992 Err(_) => return -EINVAL,
2993 };
2994
2995 esyd(&format!("{action}/net/link"), family, b'^')
2997}
2998
2999#[no_mangle]
3005pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
3006 esyd("mem/max", size, b':')
3007}
3008
3009#[no_mangle]
3015pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
3016 esyd("mem/vm_max", size, b':')
3017}
3018
3019#[no_mangle]
3023pub extern "C" fn syd_pid_max(size: usize) -> c_int {
3024 stat(&format!("/dev/syd/pid/max:{size}"))
3025}
3026
3027#[no_mangle]
3032pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
3033 stat(&format!("/dev/syd/segvguard/expiry:{timeout}"))
3034}
3035
3036#[no_mangle]
3040pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
3041 stat(&format!("/dev/syd/segvguard/suspension:{timeout}"))
3042}
3043
3044#[no_mangle]
3048pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
3049 stat(&format!("/dev/syd/segvguard/maxcrashes:{max}"))
3050}
3051
3052#[no_mangle]
3078pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
3079 if file.is_null() || argv.is_null() {
3080 return -EFAULT;
3081 }
3082
3083 let file = CStr::from_ptr(file);
3085 let file = OsStr::from_bytes(file.to_bytes());
3086
3087 let mut path = OsString::from("/dev/syd/cmd/exec!");
3088 path.push(file);
3089
3090 let mut idx: isize = 0;
3091 while !(*argv.offset(idx)).is_null() {
3092 let arg = CStr::from_ptr(*argv.offset(idx));
3094 let arg = OsStr::from_bytes(arg.to_bytes());
3095
3096 path.push(OsStr::from_bytes(&[b'\x1F'])); path.push(arg);
3098
3099 idx = idx.saturating_add(1);
3100 }
3101
3102 let path = PathBuf::from(path);
3103 stat(path)
3104}