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_enable_mem() -> c_int {
1058 stat("/dev/syd/sandbox/mem:on")
1059}
1060
1061#[no_mangle]
1065pub extern "C" fn syd_disable_mem() -> c_int {
1066 stat("/dev/syd/sandbox/mem:off")
1067}
1068
1069#[no_mangle]
1073pub extern "C" fn syd_enabled_pid() -> bool {
1074 stat("/dev/syd/sandbox/pid?") == 0
1075}
1076
1077#[no_mangle]
1081pub extern "C" fn syd_enable_pid() -> c_int {
1082 stat("/dev/syd/sandbox/pid:on")
1083}
1084
1085#[no_mangle]
1089pub extern "C" fn syd_disable_pid() -> c_int {
1090 stat("/dev/syd/sandbox/pid:off")
1091}
1092
1093#[no_mangle]
1097pub extern "C" fn syd_enabled_lock() -> bool {
1098 stat("/dev/syd/sandbox/lock?") == 0
1099}
1100
1101#[no_mangle]
1105pub extern "C" fn syd_enabled_crypt() -> bool {
1106 stat("/dev/syd/sandbox/crypt?") == 0
1107}
1108
1109#[no_mangle]
1113pub extern "C" fn syd_enabled_proxy() -> bool {
1114 stat("/dev/syd/sandbox/proxy?") == 0
1115}
1116
1117#[no_mangle]
1121pub extern "C" fn syd_enabled_force() -> bool {
1122 stat("/dev/syd/sandbox/force?") == 0
1123}
1124
1125#[no_mangle]
1129pub extern "C" fn syd_enable_force() -> c_int {
1130 stat("/dev/syd/sandbox/force:on")
1131}
1132
1133#[no_mangle]
1137pub extern "C" fn syd_disable_force() -> c_int {
1138 stat("/dev/syd/sandbox/force:off")
1139}
1140
1141#[no_mangle]
1145pub extern "C" fn syd_enabled_tpe() -> bool {
1146 stat("/dev/syd/sandbox/tpe?") == 0
1147}
1148
1149#[no_mangle]
1153pub extern "C" fn syd_enable_tpe() -> c_int {
1154 stat("/dev/syd/sandbox/tpe:on")
1155}
1156
1157#[no_mangle]
1161pub extern "C" fn syd_disable_tpe() -> c_int {
1162 stat("/dev/syd/sandbox/tpe:off")
1163}
1164
1165#[no_mangle]
1167pub extern "C" fn syd_default_fs(action: action_t) -> c_int {
1168 let action = match Action::try_from(action) {
1170 Ok(action) => action,
1171 Err(_) => return -EINVAL,
1172 };
1173 stat(&format!("/dev/syd/default/fs:{action}"))
1174}
1175
1176#[no_mangle]
1178pub extern "C" fn syd_default_walk(action: action_t) -> c_int {
1179 let action = match Action::try_from(action) {
1181 Ok(action) => action,
1182 Err(_) => return -EINVAL,
1183 };
1184 stat(&format!("/dev/syd/default/walk:{action}"))
1185}
1186
1187#[no_mangle]
1189pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
1190 let action = match Action::try_from(action) {
1192 Ok(action) => action,
1193 Err(_) => return -EINVAL,
1194 };
1195 stat(&format!("/dev/syd/default/stat:{action}"))
1196}
1197
1198#[no_mangle]
1200pub extern "C" fn syd_default_read(action: action_t) -> c_int {
1201 let action = match Action::try_from(action) {
1203 Ok(action) => action,
1204 Err(_) => return -EINVAL,
1205 };
1206 stat(&format!("/dev/syd/default/read:{action}"))
1207}
1208
1209#[no_mangle]
1211pub extern "C" fn syd_default_write(action: action_t) -> c_int {
1212 let action = match Action::try_from(action) {
1214 Ok(action) => action,
1215 Err(_) => return -EINVAL,
1216 };
1217 stat(&format!("/dev/syd/default/write:{action}"))
1218}
1219
1220#[no_mangle]
1222pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
1223 let action = match Action::try_from(action) {
1225 Ok(action) => action,
1226 Err(_) => return -EINVAL,
1227 };
1228 stat(&format!("/dev/syd/default/exec:{action}"))
1229}
1230
1231#[no_mangle]
1233pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
1234 let action = match Action::try_from(action) {
1236 Ok(action) => action,
1237 Err(_) => return -EINVAL,
1238 };
1239 stat(&format!("/dev/syd/default/ioctl:{action}"))
1240}
1241
1242#[no_mangle]
1244pub extern "C" fn syd_default_create(action: action_t) -> c_int {
1245 let action = match Action::try_from(action) {
1247 Ok(action) => action,
1248 Err(_) => return -EINVAL,
1249 };
1250 stat(&format!("/dev/syd/default/create:{action}"))
1251}
1252
1253#[no_mangle]
1255pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
1256 let action = match Action::try_from(action) {
1258 Ok(action) => action,
1259 Err(_) => return -EINVAL,
1260 };
1261 stat(&format!("/dev/syd/default/delete:{action}"))
1262}
1263
1264#[no_mangle]
1266pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
1267 let action = match Action::try_from(action) {
1269 Ok(action) => action,
1270 Err(_) => return -EINVAL,
1271 };
1272 stat(&format!("/dev/syd/default/rename:{action}"))
1273}
1274
1275#[no_mangle]
1277pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
1278 let action = match Action::try_from(action) {
1280 Ok(action) => action,
1281 Err(_) => return -EINVAL,
1282 };
1283 stat(&format!("/dev/syd/default/symlink:{action}"))
1284}
1285
1286#[no_mangle]
1288pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
1289 let action = match Action::try_from(action) {
1291 Ok(action) => action,
1292 Err(_) => return -EINVAL,
1293 };
1294 stat(&format!("/dev/syd/default/truncate:{action}"))
1295}
1296
1297#[no_mangle]
1299pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
1300 let action = match Action::try_from(action) {
1302 Ok(action) => action,
1303 Err(_) => return -EINVAL,
1304 };
1305 stat(&format!("/dev/syd/default/chdir:{action}"))
1306}
1307
1308#[no_mangle]
1310pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
1311 let action = match Action::try_from(action) {
1313 Ok(action) => action,
1314 Err(_) => return -EINVAL,
1315 };
1316 stat(&format!("/dev/syd/default/readdir:{action}"))
1317}
1318
1319#[no_mangle]
1321pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
1322 let action = match Action::try_from(action) {
1324 Ok(action) => action,
1325 Err(_) => return -EINVAL,
1326 };
1327 stat(&format!("/dev/syd/default/mkdir:{action}"))
1328}
1329
1330#[no_mangle]
1332pub extern "C" fn syd_default_rmdir(action: action_t) -> c_int {
1333 let action = match Action::try_from(action) {
1335 Ok(action) => action,
1336 Err(_) => return -EINVAL,
1337 };
1338 stat(&format!("/dev/syd/default/rmdir:{action}"))
1339}
1340
1341#[no_mangle]
1343pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1344 let action = match Action::try_from(action) {
1346 Ok(action) => action,
1347 Err(_) => return -EINVAL,
1348 };
1349 stat(&format!("/dev/syd/default/chown:{action}"))
1350}
1351
1352#[no_mangle]
1354pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1355 let action = match Action::try_from(action) {
1357 Ok(action) => action,
1358 Err(_) => return -EINVAL,
1359 };
1360 stat(&format!("/dev/syd/default/chgrp:{action}"))
1361}
1362
1363#[no_mangle]
1365pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1366 let action = match Action::try_from(action) {
1368 Ok(action) => action,
1369 Err(_) => return -EINVAL,
1370 };
1371 stat(&format!("/dev/syd/default/chmod:{action}"))
1372}
1373
1374#[no_mangle]
1376pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1377 let action = match Action::try_from(action) {
1379 Ok(action) => action,
1380 Err(_) => return -EINVAL,
1381 };
1382 stat(&format!("/dev/syd/default/chattr:{action}"))
1383}
1384
1385#[no_mangle]
1387pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1388 let action = match Action::try_from(action) {
1390 Ok(action) => action,
1391 Err(_) => return -EINVAL,
1392 };
1393 stat(&format!("/dev/syd/default/chroot:{action}"))
1394}
1395
1396#[no_mangle]
1398pub extern "C" fn syd_default_notify(action: action_t) -> c_int {
1399 let action = match Action::try_from(action) {
1401 Ok(action) => action,
1402 Err(_) => return -EINVAL,
1403 };
1404 stat(&format!("/dev/syd/default/notify:{action}"))
1405}
1406
1407#[no_mangle]
1409pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1410 let action = match Action::try_from(action) {
1412 Ok(action) => action,
1413 Err(_) => return -EINVAL,
1414 };
1415 stat(&format!("/dev/syd/default/utime:{action}"))
1416}
1417
1418#[no_mangle]
1420pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
1421 let action = match Action::try_from(action) {
1423 Ok(action) => action,
1424 Err(_) => return -EINVAL,
1425 };
1426 stat(&format!("/dev/syd/default/mkbdev:{action}"))
1427}
1428
1429#[no_mangle]
1431pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
1432 let action = match Action::try_from(action) {
1434 Ok(action) => action,
1435 Err(_) => return -EINVAL,
1436 };
1437 stat(&format!("/dev/syd/default/mkcdev:{action}"))
1438}
1439
1440#[no_mangle]
1442pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1443 let action = match Action::try_from(action) {
1445 Ok(action) => action,
1446 Err(_) => return -EINVAL,
1447 };
1448 stat(&format!("/dev/syd/default/mkfifo:{action}"))
1449}
1450
1451#[no_mangle]
1453pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1454 let action = match Action::try_from(action) {
1456 Ok(action) => action,
1457 Err(_) => return -EINVAL,
1458 };
1459 stat(&format!("/dev/syd/default/mktemp:{action}"))
1460}
1461
1462#[no_mangle]
1464pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1465 let action = match Action::try_from(action) {
1467 Ok(action) => action,
1468 Err(_) => return -EINVAL,
1469 };
1470 stat(&format!("/dev/syd/default/net:{action}"))
1471}
1472
1473#[no_mangle]
1475pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1476 let action = match Action::try_from(action) {
1478 Ok(action) => action,
1479 Err(_) => return -EINVAL,
1480 };
1481 stat(&format!("/dev/syd/default/block:{action}"))
1482}
1483
1484#[no_mangle]
1486pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1487 let action = match Action::try_from(action) {
1489 Ok(action) => action,
1490 Err(_) => return -EINVAL,
1491 };
1492 stat(&format!("/dev/syd/default/mem:{action}"))
1493}
1494
1495#[no_mangle]
1497pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1498 let action = match Action::try_from(action) {
1500 Ok(action) => action,
1501 Err(_) => return -EINVAL,
1502 };
1503 stat(&format!("/dev/syd/default/pid:{action}"))
1504}
1505
1506#[no_mangle]
1508pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1509 let action = match Action::try_from(action) {
1511 Ok(action) => action,
1512 Err(_) => return -EINVAL,
1513 };
1514 stat(&format!("/dev/syd/default/force:{action}"))
1515}
1516
1517#[no_mangle]
1519pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1520 let action = match Action::try_from(action) {
1522 Ok(action) => action,
1523 Err(_) => return -EINVAL,
1524 };
1525 stat(&format!("/dev/syd/default/segvguard:{action}"))
1526}
1527
1528#[no_mangle]
1530pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1531 let action = match Action::try_from(action) {
1533 Ok(action) => action,
1534 Err(_) => return -EINVAL,
1535 };
1536 stat(&format!("/dev/syd/default/tpe:{action}"))
1537}
1538
1539#[no_mangle]
1541pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1542 stat(&format!("/dev/syd/deny/ioctl+{request}"))
1543}
1544
1545#[no_mangle]
1560pub unsafe extern "C" fn syd_force_add(
1561 path: *const c_char,
1562 hash: *const c_char,
1563 action: action_t,
1564) -> c_int {
1565 let action = match Action::try_from(action) {
1567 Ok(action) => action,
1568 Err(_) => return -EINVAL,
1569 };
1570
1571 if path.is_null() || hash.is_null() {
1572 return -EFAULT;
1573 }
1574
1575 let path = unsafe { CStr::from_ptr(path) };
1577 let hash = unsafe { CStr::from_ptr(hash) };
1579 let path = match path.to_str() {
1580 Ok(s) => s,
1581 Err(_) => return -EINVAL,
1582 };
1583 let hash = match hash.to_str() {
1584 Ok(s) => s,
1585 Err(_) => return -EINVAL,
1586 };
1587
1588 stat(format!("/dev/syd/force+{path}:{hash}:{action}"))
1590}
1591
1592#[no_mangle]
1604pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1605 if path.is_null() {
1606 return -EFAULT;
1607 }
1608
1609 let path = unsafe { CStr::from_ptr(path) };
1611 let path = match path.to_str() {
1612 Ok(s) => s,
1613 Err(_) => return -EINVAL,
1614 };
1615
1616 stat(format!("/dev/syd/force-{path}"))
1618}
1619
1620#[no_mangle]
1622pub extern "C" fn syd_force_clr() -> c_int {
1623 stat("/dev/syd/force^")
1624}
1625
1626#[no_mangle]
1630pub extern "C" fn syd_fs_add(action: action_t, name: *const c_char) -> c_int {
1631 let action = match Action::try_from(action) {
1633 Ok(action) => action,
1634 Err(_) => return -EINVAL,
1635 };
1636
1637 esyd(&format!("{action}/fs"), name, b'+')
1639}
1640
1641#[no_mangle]
1646pub extern "C" fn syd_fs_del(action: action_t, name: *const c_char) -> c_int {
1647 let action = match Action::try_from(action) {
1649 Ok(action) => action,
1650 Err(_) => return -EINVAL,
1651 };
1652
1653 esyd(&format!("{action}/fs"), name, b'-')
1655}
1656
1657#[no_mangle]
1661pub extern "C" fn syd_fs_rem(action: action_t, name: *const c_char) -> c_int {
1662 let action = match Action::try_from(action) {
1664 Ok(action) => action,
1665 Err(_) => return -EINVAL,
1666 };
1667
1668 esyd(&format!("{action}/fs"), name, b'^')
1670}
1671
1672#[no_mangle]
1676pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
1677 let action = match Action::try_from(action) {
1679 Ok(action) => action,
1680 Err(_) => return -EINVAL,
1681 };
1682
1683 esyd(&format!("{action}/walk"), glob, b'+')
1685}
1686
1687#[no_mangle]
1692pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
1693 let action = match Action::try_from(action) {
1695 Ok(action) => action,
1696 Err(_) => return -EINVAL,
1697 };
1698
1699 esyd(&format!("{action}/walk"), glob, b'-')
1701}
1702
1703#[no_mangle]
1707pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
1708 let action = match Action::try_from(action) {
1710 Ok(action) => action,
1711 Err(_) => return -EINVAL,
1712 };
1713
1714 esyd(&format!("{action}/walk"), glob, b'^')
1716}
1717
1718#[no_mangle]
1722pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1723 let action = match Action::try_from(action) {
1725 Ok(action) => action,
1726 Err(_) => return -EINVAL,
1727 };
1728
1729 esyd(&format!("{action}/stat"), glob, b'+')
1731}
1732
1733#[no_mangle]
1738pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1739 let action = match Action::try_from(action) {
1741 Ok(action) => action,
1742 Err(_) => return -EINVAL,
1743 };
1744
1745 esyd(&format!("{action}/stat"), glob, b'-')
1747}
1748
1749#[no_mangle]
1753pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1754 let action = match Action::try_from(action) {
1756 Ok(action) => action,
1757 Err(_) => return -EINVAL,
1758 };
1759
1760 esyd(&format!("{action}/stat"), glob, b'^')
1762}
1763
1764#[no_mangle]
1768pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1769 let action = match Action::try_from(action) {
1771 Ok(action) => action,
1772 Err(_) => return -EINVAL,
1773 };
1774
1775 esyd(&format!("{action}/read"), glob, b'+')
1777}
1778
1779#[no_mangle]
1784pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1785 let action = match Action::try_from(action) {
1787 Ok(action) => action,
1788 Err(_) => return -EINVAL,
1789 };
1790
1791 esyd(&format!("{action}/read"), glob, b'-')
1793}
1794
1795#[no_mangle]
1799pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1800 let action = match Action::try_from(action) {
1802 Ok(action) => action,
1803 Err(_) => return -EINVAL,
1804 };
1805
1806 esyd(&format!("{action}/read"), glob, b'^')
1808}
1809
1810#[no_mangle]
1814pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1815 let action = match Action::try_from(action) {
1817 Ok(action) => action,
1818 Err(_) => return -EINVAL,
1819 };
1820
1821 esyd(&format!("{action}/write"), glob, b'+')
1823}
1824
1825#[no_mangle]
1830pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1831 let action = match Action::try_from(action) {
1833 Ok(action) => action,
1834 Err(_) => return -EINVAL,
1835 };
1836
1837 esyd(&format!("{action}/write"), glob, b'-')
1839}
1840
1841#[no_mangle]
1845pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1846 let action = match Action::try_from(action) {
1848 Ok(action) => action,
1849 Err(_) => return -EINVAL,
1850 };
1851
1852 esyd(&format!("{action}/write"), glob, b'^')
1854}
1855
1856#[no_mangle]
1860pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1861 let action = match Action::try_from(action) {
1863 Ok(action) => action,
1864 Err(_) => return -EINVAL,
1865 };
1866
1867 esyd(&format!("{action}/exec"), glob, b'+')
1869}
1870
1871#[no_mangle]
1876pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1877 let action = match Action::try_from(action) {
1879 Ok(action) => action,
1880 Err(_) => return -EINVAL,
1881 };
1882
1883 esyd(&format!("{action}/exec"), glob, b'-')
1885}
1886
1887#[no_mangle]
1891pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
1892 let action = match Action::try_from(action) {
1894 Ok(action) => action,
1895 Err(_) => return -EINVAL,
1896 };
1897
1898 esyd(&format!("{action}/exec"), glob, b'^')
1900}
1901
1902#[no_mangle]
1906pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
1907 let action = match Action::try_from(action) {
1909 Ok(action) => action,
1910 Err(_) => return -EINVAL,
1911 };
1912
1913 esyd(&format!("{action}/create"), glob, b'+')
1915}
1916
1917#[no_mangle]
1922pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
1923 let action = match Action::try_from(action) {
1925 Ok(action) => action,
1926 Err(_) => return -EINVAL,
1927 };
1928
1929 esyd(&format!("{action}/create"), glob, b'-')
1931}
1932
1933#[no_mangle]
1937pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
1938 let action = match Action::try_from(action) {
1940 Ok(action) => action,
1941 Err(_) => return -EINVAL,
1942 };
1943
1944 esyd(&format!("{action}/create"), glob, b'^')
1946}
1947
1948#[no_mangle]
1952pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
1953 let action = match Action::try_from(action) {
1955 Ok(action) => action,
1956 Err(_) => return -EINVAL,
1957 };
1958
1959 esyd(&format!("{action}/delete"), glob, b'+')
1961}
1962
1963#[no_mangle]
1968pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
1969 let action = match Action::try_from(action) {
1971 Ok(action) => action,
1972 Err(_) => return -EINVAL,
1973 };
1974
1975 esyd(&format!("{action}/delete"), glob, b'-')
1977}
1978
1979#[no_mangle]
1983pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
1984 let action = match Action::try_from(action) {
1986 Ok(action) => action,
1987 Err(_) => return -EINVAL,
1988 };
1989
1990 esyd(&format!("{action}/delete"), glob, b'^')
1992}
1993
1994#[no_mangle]
1998pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
1999 let action = match Action::try_from(action) {
2001 Ok(action) => action,
2002 Err(_) => return -EINVAL,
2003 };
2004
2005 esyd(&format!("{action}/rename"), glob, b'+')
2007}
2008
2009#[no_mangle]
2014pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
2015 let action = match Action::try_from(action) {
2017 Ok(action) => action,
2018 Err(_) => return -EINVAL,
2019 };
2020
2021 esyd(&format!("{action}/rename"), glob, b'-')
2023}
2024
2025#[no_mangle]
2029pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
2030 let action = match Action::try_from(action) {
2032 Ok(action) => action,
2033 Err(_) => return -EINVAL,
2034 };
2035
2036 esyd(&format!("{action}/rename"), glob, b'^')
2038}
2039
2040#[no_mangle]
2044pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
2045 let action = match Action::try_from(action) {
2047 Ok(action) => action,
2048 Err(_) => return -EINVAL,
2049 };
2050
2051 esyd(&format!("{action}/symlink"), glob, b'+')
2053}
2054
2055#[no_mangle]
2060pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
2061 let action = match Action::try_from(action) {
2063 Ok(action) => action,
2064 Err(_) => return -EINVAL,
2065 };
2066
2067 esyd(&format!("{action}/symlink"), glob, b'-')
2069}
2070
2071#[no_mangle]
2075pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
2076 let action = match Action::try_from(action) {
2078 Ok(action) => action,
2079 Err(_) => return -EINVAL,
2080 };
2081
2082 esyd(&format!("{action}/symlink"), glob, b'^')
2084}
2085
2086#[no_mangle]
2090pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
2091 let action = match Action::try_from(action) {
2093 Ok(action) => action,
2094 Err(_) => return -EINVAL,
2095 };
2096
2097 esyd(&format!("{action}/truncate"), glob, b'+')
2099}
2100
2101#[no_mangle]
2106pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
2107 let action = match Action::try_from(action) {
2109 Ok(action) => action,
2110 Err(_) => return -EINVAL,
2111 };
2112
2113 esyd(&format!("{action}/truncate"), glob, b'-')
2115}
2116
2117#[no_mangle]
2121pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
2122 let action = match Action::try_from(action) {
2124 Ok(action) => action,
2125 Err(_) => return -EINVAL,
2126 };
2127
2128 esyd(&format!("{action}/truncate"), glob, b'^')
2130}
2131
2132#[no_mangle]
2136pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
2137 let action = match Action::try_from(action) {
2139 Ok(action) => action,
2140 Err(_) => return -EINVAL,
2141 };
2142
2143 esyd(&format!("{action}/chdir"), glob, b'+')
2145}
2146
2147#[no_mangle]
2152pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
2153 let action = match Action::try_from(action) {
2155 Ok(action) => action,
2156 Err(_) => return -EINVAL,
2157 };
2158
2159 esyd(&format!("{action}/chdir"), glob, b'-')
2161}
2162
2163#[no_mangle]
2167pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
2168 let action = match Action::try_from(action) {
2170 Ok(action) => action,
2171 Err(_) => return -EINVAL,
2172 };
2173
2174 esyd(&format!("{action}/chdir"), glob, b'^')
2176}
2177
2178#[no_mangle]
2182pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
2183 let action = match Action::try_from(action) {
2185 Ok(action) => action,
2186 Err(_) => return -EINVAL,
2187 };
2188
2189 esyd(&format!("{action}/readdir"), glob, b'+')
2191}
2192
2193#[no_mangle]
2198pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
2199 let action = match Action::try_from(action) {
2201 Ok(action) => action,
2202 Err(_) => return -EINVAL,
2203 };
2204
2205 esyd(&format!("{action}/readdir"), glob, b'-')
2207}
2208
2209#[no_mangle]
2213pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
2214 let action = match Action::try_from(action) {
2216 Ok(action) => action,
2217 Err(_) => return -EINVAL,
2218 };
2219
2220 esyd(&format!("{action}/readdir"), glob, b'^')
2222}
2223
2224#[no_mangle]
2228pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
2229 let action = match Action::try_from(action) {
2231 Ok(action) => action,
2232 Err(_) => return -EINVAL,
2233 };
2234
2235 esyd(&format!("{action}/mkdir"), glob, b'+')
2237}
2238
2239#[no_mangle]
2244pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
2245 let action = match Action::try_from(action) {
2247 Ok(action) => action,
2248 Err(_) => return -EINVAL,
2249 };
2250
2251 esyd(&format!("{action}/mkdir"), glob, b'-')
2253}
2254
2255#[no_mangle]
2259pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2260 let action = match Action::try_from(action) {
2262 Ok(action) => action,
2263 Err(_) => return -EINVAL,
2264 };
2265
2266 esyd(&format!("{action}/mkdir"), glob, b'^')
2268}
2269
2270#[no_mangle]
2274pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
2275 let action = match Action::try_from(action) {
2277 Ok(action) => action,
2278 Err(_) => return -EINVAL,
2279 };
2280
2281 esyd(&format!("{action}/rmdir"), glob, b'+')
2283}
2284
2285#[no_mangle]
2290pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
2291 let action = match Action::try_from(action) {
2293 Ok(action) => action,
2294 Err(_) => return -EINVAL,
2295 };
2296
2297 esyd(&format!("{action}/rmdir"), glob, b'-')
2299}
2300
2301#[no_mangle]
2305pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
2306 let action = match Action::try_from(action) {
2308 Ok(action) => action,
2309 Err(_) => return -EINVAL,
2310 };
2311
2312 esyd(&format!("{action}/rmdir"), glob, b'^')
2314}
2315
2316#[no_mangle]
2320pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2321 let action = match Action::try_from(action) {
2323 Ok(action) => action,
2324 Err(_) => return -EINVAL,
2325 };
2326
2327 esyd(&format!("{action}/chown"), glob, b'+')
2329}
2330
2331#[no_mangle]
2336pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2337 let action = match Action::try_from(action) {
2339 Ok(action) => action,
2340 Err(_) => return -EINVAL,
2341 };
2342
2343 esyd(&format!("{action}/chown"), glob, b'-')
2345}
2346
2347#[no_mangle]
2351pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2352 let action = match Action::try_from(action) {
2354 Ok(action) => action,
2355 Err(_) => return -EINVAL,
2356 };
2357
2358 esyd(&format!("{action}/chown"), glob, b'^')
2360}
2361
2362#[no_mangle]
2366pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2367 let action = match Action::try_from(action) {
2369 Ok(action) => action,
2370 Err(_) => return -EINVAL,
2371 };
2372
2373 esyd(&format!("{action}/chgrp"), glob, b'+')
2375}
2376
2377#[no_mangle]
2382pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2383 let action = match Action::try_from(action) {
2385 Ok(action) => action,
2386 Err(_) => return -EINVAL,
2387 };
2388
2389 esyd(&format!("{action}/chgrp"), glob, b'-')
2391}
2392
2393#[no_mangle]
2397pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2398 let action = match Action::try_from(action) {
2400 Ok(action) => action,
2401 Err(_) => return -EINVAL,
2402 };
2403
2404 esyd(&format!("{action}/chgrp"), glob, b'^')
2406}
2407
2408#[no_mangle]
2412pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2413 let action = match Action::try_from(action) {
2415 Ok(action) => action,
2416 Err(_) => return -EINVAL,
2417 };
2418
2419 esyd(&format!("{action}/chmod"), glob, b'+')
2421}
2422
2423#[no_mangle]
2428pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2429 let action = match Action::try_from(action) {
2431 Ok(action) => action,
2432 Err(_) => return -EINVAL,
2433 };
2434
2435 esyd(&format!("{action}/chmod"), glob, b'-')
2437}
2438
2439#[no_mangle]
2443pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2444 let action = match Action::try_from(action) {
2446 Ok(action) => action,
2447 Err(_) => return -EINVAL,
2448 };
2449
2450 esyd(&format!("{action}/chmod"), glob, b'^')
2452}
2453
2454#[no_mangle]
2458pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2459 let action = match Action::try_from(action) {
2461 Ok(action) => action,
2462 Err(_) => return -EINVAL,
2463 };
2464
2465 esyd(&format!("{action}/chattr"), glob, b'+')
2467}
2468
2469#[no_mangle]
2474pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2475 let action = match Action::try_from(action) {
2477 Ok(action) => action,
2478 Err(_) => return -EINVAL,
2479 };
2480
2481 esyd(&format!("{action}/chattr"), glob, b'-')
2483}
2484
2485#[no_mangle]
2489pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2490 let action = match Action::try_from(action) {
2492 Ok(action) => action,
2493 Err(_) => return -EINVAL,
2494 };
2495
2496 esyd(&format!("{action}/chattr"), glob, b'^')
2498}
2499
2500#[no_mangle]
2504pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2505 let action = match Action::try_from(action) {
2507 Ok(action) => action,
2508 Err(_) => return -EINVAL,
2509 };
2510
2511 esyd(&format!("{action}/chroot"), glob, b'+')
2513}
2514
2515#[no_mangle]
2520pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2521 let action = match Action::try_from(action) {
2523 Ok(action) => action,
2524 Err(_) => return -EINVAL,
2525 };
2526
2527 esyd(&format!("{action}/chroot"), glob, b'-')
2529}
2530
2531#[no_mangle]
2535pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2536 let action = match Action::try_from(action) {
2538 Ok(action) => action,
2539 Err(_) => return -EINVAL,
2540 };
2541
2542 esyd(&format!("{action}/chroot"), glob, b'^')
2544}
2545
2546#[no_mangle]
2550pub extern "C" fn syd_notify_add(action: action_t, glob: *const c_char) -> c_int {
2551 let action = match Action::try_from(action) {
2553 Ok(action) => action,
2554 Err(_) => return -EINVAL,
2555 };
2556
2557 esyd(&format!("{action}/notify"), glob, b'+')
2559}
2560
2561#[no_mangle]
2566pub extern "C" fn syd_notify_del(action: action_t, glob: *const c_char) -> c_int {
2567 let action = match Action::try_from(action) {
2569 Ok(action) => action,
2570 Err(_) => return -EINVAL,
2571 };
2572
2573 esyd(&format!("{action}/notify"), glob, b'-')
2575}
2576
2577#[no_mangle]
2581pub extern "C" fn syd_notify_rem(action: action_t, glob: *const c_char) -> c_int {
2582 let action = match Action::try_from(action) {
2584 Ok(action) => action,
2585 Err(_) => return -EINVAL,
2586 };
2587
2588 esyd(&format!("{action}/notify"), glob, b'^')
2590}
2591
2592#[no_mangle]
2596pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2597 let action = match Action::try_from(action) {
2599 Ok(action) => action,
2600 Err(_) => return -EINVAL,
2601 };
2602
2603 esyd(&format!("{action}/utime"), glob, b'+')
2605}
2606
2607#[no_mangle]
2612pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2613 let action = match Action::try_from(action) {
2615 Ok(action) => action,
2616 Err(_) => return -EINVAL,
2617 };
2618
2619 esyd(&format!("{action}/utime"), glob, b'-')
2621}
2622
2623#[no_mangle]
2627pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2628 let action = match Action::try_from(action) {
2630 Ok(action) => action,
2631 Err(_) => return -EINVAL,
2632 };
2633
2634 esyd(&format!("{action}/utime"), glob, b'^')
2636}
2637
2638#[no_mangle]
2642pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
2643 let action = match Action::try_from(action) {
2645 Ok(action) => action,
2646 Err(_) => return -EINVAL,
2647 };
2648
2649 esyd(&format!("{action}/mkbdev"), glob, b'+')
2651}
2652
2653#[no_mangle]
2658pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
2659 let action = match Action::try_from(action) {
2661 Ok(action) => action,
2662 Err(_) => return -EINVAL,
2663 };
2664
2665 esyd(&format!("{action}/mkbdev"), glob, b'-')
2667}
2668
2669#[no_mangle]
2673pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
2674 let action = match Action::try_from(action) {
2676 Ok(action) => action,
2677 Err(_) => return -EINVAL,
2678 };
2679
2680 esyd(&format!("{action}/mkbdev"), glob, b'^')
2682}
2683
2684#[no_mangle]
2688pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
2689 let action = match Action::try_from(action) {
2691 Ok(action) => action,
2692 Err(_) => return -EINVAL,
2693 };
2694
2695 esyd(&format!("{action}/mkcdev"), glob, b'+')
2697}
2698
2699#[no_mangle]
2704pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
2705 let action = match Action::try_from(action) {
2707 Ok(action) => action,
2708 Err(_) => return -EINVAL,
2709 };
2710
2711 esyd(&format!("{action}/mkcdev"), glob, b'-')
2713}
2714
2715#[no_mangle]
2719pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
2720 let action = match Action::try_from(action) {
2722 Ok(action) => action,
2723 Err(_) => return -EINVAL,
2724 };
2725
2726 esyd(&format!("{action}/mkcdev"), glob, b'^')
2728}
2729
2730#[no_mangle]
2734pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2735 let action = match Action::try_from(action) {
2737 Ok(action) => action,
2738 Err(_) => return -EINVAL,
2739 };
2740
2741 esyd(&format!("{action}/mkfifo"), glob, b'+')
2743}
2744
2745#[no_mangle]
2750pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2751 let action = match Action::try_from(action) {
2753 Ok(action) => action,
2754 Err(_) => return -EINVAL,
2755 };
2756
2757 esyd(&format!("{action}/mkfifo"), glob, b'-')
2759}
2760
2761#[no_mangle]
2765pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2766 let action = match Action::try_from(action) {
2768 Ok(action) => action,
2769 Err(_) => return -EINVAL,
2770 };
2771
2772 esyd(&format!("{action}/mkfifo"), glob, b'^')
2774}
2775
2776#[no_mangle]
2780pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2781 let action = match Action::try_from(action) {
2783 Ok(action) => action,
2784 Err(_) => return -EINVAL,
2785 };
2786
2787 esyd(&format!("{action}/mktemp"), glob, b'+')
2789}
2790
2791#[no_mangle]
2796pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2797 let action = match Action::try_from(action) {
2799 Ok(action) => action,
2800 Err(_) => return -EINVAL,
2801 };
2802
2803 esyd(&format!("{action}/mktemp"), glob, b'-')
2805}
2806
2807#[no_mangle]
2811pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2812 let action = match Action::try_from(action) {
2814 Ok(action) => action,
2815 Err(_) => return -EINVAL,
2816 };
2817
2818 esyd(&format!("{action}/mktemp"), glob, b'^')
2820}
2821
2822#[no_mangle]
2826pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2827 let action = match Action::try_from(action) {
2829 Ok(action) => action,
2830 Err(_) => return -EINVAL,
2831 };
2832
2833 esyd(&format!("{action}/net/bind"), glob, b'+')
2835}
2836
2837#[no_mangle]
2842pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2843 let action = match Action::try_from(action) {
2845 Ok(action) => action,
2846 Err(_) => return -EINVAL,
2847 };
2848
2849 esyd(&format!("{action}/net/bind"), glob, b'-')
2851}
2852
2853#[no_mangle]
2857pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
2858 let action = match Action::try_from(action) {
2860 Ok(action) => action,
2861 Err(_) => return -EINVAL,
2862 };
2863
2864 esyd(&format!("{action}/net/bind"), glob, b'^')
2866}
2867
2868#[no_mangle]
2872pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
2873 let action = match Action::try_from(action) {
2875 Ok(action) => action,
2876 Err(_) => return -EINVAL,
2877 };
2878
2879 esyd(&format!("{action}/net/connect"), glob, b'+')
2881}
2882
2883#[no_mangle]
2888pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
2889 let action = match Action::try_from(action) {
2891 Ok(action) => action,
2892 Err(_) => return -EINVAL,
2893 };
2894
2895 esyd(&format!("{action}/net/connect"), glob, b'-')
2897}
2898
2899#[no_mangle]
2903pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
2904 let action = match Action::try_from(action) {
2906 Ok(action) => action,
2907 Err(_) => return -EINVAL,
2908 };
2909
2910 esyd(&format!("{action}/net/connect"), glob, b'^')
2912}
2913
2914#[no_mangle]
2918pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
2919 let action = match Action::try_from(action) {
2921 Ok(action) => action,
2922 Err(_) => return -EINVAL,
2923 };
2924
2925 esyd(&format!("{action}/net/sendfd"), glob, b'+')
2927}
2928
2929#[no_mangle]
2934pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
2935 let action = match Action::try_from(action) {
2937 Ok(action) => action,
2938 Err(_) => return -EINVAL,
2939 };
2940
2941 esyd(&format!("{action}/net/sendfd"), glob, b'-')
2943}
2944
2945#[no_mangle]
2949pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
2950 let action = match Action::try_from(action) {
2952 Ok(action) => action,
2953 Err(_) => return -EINVAL,
2954 };
2955
2956 esyd(&format!("{action}/net/sendfd"), glob, b'^')
2958}
2959
2960#[no_mangle]
2964pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
2965 let action = match Action::try_from(action) {
2967 Ok(action) => action,
2968 Err(_) => return -EINVAL,
2969 };
2970
2971 esyd(&format!("{action}/net/link"), family, b'+')
2973}
2974
2975#[no_mangle]
2980pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
2981 let action = match Action::try_from(action) {
2983 Ok(action) => action,
2984 Err(_) => return -EINVAL,
2985 };
2986
2987 esyd(&format!("{action}/net/link"), family, b'-')
2989}
2990
2991#[no_mangle]
2995pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
2996 let action = match Action::try_from(action) {
2998 Ok(action) => action,
2999 Err(_) => return -EINVAL,
3000 };
3001
3002 esyd(&format!("{action}/net/link"), family, b'^')
3004}
3005
3006#[no_mangle]
3012pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
3013 esyd("mem/max", size, b':')
3014}
3015
3016#[no_mangle]
3022pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
3023 esyd("mem/vm_max", size, b':')
3024}
3025
3026#[no_mangle]
3030pub extern "C" fn syd_pid_max(size: usize) -> c_int {
3031 stat(&format!("/dev/syd/pid/max:{size}"))
3032}
3033
3034#[no_mangle]
3039pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
3040 stat(&format!("/dev/syd/segvguard/expiry:{timeout}"))
3041}
3042
3043#[no_mangle]
3047pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
3048 stat(&format!("/dev/syd/segvguard/suspension:{timeout}"))
3049}
3050
3051#[no_mangle]
3055pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
3056 stat(&format!("/dev/syd/segvguard/maxcrashes:{max}"))
3057}
3058
3059#[no_mangle]
3085pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
3086 if file.is_null() || argv.is_null() {
3087 return -EFAULT;
3088 }
3089
3090 let file = CStr::from_ptr(file);
3092 let file = OsStr::from_bytes(file.to_bytes());
3093
3094 let mut path = OsString::from("/dev/syd/cmd/exec!");
3095 path.push(file);
3096
3097 let mut idx: isize = 0;
3098 while !(*argv.offset(idx)).is_null() {
3099 let arg = CStr::from_ptr(*argv.offset(idx));
3101 let arg = OsStr::from_bytes(arg.to_bytes());
3102
3103 path.push(OsStr::from_bytes(&[b'\x1F'])); path.push(arg);
3105
3106 idx = idx.saturating_add(1);
3107 }
3108
3109 let path = PathBuf::from(path);
3110 stat(path)
3111}