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_ON: lock_state_t = 2;
92
93#[repr(u8)]
95#[derive(Copy, Clone, Debug)]
96enum LockState {
97 Off = LOCK_OFF,
99 Exec = LOCK_EXEC,
102 On = LOCK_ON,
104}
105
106impl TryFrom<lock_state_t> for LockState {
107 type Error = ();
108
109 fn try_from(value: lock_state_t) -> Result<Self, Self::Error> {
110 match value {
111 LOCK_OFF => Ok(LockState::Off),
112 LOCK_EXEC => Ok(LockState::Exec),
113 LOCK_ON => Ok(LockState::On),
114 _ => Err(()),
115 }
116 }
117}
118
119impl fmt::Display for LockState {
120 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
121 let state_str = match self {
122 LockState::Off => "off",
123 LockState::Exec => "exec",
124 LockState::On => "on",
125 };
126 write!(f, "{state_str}")
127 }
128}
129
130#[expect(non_camel_case_types)]
132pub type action_t = u8;
133
134pub const ACTION_ALLOW: action_t = 0;
136pub const ACTION_WARN: action_t = 1;
138pub const ACTION_FILTER: action_t = 2;
140pub const ACTION_DENY: action_t = 3;
142pub const ACTION_PANIC: action_t = 4;
144pub const ACTION_STOP: action_t = 5;
146pub const ACTION_ABORT: action_t = 6;
148pub const ACTION_KILL: action_t = 7;
150pub const ACTION_EXIT: action_t = 8;
152
153#[repr(u8)]
155#[derive(Copy, Clone, Debug)]
156enum Action {
157 Allow = ACTION_ALLOW,
159 Warn = ACTION_WARN,
161 Filter = ACTION_FILTER,
163 Deny = ACTION_DENY,
165 Panic = ACTION_PANIC,
167 Stop = ACTION_STOP,
169 Abort = ACTION_ABORT,
171 Kill = ACTION_KILL,
173 Exit = ACTION_EXIT,
175}
176
177impl TryFrom<action_t> for Action {
178 type Error = ();
179
180 fn try_from(value: action_t) -> Result<Self, Self::Error> {
181 match value {
182 ACTION_ALLOW => Ok(Action::Allow),
183 ACTION_WARN => Ok(Action::Warn),
184 ACTION_FILTER => Ok(Action::Filter),
185 ACTION_DENY => Ok(Action::Deny),
186 ACTION_PANIC => Ok(Action::Panic),
187 ACTION_STOP => Ok(Action::Stop),
188 ACTION_ABORT => Ok(Action::Abort),
189 ACTION_KILL => Ok(Action::Kill),
190 ACTION_EXIT => Ok(Action::Exit),
191 _ => Err(()),
192 }
193 }
194}
195
196impl fmt::Display for Action {
197 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
198 let action_str = match self {
199 Action::Allow => "allow",
200 Action::Warn => "warn",
201 Action::Filter => "filter",
202 Action::Deny => "deny",
203 Action::Panic => "panic",
204 Action::Stop => "stop",
205 Action::Abort => "abort",
206 Action::Kill => "kill",
207 Action::Exit => "exit",
208 };
209 write!(f, "{action_str}")
210 }
211}
212
213const EFAULT: i32 = 14;
214const EINVAL: i32 = 22;
215const LIB_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR");
216const SYD_ATIME: i64 = 505958400;
217const SYD_CTIME: i64 = -2036448000;
218const SYD_MTIME: i64 = -842745600;
219
220fn check_stat(stat: &Metadata) -> bool {
221 let lib_major = if let Ok(lib_major) = LIB_MAJOR.parse() {
222 lib_major
223 } else {
224 return false;
225 };
226
227 if !stat.file_type().is_char_device() {
229 return false;
230 }
231
232 if stat.st_atime() != SYD_ATIME {
234 return false;
235 }
236 if stat.st_ctime() != SYD_CTIME {
237 return false;
238 }
239 if stat.st_mtime() != SYD_MTIME {
240 return false;
241 }
242
243 let rdev = stat.rdev();
244
245 let api_major = (rdev >> 8) & 0xff;
246 let api_minor = rdev & 0xff;
247
248 api_major == lib_major && api_minor >= 1
251}
252
253fn stat<P: AsRef<Path>>(path: P) -> c_int {
254 match symlink_metadata(path) {
255 Ok(stat) if check_stat(&stat) => 0,
256 Ok(_) => -EINVAL,
257 Err(error) => match error.raw_os_error() {
258 Some(e) => e.checked_neg().unwrap_or(-EINVAL),
259 None => -EINVAL,
260 },
261 }
262}
263
264fn esyd<P: AsRef<Path>>(rule: P, elem: *const c_char, op: u8) -> c_int {
265 if !matches!(op, b'+' | b'-' | b'^' | b':') {
266 return -EINVAL;
267 }
268
269 if elem.is_null() {
270 return -EFAULT;
271 }
272
273 let elem = unsafe { CStr::from_ptr(elem) };
275 let elem = OsStr::from_bytes(elem.to_bytes());
276
277 let mut path = OsString::from("/dev/syd/");
279 path.push(rule.as_ref());
280 path.push(OsStr::from_bytes(&[op]));
281 path.push(elem);
282
283 let path = PathBuf::from(path);
285
286 stat(path)
287}
288
289#[no_mangle]
296pub extern "C" fn syd_api() -> c_int {
297 match stat("/dev/syd/3") {
298 0 => 3,
299 n => n,
300 }
301}
302
303#[no_mangle]
307pub extern "C" fn syd_check() -> c_int {
308 stat("/dev/syd")
309}
310
311#[no_mangle]
315pub extern "C" fn syd_panic() -> c_int {
316 stat("/dev/syd/panic")
317}
318
319#[no_mangle]
324pub extern "C" fn syd_reset() -> c_int {
325 stat("/dev/syd/reset")
326}
327
328#[no_mangle]
332pub extern "C" fn syd_load(fd: c_int) -> c_int {
333 let fd = match RawFd::try_from(fd) {
334 Ok(fd) if fd < 0 => return -EINVAL,
335 Ok(fd) => fd,
336 Err(_) => return -EINVAL,
337 };
338 stat(&format!("/dev/syd/load/{fd}"))
339}
340
341#[no_mangle]
347pub extern "C" fn syd_lock(state: lock_state_t) -> c_int {
348 let state = match LockState::try_from(state) {
350 Ok(state) => state,
351 Err(_) => return -EINVAL,
352 };
353
354 stat(&format!("/dev/syd/lock:{state}"))
355}
356
357#[no_mangle]
361pub extern "C" fn syd_enabled_fs() -> bool {
362 stat("/dev/syd/sandbox/fs?") == 0
363}
364
365#[no_mangle]
369pub extern "C" fn syd_enable_fs() -> c_int {
370 stat("/dev/syd/sandbox/fs:on")
371}
372
373#[no_mangle]
377pub extern "C" fn syd_disable_fs() -> c_int {
378 stat("/dev/syd/sandbox/fs:off")
379}
380
381#[no_mangle]
385pub extern "C" fn syd_enabled_walk() -> bool {
386 stat("/dev/syd/sandbox/walk?") == 0
387}
388
389#[no_mangle]
393pub extern "C" fn syd_enable_walk() -> c_int {
394 stat("/dev/syd/sandbox/walk:on")
395}
396
397#[no_mangle]
401pub extern "C" fn syd_disable_walk() -> c_int {
402 stat("/dev/syd/sandbox/walk:off")
403}
404
405#[no_mangle]
409pub extern "C" fn syd_enabled_stat() -> bool {
410 stat("/dev/syd/sandbox/stat?") == 0
411}
412
413#[no_mangle]
417pub extern "C" fn syd_enable_stat() -> c_int {
418 stat("/dev/syd/sandbox/stat:on")
419}
420
421#[no_mangle]
425pub extern "C" fn syd_disable_stat() -> c_int {
426 stat("/dev/syd/sandbox/stat:off")
427}
428
429#[no_mangle]
433pub extern "C" fn syd_enabled_read() -> bool {
434 stat("/dev/syd/sandbox/read?") == 0
435}
436
437#[no_mangle]
441pub extern "C" fn syd_enable_read() -> c_int {
442 stat("/dev/syd/sandbox/read:on")
443}
444
445#[no_mangle]
449pub extern "C" fn syd_disable_read() -> c_int {
450 stat("/dev/syd/sandbox/read:off")
451}
452
453#[no_mangle]
457pub extern "C" fn syd_enabled_write() -> bool {
458 stat("/dev/syd/sandbox/write?") == 0
459}
460
461#[no_mangle]
465pub extern "C" fn syd_enable_write() -> c_int {
466 stat("/dev/syd/sandbox/write:on")
467}
468
469#[no_mangle]
473pub extern "C" fn syd_disable_write() -> c_int {
474 stat("/dev/syd/sandbox/write:off")
475}
476
477#[no_mangle]
481pub extern "C" fn syd_enabled_exec() -> bool {
482 stat("/dev/syd/sandbox/exec?") == 0
483}
484
485#[no_mangle]
489pub extern "C" fn syd_enable_exec() -> c_int {
490 stat("/dev/syd/sandbox/exec:on")
491}
492
493#[no_mangle]
497pub extern "C" fn syd_disable_exec() -> c_int {
498 stat("/dev/syd/sandbox/exec:off")
499}
500
501#[no_mangle]
505pub extern "C" fn syd_enabled_ioctl() -> bool {
506 stat("/dev/syd/sandbox/ioctl?") == 0
507}
508
509#[no_mangle]
513pub extern "C" fn syd_enable_ioctl() -> c_int {
514 stat("/dev/syd/sandbox/ioctl:on")
515}
516
517#[no_mangle]
521pub extern "C" fn syd_disable_ioctl() -> c_int {
522 stat("/dev/syd/sandbox/ioctl:off")
523}
524
525#[no_mangle]
529pub extern "C" fn syd_enabled_create() -> bool {
530 stat("/dev/syd/sandbox/create?") == 0
531}
532
533#[no_mangle]
537pub extern "C" fn syd_enable_create() -> c_int {
538 stat("/dev/syd/sandbox/create:on")
539}
540
541#[no_mangle]
545pub extern "C" fn syd_disable_create() -> c_int {
546 stat("/dev/syd/sandbox/create:off")
547}
548
549#[no_mangle]
553pub extern "C" fn syd_enabled_delete() -> bool {
554 stat("/dev/syd/sandbox/delete?") == 0
555}
556
557#[no_mangle]
561pub extern "C" fn syd_enable_delete() -> c_int {
562 stat("/dev/syd/sandbox/delete:on")
563}
564
565#[no_mangle]
569pub extern "C" fn syd_disable_delete() -> c_int {
570 stat("/dev/syd/sandbox/delete:off")
571}
572
573#[no_mangle]
577pub extern "C" fn syd_enabled_rename() -> bool {
578 stat("/dev/syd/sandbox/rename?") == 0
579}
580
581#[no_mangle]
585pub extern "C" fn syd_enable_rename() -> c_int {
586 stat("/dev/syd/sandbox/rename:on")
587}
588
589#[no_mangle]
593pub extern "C" fn syd_disable_rename() -> c_int {
594 stat("/dev/syd/sandbox/rename:off")
595}
596
597#[no_mangle]
601pub extern "C" fn syd_enabled_symlink() -> bool {
602 stat("/dev/syd/sandbox/symlink?") == 0
603}
604
605#[no_mangle]
609pub extern "C" fn syd_enable_symlink() -> c_int {
610 stat("/dev/syd/sandbox/symlink:on")
611}
612
613#[no_mangle]
617pub extern "C" fn syd_disable_symlink() -> c_int {
618 stat("/dev/syd/sandbox/symlink:off")
619}
620
621#[no_mangle]
625pub extern "C" fn syd_enabled_truncate() -> bool {
626 stat("/dev/syd/sandbox/truncate?") == 0
627}
628
629#[no_mangle]
633pub extern "C" fn syd_enable_truncate() -> c_int {
634 stat("/dev/syd/sandbox/truncate:on")
635}
636
637#[no_mangle]
641pub extern "C" fn syd_disable_truncate() -> c_int {
642 stat("/dev/syd/sandbox/truncate:off")
643}
644
645#[no_mangle]
649pub extern "C" fn syd_enabled_chdir() -> bool {
650 stat("/dev/syd/sandbox/chdir?") == 0
651}
652
653#[no_mangle]
657pub extern "C" fn syd_enable_chdir() -> c_int {
658 stat("/dev/syd/sandbox/chdir:on")
659}
660
661#[no_mangle]
665pub extern "C" fn syd_disable_chdir() -> c_int {
666 stat("/dev/syd/sandbox/chdir:off")
667}
668
669#[no_mangle]
673pub extern "C" fn syd_enabled_readdir() -> bool {
674 stat("/dev/syd/sandbox/readdir?") == 0
675}
676
677#[no_mangle]
681pub extern "C" fn syd_enable_readdir() -> c_int {
682 stat("/dev/syd/sandbox/readdir:on")
683}
684
685#[no_mangle]
689pub extern "C" fn syd_disable_readdir() -> c_int {
690 stat("/dev/syd/sandbox/readdir:off")
691}
692
693#[no_mangle]
697pub extern "C" fn syd_enabled_mkdir() -> bool {
698 stat("/dev/syd/sandbox/mkdir?") == 0
699}
700
701#[no_mangle]
705pub extern "C" fn syd_enable_mkdir() -> c_int {
706 stat("/dev/syd/sandbox/mkdir:on")
707}
708
709#[no_mangle]
713pub extern "C" fn syd_disable_mkdir() -> c_int {
714 stat("/dev/syd/sandbox/mkdir:off")
715}
716
717#[no_mangle]
721pub extern "C" fn syd_enabled_rmdir() -> bool {
722 stat("/dev/syd/sandbox/rmdir?") == 0
723}
724
725#[no_mangle]
729pub extern "C" fn syd_enable_rmdir() -> c_int {
730 stat("/dev/syd/sandbox/rmdir:on")
731}
732
733#[no_mangle]
737pub extern "C" fn syd_disable_rmdir() -> c_int {
738 stat("/dev/syd/sandbox/rmdir:off")
739}
740
741#[no_mangle]
745pub extern "C" fn syd_enabled_chown() -> bool {
746 stat("/dev/syd/sandbox/chown?") == 0
747}
748
749#[no_mangle]
753pub extern "C" fn syd_enable_chown() -> c_int {
754 stat("/dev/syd/sandbox/chown:on")
755}
756
757#[no_mangle]
761pub extern "C" fn syd_disable_chown() -> c_int {
762 stat("/dev/syd/sandbox/chown:off")
763}
764
765#[no_mangle]
769pub extern "C" fn syd_enabled_chgrp() -> bool {
770 stat("/dev/syd/sandbox/chgrp?") == 0
771}
772
773#[no_mangle]
777pub extern "C" fn syd_enable_chgrp() -> c_int {
778 stat("/dev/syd/sandbox/chgrp:on")
779}
780
781#[no_mangle]
785pub extern "C" fn syd_disable_chgrp() -> c_int {
786 stat("/dev/syd/sandbox/chgrp:off")
787}
788
789#[no_mangle]
793pub extern "C" fn syd_enabled_chmod() -> bool {
794 stat("/dev/syd/sandbox/chmod?") == 0
795}
796
797#[no_mangle]
801pub extern "C" fn syd_enable_chmod() -> c_int {
802 stat("/dev/syd/sandbox/chmod:on")
803}
804
805#[no_mangle]
809pub extern "C" fn syd_disable_chmod() -> c_int {
810 stat("/dev/syd/sandbox/chmod:off")
811}
812
813#[no_mangle]
817pub extern "C" fn syd_enabled_chattr() -> bool {
818 stat("/dev/syd/sandbox/chattr?") == 0
819}
820
821#[no_mangle]
825pub extern "C" fn syd_enable_chattr() -> c_int {
826 stat("/dev/syd/sandbox/chattr:on")
827}
828
829#[no_mangle]
833pub extern "C" fn syd_disable_chattr() -> c_int {
834 stat("/dev/syd/sandbox/chattr:off")
835}
836
837#[no_mangle]
841pub extern "C" fn syd_enabled_chroot() -> bool {
842 stat("/dev/syd/sandbox/chroot?") == 0
843}
844
845#[no_mangle]
849pub extern "C" fn syd_enable_chroot() -> c_int {
850 stat("/dev/syd/sandbox/chroot:on")
851}
852
853#[no_mangle]
857pub extern "C" fn syd_disable_chroot() -> c_int {
858 stat("/dev/syd/sandbox/chroot:off")
859}
860
861#[no_mangle]
865pub extern "C" fn syd_enabled_utime() -> bool {
866 stat("/dev/syd/sandbox/utime?") == 0
867}
868
869#[no_mangle]
873pub extern "C" fn syd_enable_utime() -> c_int {
874 stat("/dev/syd/sandbox/utime:on")
875}
876
877#[no_mangle]
881pub extern "C" fn syd_disable_utime() -> c_int {
882 stat("/dev/syd/sandbox/utime:off")
883}
884
885#[no_mangle]
889pub extern "C" fn syd_enabled_mkbdev() -> bool {
890 stat("/dev/syd/sandbox/mkbdev?") == 0
891}
892
893#[no_mangle]
897pub extern "C" fn syd_enable_mkbdev() -> c_int {
898 stat("/dev/syd/sandbox/mkbdev:on")
899}
900
901#[no_mangle]
905pub extern "C" fn syd_disable_mkbdev() -> c_int {
906 stat("/dev/syd/sandbox/mkbdev:off")
907}
908
909#[no_mangle]
913pub extern "C" fn syd_enabled_mkcdev() -> bool {
914 stat("/dev/syd/sandbox/mkcdev?") == 0
915}
916
917#[no_mangle]
921pub extern "C" fn syd_enable_mkcdev() -> c_int {
922 stat("/dev/syd/sandbox/mkcdev:on")
923}
924
925#[no_mangle]
929pub extern "C" fn syd_disable_mkcdev() -> c_int {
930 stat("/dev/syd/sandbox/mkcdev:off")
931}
932
933#[no_mangle]
937pub extern "C" fn syd_enabled_mkfifo() -> bool {
938 stat("/dev/syd/sandbox/mkfifo?") == 0
939}
940
941#[no_mangle]
945pub extern "C" fn syd_enable_mkfifo() -> c_int {
946 stat("/dev/syd/sandbox/mkfifo:on")
947}
948
949#[no_mangle]
953pub extern "C" fn syd_disable_mkfifo() -> c_int {
954 stat("/dev/syd/sandbox/mkfifo:off")
955}
956
957#[no_mangle]
961pub extern "C" fn syd_enabled_mktemp() -> bool {
962 stat("/dev/syd/sandbox/mktemp?") == 0
963}
964
965#[no_mangle]
969pub extern "C" fn syd_enable_mktemp() -> c_int {
970 stat("/dev/syd/sandbox/mktemp:on")
971}
972
973#[no_mangle]
977pub extern "C" fn syd_disable_mktemp() -> c_int {
978 stat("/dev/syd/sandbox/mktemp:off")
979}
980
981#[no_mangle]
985pub extern "C" fn syd_enabled_net() -> bool {
986 stat("/dev/syd/sandbox/net?") == 0
987}
988
989#[no_mangle]
993pub extern "C" fn syd_enable_net() -> c_int {
994 stat("/dev/syd/sandbox/net:on")
995}
996
997#[no_mangle]
1001pub extern "C" fn syd_disable_net() -> c_int {
1002 stat("/dev/syd/sandbox/net:off")
1003}
1004
1005#[no_mangle]
1009pub extern "C" fn syd_enabled_mem() -> bool {
1010 stat("/dev/syd/sandbox/mem?") == 0
1011}
1012
1013#[no_mangle]
1017pub extern "C" fn syd_enable_mem() -> c_int {
1018 stat("/dev/syd/sandbox/mem:on")
1019}
1020
1021#[no_mangle]
1025pub extern "C" fn syd_disable_mem() -> c_int {
1026 stat("/dev/syd/sandbox/mem:off")
1027}
1028
1029#[no_mangle]
1033pub extern "C" fn syd_enabled_pid() -> bool {
1034 stat("/dev/syd/sandbox/pid?") == 0
1035}
1036
1037#[no_mangle]
1041pub extern "C" fn syd_enable_pid() -> c_int {
1042 stat("/dev/syd/sandbox/pid:on")
1043}
1044
1045#[no_mangle]
1049pub extern "C" fn syd_disable_pid() -> c_int {
1050 stat("/dev/syd/sandbox/pid:off")
1051}
1052
1053#[no_mangle]
1057pub extern "C" fn syd_enabled_lock() -> bool {
1058 stat("/dev/syd/sandbox/lock?") == 0
1059}
1060
1061#[no_mangle]
1065pub extern "C" fn syd_enabled_crypt() -> bool {
1066 stat("/dev/syd/sandbox/crypt?") == 0
1067}
1068
1069#[no_mangle]
1073pub extern "C" fn syd_enabled_proxy() -> bool {
1074 stat("/dev/syd/sandbox/proxy?") == 0
1075}
1076
1077#[no_mangle]
1081pub extern "C" fn syd_enabled_force() -> bool {
1082 stat("/dev/syd/sandbox/force?") == 0
1083}
1084
1085#[no_mangle]
1089pub extern "C" fn syd_enable_force() -> c_int {
1090 stat("/dev/syd/sandbox/force:on")
1091}
1092
1093#[no_mangle]
1097pub extern "C" fn syd_disable_force() -> c_int {
1098 stat("/dev/syd/sandbox/force:off")
1099}
1100
1101#[no_mangle]
1105pub extern "C" fn syd_enabled_tpe() -> bool {
1106 stat("/dev/syd/sandbox/tpe?") == 0
1107}
1108
1109#[no_mangle]
1113pub extern "C" fn syd_enable_tpe() -> c_int {
1114 stat("/dev/syd/sandbox/tpe:on")
1115}
1116
1117#[no_mangle]
1121pub extern "C" fn syd_disable_tpe() -> c_int {
1122 stat("/dev/syd/sandbox/tpe:off")
1123}
1124
1125#[no_mangle]
1127pub extern "C" fn syd_default_fs(action: action_t) -> c_int {
1128 let action = match Action::try_from(action) {
1130 Ok(action) => action,
1131 Err(_) => return -EINVAL,
1132 };
1133 stat(&format!("/dev/syd/default/fs:{action}"))
1134}
1135
1136#[no_mangle]
1138pub extern "C" fn syd_default_walk(action: action_t) -> c_int {
1139 let action = match Action::try_from(action) {
1141 Ok(action) => action,
1142 Err(_) => return -EINVAL,
1143 };
1144 stat(&format!("/dev/syd/default/walk:{action}"))
1145}
1146
1147#[no_mangle]
1149pub extern "C" fn syd_default_stat(action: action_t) -> c_int {
1150 let action = match Action::try_from(action) {
1152 Ok(action) => action,
1153 Err(_) => return -EINVAL,
1154 };
1155 stat(&format!("/dev/syd/default/stat:{action}"))
1156}
1157
1158#[no_mangle]
1160pub extern "C" fn syd_default_read(action: action_t) -> c_int {
1161 let action = match Action::try_from(action) {
1163 Ok(action) => action,
1164 Err(_) => return -EINVAL,
1165 };
1166 stat(&format!("/dev/syd/default/read:{action}"))
1167}
1168
1169#[no_mangle]
1171pub extern "C" fn syd_default_write(action: action_t) -> c_int {
1172 let action = match Action::try_from(action) {
1174 Ok(action) => action,
1175 Err(_) => return -EINVAL,
1176 };
1177 stat(&format!("/dev/syd/default/write:{action}"))
1178}
1179
1180#[no_mangle]
1182pub extern "C" fn syd_default_exec(action: action_t) -> c_int {
1183 let action = match Action::try_from(action) {
1185 Ok(action) => action,
1186 Err(_) => return -EINVAL,
1187 };
1188 stat(&format!("/dev/syd/default/exec:{action}"))
1189}
1190
1191#[no_mangle]
1193pub extern "C" fn syd_default_ioctl(action: action_t) -> c_int {
1194 let action = match Action::try_from(action) {
1196 Ok(action) => action,
1197 Err(_) => return -EINVAL,
1198 };
1199 stat(&format!("/dev/syd/default/ioctl:{action}"))
1200}
1201
1202#[no_mangle]
1204pub extern "C" fn syd_default_create(action: action_t) -> c_int {
1205 let action = match Action::try_from(action) {
1207 Ok(action) => action,
1208 Err(_) => return -EINVAL,
1209 };
1210 stat(&format!("/dev/syd/default/create:{action}"))
1211}
1212
1213#[no_mangle]
1215pub extern "C" fn syd_default_delete(action: action_t) -> c_int {
1216 let action = match Action::try_from(action) {
1218 Ok(action) => action,
1219 Err(_) => return -EINVAL,
1220 };
1221 stat(&format!("/dev/syd/default/delete:{action}"))
1222}
1223
1224#[no_mangle]
1226pub extern "C" fn syd_default_rename(action: action_t) -> c_int {
1227 let action = match Action::try_from(action) {
1229 Ok(action) => action,
1230 Err(_) => return -EINVAL,
1231 };
1232 stat(&format!("/dev/syd/default/rename:{action}"))
1233}
1234
1235#[no_mangle]
1237pub extern "C" fn syd_default_symlink(action: action_t) -> c_int {
1238 let action = match Action::try_from(action) {
1240 Ok(action) => action,
1241 Err(_) => return -EINVAL,
1242 };
1243 stat(&format!("/dev/syd/default/symlink:{action}"))
1244}
1245
1246#[no_mangle]
1248pub extern "C" fn syd_default_truncate(action: action_t) -> c_int {
1249 let action = match Action::try_from(action) {
1251 Ok(action) => action,
1252 Err(_) => return -EINVAL,
1253 };
1254 stat(&format!("/dev/syd/default/truncate:{action}"))
1255}
1256
1257#[no_mangle]
1259pub extern "C" fn syd_default_chdir(action: action_t) -> c_int {
1260 let action = match Action::try_from(action) {
1262 Ok(action) => action,
1263 Err(_) => return -EINVAL,
1264 };
1265 stat(&format!("/dev/syd/default/chdir:{action}"))
1266}
1267
1268#[no_mangle]
1270pub extern "C" fn syd_default_readdir(action: action_t) -> c_int {
1271 let action = match Action::try_from(action) {
1273 Ok(action) => action,
1274 Err(_) => return -EINVAL,
1275 };
1276 stat(&format!("/dev/syd/default/readdir:{action}"))
1277}
1278
1279#[no_mangle]
1281pub extern "C" fn syd_default_mkdir(action: action_t) -> c_int {
1282 let action = match Action::try_from(action) {
1284 Ok(action) => action,
1285 Err(_) => return -EINVAL,
1286 };
1287 stat(&format!("/dev/syd/default/mkdir:{action}"))
1288}
1289
1290#[no_mangle]
1292pub extern "C" fn syd_default_rmdir(action: action_t) -> c_int {
1293 let action = match Action::try_from(action) {
1295 Ok(action) => action,
1296 Err(_) => return -EINVAL,
1297 };
1298 stat(&format!("/dev/syd/default/rmdir:{action}"))
1299}
1300
1301#[no_mangle]
1303pub extern "C" fn syd_default_chown(action: action_t) -> c_int {
1304 let action = match Action::try_from(action) {
1306 Ok(action) => action,
1307 Err(_) => return -EINVAL,
1308 };
1309 stat(&format!("/dev/syd/default/chown:{action}"))
1310}
1311
1312#[no_mangle]
1314pub extern "C" fn syd_default_chgrp(action: action_t) -> c_int {
1315 let action = match Action::try_from(action) {
1317 Ok(action) => action,
1318 Err(_) => return -EINVAL,
1319 };
1320 stat(&format!("/dev/syd/default/chgrp:{action}"))
1321}
1322
1323#[no_mangle]
1325pub extern "C" fn syd_default_chmod(action: action_t) -> c_int {
1326 let action = match Action::try_from(action) {
1328 Ok(action) => action,
1329 Err(_) => return -EINVAL,
1330 };
1331 stat(&format!("/dev/syd/default/chmod:{action}"))
1332}
1333
1334#[no_mangle]
1336pub extern "C" fn syd_default_chattr(action: action_t) -> c_int {
1337 let action = match Action::try_from(action) {
1339 Ok(action) => action,
1340 Err(_) => return -EINVAL,
1341 };
1342 stat(&format!("/dev/syd/default/chattr:{action}"))
1343}
1344
1345#[no_mangle]
1347pub extern "C" fn syd_default_chroot(action: action_t) -> c_int {
1348 let action = match Action::try_from(action) {
1350 Ok(action) => action,
1351 Err(_) => return -EINVAL,
1352 };
1353 stat(&format!("/dev/syd/default/chroot:{action}"))
1354}
1355
1356#[no_mangle]
1358pub extern "C" fn syd_default_utime(action: action_t) -> c_int {
1359 let action = match Action::try_from(action) {
1361 Ok(action) => action,
1362 Err(_) => return -EINVAL,
1363 };
1364 stat(&format!("/dev/syd/default/utime:{action}"))
1365}
1366
1367#[no_mangle]
1369pub extern "C" fn syd_default_mkbdev(action: action_t) -> c_int {
1370 let action = match Action::try_from(action) {
1372 Ok(action) => action,
1373 Err(_) => return -EINVAL,
1374 };
1375 stat(&format!("/dev/syd/default/mkbdev:{action}"))
1376}
1377
1378#[no_mangle]
1380pub extern "C" fn syd_default_mkcdev(action: action_t) -> c_int {
1381 let action = match Action::try_from(action) {
1383 Ok(action) => action,
1384 Err(_) => return -EINVAL,
1385 };
1386 stat(&format!("/dev/syd/default/mkcdev:{action}"))
1387}
1388
1389#[no_mangle]
1391pub extern "C" fn syd_default_mkfifo(action: action_t) -> c_int {
1392 let action = match Action::try_from(action) {
1394 Ok(action) => action,
1395 Err(_) => return -EINVAL,
1396 };
1397 stat(&format!("/dev/syd/default/mkfifo:{action}"))
1398}
1399
1400#[no_mangle]
1402pub extern "C" fn syd_default_mktemp(action: action_t) -> c_int {
1403 let action = match Action::try_from(action) {
1405 Ok(action) => action,
1406 Err(_) => return -EINVAL,
1407 };
1408 stat(&format!("/dev/syd/default/mktemp:{action}"))
1409}
1410
1411#[no_mangle]
1413pub extern "C" fn syd_default_net(action: action_t) -> c_int {
1414 let action = match Action::try_from(action) {
1416 Ok(action) => action,
1417 Err(_) => return -EINVAL,
1418 };
1419 stat(&format!("/dev/syd/default/net:{action}"))
1420}
1421
1422#[no_mangle]
1424pub extern "C" fn syd_default_block(action: action_t) -> c_int {
1425 let action = match Action::try_from(action) {
1427 Ok(action) => action,
1428 Err(_) => return -EINVAL,
1429 };
1430 stat(&format!("/dev/syd/default/block:{action}"))
1431}
1432
1433#[no_mangle]
1435pub extern "C" fn syd_default_mem(action: action_t) -> c_int {
1436 let action = match Action::try_from(action) {
1438 Ok(action) => action,
1439 Err(_) => return -EINVAL,
1440 };
1441 stat(&format!("/dev/syd/default/mem:{action}"))
1442}
1443
1444#[no_mangle]
1446pub extern "C" fn syd_default_pid(action: action_t) -> c_int {
1447 let action = match Action::try_from(action) {
1449 Ok(action) => action,
1450 Err(_) => return -EINVAL,
1451 };
1452 stat(&format!("/dev/syd/default/pid:{action}"))
1453}
1454
1455#[no_mangle]
1457pub extern "C" fn syd_default_force(action: action_t) -> c_int {
1458 let action = match Action::try_from(action) {
1460 Ok(action) => action,
1461 Err(_) => return -EINVAL,
1462 };
1463 stat(&format!("/dev/syd/default/force:{action}"))
1464}
1465
1466#[no_mangle]
1468pub extern "C" fn syd_default_segvguard(action: action_t) -> c_int {
1469 let action = match Action::try_from(action) {
1471 Ok(action) => action,
1472 Err(_) => return -EINVAL,
1473 };
1474 stat(&format!("/dev/syd/default/segvguard:{action}"))
1475}
1476
1477#[no_mangle]
1479pub extern "C" fn syd_default_tpe(action: action_t) -> c_int {
1480 let action = match Action::try_from(action) {
1482 Ok(action) => action,
1483 Err(_) => return -EINVAL,
1484 };
1485 stat(&format!("/dev/syd/default/tpe:{action}"))
1486}
1487
1488#[no_mangle]
1490pub extern "C" fn syd_ioctl_deny(request: u64) -> c_int {
1491 stat(&format!("/dev/syd/deny/ioctl+{request}"))
1492}
1493
1494#[no_mangle]
1509pub unsafe extern "C" fn syd_force_add(
1510 path: *const c_char,
1511 hash: *const c_char,
1512 action: action_t,
1513) -> c_int {
1514 let action = match Action::try_from(action) {
1516 Ok(action) => action,
1517 Err(_) => return -EINVAL,
1518 };
1519
1520 if path.is_null() || hash.is_null() {
1521 return -EFAULT;
1522 }
1523
1524 let path = unsafe { CStr::from_ptr(path) };
1526 let hash = unsafe { CStr::from_ptr(hash) };
1528 let path = match path.to_str() {
1529 Ok(s) => s,
1530 Err(_) => return -EINVAL,
1531 };
1532 let hash = match hash.to_str() {
1533 Ok(s) => s,
1534 Err(_) => return -EINVAL,
1535 };
1536
1537 stat(format!("/dev/syd/force+{path}:{hash}:{action}"))
1539}
1540
1541#[no_mangle]
1553pub unsafe extern "C" fn syd_force_del(path: *const c_char) -> c_int {
1554 if path.is_null() {
1555 return -EFAULT;
1556 }
1557
1558 let path = unsafe { CStr::from_ptr(path) };
1560 let path = match path.to_str() {
1561 Ok(s) => s,
1562 Err(_) => return -EINVAL,
1563 };
1564
1565 stat(format!("/dev/syd/force-{path}"))
1567}
1568
1569#[no_mangle]
1571pub extern "C" fn syd_force_clr() -> c_int {
1572 stat("/dev/syd/force^")
1573}
1574
1575#[no_mangle]
1579pub extern "C" fn syd_fs_add(action: action_t, name: *const c_char) -> c_int {
1580 let action = match Action::try_from(action) {
1582 Ok(action) => action,
1583 Err(_) => return -EINVAL,
1584 };
1585
1586 esyd(&format!("{action}/fs"), name, b'+')
1588}
1589
1590#[no_mangle]
1595pub extern "C" fn syd_fs_del(action: action_t, name: *const c_char) -> c_int {
1596 let action = match Action::try_from(action) {
1598 Ok(action) => action,
1599 Err(_) => return -EINVAL,
1600 };
1601
1602 esyd(&format!("{action}/fs"), name, b'-')
1604}
1605
1606#[no_mangle]
1610pub extern "C" fn syd_fs_rem(action: action_t, name: *const c_char) -> c_int {
1611 let action = match Action::try_from(action) {
1613 Ok(action) => action,
1614 Err(_) => return -EINVAL,
1615 };
1616
1617 esyd(&format!("{action}/fs"), name, b'^')
1619}
1620
1621#[no_mangle]
1625pub extern "C" fn syd_walk_add(action: action_t, glob: *const c_char) -> c_int {
1626 let action = match Action::try_from(action) {
1628 Ok(action) => action,
1629 Err(_) => return -EINVAL,
1630 };
1631
1632 esyd(&format!("{action}/walk"), glob, b'+')
1634}
1635
1636#[no_mangle]
1641pub extern "C" fn syd_walk_del(action: action_t, glob: *const c_char) -> c_int {
1642 let action = match Action::try_from(action) {
1644 Ok(action) => action,
1645 Err(_) => return -EINVAL,
1646 };
1647
1648 esyd(&format!("{action}/walk"), glob, b'-')
1650}
1651
1652#[no_mangle]
1656pub extern "C" fn syd_walk_rem(action: action_t, glob: *const c_char) -> c_int {
1657 let action = match Action::try_from(action) {
1659 Ok(action) => action,
1660 Err(_) => return -EINVAL,
1661 };
1662
1663 esyd(&format!("{action}/walk"), glob, b'^')
1665}
1666
1667#[no_mangle]
1671pub extern "C" fn syd_stat_add(action: action_t, glob: *const c_char) -> c_int {
1672 let action = match Action::try_from(action) {
1674 Ok(action) => action,
1675 Err(_) => return -EINVAL,
1676 };
1677
1678 esyd(&format!("{action}/stat"), glob, b'+')
1680}
1681
1682#[no_mangle]
1687pub extern "C" fn syd_stat_del(action: action_t, glob: *const c_char) -> c_int {
1688 let action = match Action::try_from(action) {
1690 Ok(action) => action,
1691 Err(_) => return -EINVAL,
1692 };
1693
1694 esyd(&format!("{action}/stat"), glob, b'-')
1696}
1697
1698#[no_mangle]
1702pub extern "C" fn syd_stat_rem(action: action_t, glob: *const c_char) -> c_int {
1703 let action = match Action::try_from(action) {
1705 Ok(action) => action,
1706 Err(_) => return -EINVAL,
1707 };
1708
1709 esyd(&format!("{action}/stat"), glob, b'^')
1711}
1712
1713#[no_mangle]
1717pub extern "C" fn syd_read_add(action: action_t, glob: *const c_char) -> c_int {
1718 let action = match Action::try_from(action) {
1720 Ok(action) => action,
1721 Err(_) => return -EINVAL,
1722 };
1723
1724 esyd(&format!("{action}/read"), glob, b'+')
1726}
1727
1728#[no_mangle]
1733pub extern "C" fn syd_read_del(action: action_t, glob: *const c_char) -> c_int {
1734 let action = match Action::try_from(action) {
1736 Ok(action) => action,
1737 Err(_) => return -EINVAL,
1738 };
1739
1740 esyd(&format!("{action}/read"), glob, b'-')
1742}
1743
1744#[no_mangle]
1748pub extern "C" fn syd_read_rem(action: action_t, glob: *const c_char) -> c_int {
1749 let action = match Action::try_from(action) {
1751 Ok(action) => action,
1752 Err(_) => return -EINVAL,
1753 };
1754
1755 esyd(&format!("{action}/read"), glob, b'^')
1757}
1758
1759#[no_mangle]
1763pub extern "C" fn syd_write_add(action: action_t, glob: *const c_char) -> c_int {
1764 let action = match Action::try_from(action) {
1766 Ok(action) => action,
1767 Err(_) => return -EINVAL,
1768 };
1769
1770 esyd(&format!("{action}/write"), glob, b'+')
1772}
1773
1774#[no_mangle]
1779pub extern "C" fn syd_write_del(action: action_t, glob: *const c_char) -> c_int {
1780 let action = match Action::try_from(action) {
1782 Ok(action) => action,
1783 Err(_) => return -EINVAL,
1784 };
1785
1786 esyd(&format!("{action}/write"), glob, b'-')
1788}
1789
1790#[no_mangle]
1794pub extern "C" fn syd_write_rem(action: action_t, glob: *const c_char) -> c_int {
1795 let action = match Action::try_from(action) {
1797 Ok(action) => action,
1798 Err(_) => return -EINVAL,
1799 };
1800
1801 esyd(&format!("{action}/write"), glob, b'^')
1803}
1804
1805#[no_mangle]
1809pub extern "C" fn syd_exec_add(action: action_t, glob: *const c_char) -> c_int {
1810 let action = match Action::try_from(action) {
1812 Ok(action) => action,
1813 Err(_) => return -EINVAL,
1814 };
1815
1816 esyd(&format!("{action}/exec"), glob, b'+')
1818}
1819
1820#[no_mangle]
1825pub extern "C" fn syd_exec_del(action: action_t, glob: *const c_char) -> c_int {
1826 let action = match Action::try_from(action) {
1828 Ok(action) => action,
1829 Err(_) => return -EINVAL,
1830 };
1831
1832 esyd(&format!("{action}/exec"), glob, b'-')
1834}
1835
1836#[no_mangle]
1840pub extern "C" fn syd_exec_rem(action: action_t, glob: *const c_char) -> c_int {
1841 let action = match Action::try_from(action) {
1843 Ok(action) => action,
1844 Err(_) => return -EINVAL,
1845 };
1846
1847 esyd(&format!("{action}/exec"), glob, b'^')
1849}
1850
1851#[no_mangle]
1855pub extern "C" fn syd_create_add(action: action_t, glob: *const c_char) -> c_int {
1856 let action = match Action::try_from(action) {
1858 Ok(action) => action,
1859 Err(_) => return -EINVAL,
1860 };
1861
1862 esyd(&format!("{action}/create"), glob, b'+')
1864}
1865
1866#[no_mangle]
1871pub extern "C" fn syd_create_del(action: action_t, glob: *const c_char) -> c_int {
1872 let action = match Action::try_from(action) {
1874 Ok(action) => action,
1875 Err(_) => return -EINVAL,
1876 };
1877
1878 esyd(&format!("{action}/create"), glob, b'-')
1880}
1881
1882#[no_mangle]
1886pub extern "C" fn syd_create_rem(action: action_t, glob: *const c_char) -> c_int {
1887 let action = match Action::try_from(action) {
1889 Ok(action) => action,
1890 Err(_) => return -EINVAL,
1891 };
1892
1893 esyd(&format!("{action}/create"), glob, b'^')
1895}
1896
1897#[no_mangle]
1901pub extern "C" fn syd_delete_add(action: action_t, glob: *const c_char) -> c_int {
1902 let action = match Action::try_from(action) {
1904 Ok(action) => action,
1905 Err(_) => return -EINVAL,
1906 };
1907
1908 esyd(&format!("{action}/delete"), glob, b'+')
1910}
1911
1912#[no_mangle]
1917pub extern "C" fn syd_delete_del(action: action_t, glob: *const c_char) -> c_int {
1918 let action = match Action::try_from(action) {
1920 Ok(action) => action,
1921 Err(_) => return -EINVAL,
1922 };
1923
1924 esyd(&format!("{action}/delete"), glob, b'-')
1926}
1927
1928#[no_mangle]
1932pub extern "C" fn syd_delete_rem(action: action_t, glob: *const c_char) -> c_int {
1933 let action = match Action::try_from(action) {
1935 Ok(action) => action,
1936 Err(_) => return -EINVAL,
1937 };
1938
1939 esyd(&format!("{action}/delete"), glob, b'^')
1941}
1942
1943#[no_mangle]
1947pub extern "C" fn syd_rename_add(action: action_t, glob: *const c_char) -> c_int {
1948 let action = match Action::try_from(action) {
1950 Ok(action) => action,
1951 Err(_) => return -EINVAL,
1952 };
1953
1954 esyd(&format!("{action}/rename"), glob, b'+')
1956}
1957
1958#[no_mangle]
1963pub extern "C" fn syd_rename_del(action: action_t, glob: *const c_char) -> c_int {
1964 let action = match Action::try_from(action) {
1966 Ok(action) => action,
1967 Err(_) => return -EINVAL,
1968 };
1969
1970 esyd(&format!("{action}/rename"), glob, b'-')
1972}
1973
1974#[no_mangle]
1978pub extern "C" fn syd_rename_rem(action: action_t, glob: *const c_char) -> c_int {
1979 let action = match Action::try_from(action) {
1981 Ok(action) => action,
1982 Err(_) => return -EINVAL,
1983 };
1984
1985 esyd(&format!("{action}/rename"), glob, b'^')
1987}
1988
1989#[no_mangle]
1993pub extern "C" fn syd_symlink_add(action: action_t, glob: *const c_char) -> c_int {
1994 let action = match Action::try_from(action) {
1996 Ok(action) => action,
1997 Err(_) => return -EINVAL,
1998 };
1999
2000 esyd(&format!("{action}/symlink"), glob, b'+')
2002}
2003
2004#[no_mangle]
2009pub extern "C" fn syd_symlink_del(action: action_t, glob: *const c_char) -> c_int {
2010 let action = match Action::try_from(action) {
2012 Ok(action) => action,
2013 Err(_) => return -EINVAL,
2014 };
2015
2016 esyd(&format!("{action}/symlink"), glob, b'-')
2018}
2019
2020#[no_mangle]
2024pub extern "C" fn syd_symlink_rem(action: action_t, glob: *const c_char) -> c_int {
2025 let action = match Action::try_from(action) {
2027 Ok(action) => action,
2028 Err(_) => return -EINVAL,
2029 };
2030
2031 esyd(&format!("{action}/symlink"), glob, b'^')
2033}
2034
2035#[no_mangle]
2039pub extern "C" fn syd_truncate_add(action: action_t, glob: *const c_char) -> c_int {
2040 let action = match Action::try_from(action) {
2042 Ok(action) => action,
2043 Err(_) => return -EINVAL,
2044 };
2045
2046 esyd(&format!("{action}/truncate"), glob, b'+')
2048}
2049
2050#[no_mangle]
2055pub extern "C" fn syd_truncate_del(action: action_t, glob: *const c_char) -> c_int {
2056 let action = match Action::try_from(action) {
2058 Ok(action) => action,
2059 Err(_) => return -EINVAL,
2060 };
2061
2062 esyd(&format!("{action}/truncate"), glob, b'-')
2064}
2065
2066#[no_mangle]
2070pub extern "C" fn syd_truncate_rem(action: action_t, glob: *const c_char) -> c_int {
2071 let action = match Action::try_from(action) {
2073 Ok(action) => action,
2074 Err(_) => return -EINVAL,
2075 };
2076
2077 esyd(&format!("{action}/truncate"), glob, b'^')
2079}
2080
2081#[no_mangle]
2085pub extern "C" fn syd_chdir_add(action: action_t, glob: *const c_char) -> c_int {
2086 let action = match Action::try_from(action) {
2088 Ok(action) => action,
2089 Err(_) => return -EINVAL,
2090 };
2091
2092 esyd(&format!("{action}/chdir"), glob, b'+')
2094}
2095
2096#[no_mangle]
2101pub extern "C" fn syd_chdir_del(action: action_t, glob: *const c_char) -> c_int {
2102 let action = match Action::try_from(action) {
2104 Ok(action) => action,
2105 Err(_) => return -EINVAL,
2106 };
2107
2108 esyd(&format!("{action}/chdir"), glob, b'-')
2110}
2111
2112#[no_mangle]
2116pub extern "C" fn syd_chdir_rem(action: action_t, glob: *const c_char) -> c_int {
2117 let action = match Action::try_from(action) {
2119 Ok(action) => action,
2120 Err(_) => return -EINVAL,
2121 };
2122
2123 esyd(&format!("{action}/chdir"), glob, b'^')
2125}
2126
2127#[no_mangle]
2131pub extern "C" fn syd_readdir_add(action: action_t, glob: *const c_char) -> c_int {
2132 let action = match Action::try_from(action) {
2134 Ok(action) => action,
2135 Err(_) => return -EINVAL,
2136 };
2137
2138 esyd(&format!("{action}/readdir"), glob, b'+')
2140}
2141
2142#[no_mangle]
2147pub extern "C" fn syd_readdir_del(action: action_t, glob: *const c_char) -> c_int {
2148 let action = match Action::try_from(action) {
2150 Ok(action) => action,
2151 Err(_) => return -EINVAL,
2152 };
2153
2154 esyd(&format!("{action}/readdir"), glob, b'-')
2156}
2157
2158#[no_mangle]
2162pub extern "C" fn syd_readdir_rem(action: action_t, glob: *const c_char) -> c_int {
2163 let action = match Action::try_from(action) {
2165 Ok(action) => action,
2166 Err(_) => return -EINVAL,
2167 };
2168
2169 esyd(&format!("{action}/readdir"), glob, b'^')
2171}
2172
2173#[no_mangle]
2177pub extern "C" fn syd_mkdir_add(action: action_t, glob: *const c_char) -> c_int {
2178 let action = match Action::try_from(action) {
2180 Ok(action) => action,
2181 Err(_) => return -EINVAL,
2182 };
2183
2184 esyd(&format!("{action}/mkdir"), glob, b'+')
2186}
2187
2188#[no_mangle]
2193pub extern "C" fn syd_mkdir_del(action: action_t, glob: *const c_char) -> c_int {
2194 let action = match Action::try_from(action) {
2196 Ok(action) => action,
2197 Err(_) => return -EINVAL,
2198 };
2199
2200 esyd(&format!("{action}/mkdir"), glob, b'-')
2202}
2203
2204#[no_mangle]
2208pub extern "C" fn syd_mkdir_rem(action: action_t, glob: *const c_char) -> c_int {
2209 let action = match Action::try_from(action) {
2211 Ok(action) => action,
2212 Err(_) => return -EINVAL,
2213 };
2214
2215 esyd(&format!("{action}/mkdir"), glob, b'^')
2217}
2218
2219#[no_mangle]
2223pub extern "C" fn syd_rmdir_add(action: action_t, glob: *const c_char) -> c_int {
2224 let action = match Action::try_from(action) {
2226 Ok(action) => action,
2227 Err(_) => return -EINVAL,
2228 };
2229
2230 esyd(&format!("{action}/rmdir"), glob, b'+')
2232}
2233
2234#[no_mangle]
2239pub extern "C" fn syd_rmdir_del(action: action_t, glob: *const c_char) -> c_int {
2240 let action = match Action::try_from(action) {
2242 Ok(action) => action,
2243 Err(_) => return -EINVAL,
2244 };
2245
2246 esyd(&format!("{action}/rmdir"), glob, b'-')
2248}
2249
2250#[no_mangle]
2254pub extern "C" fn syd_rmdir_rem(action: action_t, glob: *const c_char) -> c_int {
2255 let action = match Action::try_from(action) {
2257 Ok(action) => action,
2258 Err(_) => return -EINVAL,
2259 };
2260
2261 esyd(&format!("{action}/rmdir"), glob, b'^')
2263}
2264
2265#[no_mangle]
2269pub extern "C" fn syd_chown_add(action: action_t, glob: *const c_char) -> c_int {
2270 let action = match Action::try_from(action) {
2272 Ok(action) => action,
2273 Err(_) => return -EINVAL,
2274 };
2275
2276 esyd(&format!("{action}/chown"), glob, b'+')
2278}
2279
2280#[no_mangle]
2285pub extern "C" fn syd_chown_del(action: action_t, glob: *const c_char) -> c_int {
2286 let action = match Action::try_from(action) {
2288 Ok(action) => action,
2289 Err(_) => return -EINVAL,
2290 };
2291
2292 esyd(&format!("{action}/chown"), glob, b'-')
2294}
2295
2296#[no_mangle]
2300pub extern "C" fn syd_chown_rem(action: action_t, glob: *const c_char) -> c_int {
2301 let action = match Action::try_from(action) {
2303 Ok(action) => action,
2304 Err(_) => return -EINVAL,
2305 };
2306
2307 esyd(&format!("{action}/chown"), glob, b'^')
2309}
2310
2311#[no_mangle]
2315pub extern "C" fn syd_chgrp_add(action: action_t, glob: *const c_char) -> c_int {
2316 let action = match Action::try_from(action) {
2318 Ok(action) => action,
2319 Err(_) => return -EINVAL,
2320 };
2321
2322 esyd(&format!("{action}/chgrp"), glob, b'+')
2324}
2325
2326#[no_mangle]
2331pub extern "C" fn syd_chgrp_del(action: action_t, glob: *const c_char) -> c_int {
2332 let action = match Action::try_from(action) {
2334 Ok(action) => action,
2335 Err(_) => return -EINVAL,
2336 };
2337
2338 esyd(&format!("{action}/chgrp"), glob, b'-')
2340}
2341
2342#[no_mangle]
2346pub extern "C" fn syd_chgrp_rem(action: action_t, glob: *const c_char) -> c_int {
2347 let action = match Action::try_from(action) {
2349 Ok(action) => action,
2350 Err(_) => return -EINVAL,
2351 };
2352
2353 esyd(&format!("{action}/chgrp"), glob, b'^')
2355}
2356
2357#[no_mangle]
2361pub extern "C" fn syd_chmod_add(action: action_t, glob: *const c_char) -> c_int {
2362 let action = match Action::try_from(action) {
2364 Ok(action) => action,
2365 Err(_) => return -EINVAL,
2366 };
2367
2368 esyd(&format!("{action}/chmod"), glob, b'+')
2370}
2371
2372#[no_mangle]
2377pub extern "C" fn syd_chmod_del(action: action_t, glob: *const c_char) -> c_int {
2378 let action = match Action::try_from(action) {
2380 Ok(action) => action,
2381 Err(_) => return -EINVAL,
2382 };
2383
2384 esyd(&format!("{action}/chmod"), glob, b'-')
2386}
2387
2388#[no_mangle]
2392pub extern "C" fn syd_chmod_rem(action: action_t, glob: *const c_char) -> c_int {
2393 let action = match Action::try_from(action) {
2395 Ok(action) => action,
2396 Err(_) => return -EINVAL,
2397 };
2398
2399 esyd(&format!("{action}/chmod"), glob, b'^')
2401}
2402
2403#[no_mangle]
2407pub extern "C" fn syd_chattr_add(action: action_t, glob: *const c_char) -> c_int {
2408 let action = match Action::try_from(action) {
2410 Ok(action) => action,
2411 Err(_) => return -EINVAL,
2412 };
2413
2414 esyd(&format!("{action}/chattr"), glob, b'+')
2416}
2417
2418#[no_mangle]
2423pub extern "C" fn syd_chattr_del(action: action_t, glob: *const c_char) -> c_int {
2424 let action = match Action::try_from(action) {
2426 Ok(action) => action,
2427 Err(_) => return -EINVAL,
2428 };
2429
2430 esyd(&format!("{action}/chattr"), glob, b'-')
2432}
2433
2434#[no_mangle]
2438pub extern "C" fn syd_chattr_rem(action: action_t, glob: *const c_char) -> c_int {
2439 let action = match Action::try_from(action) {
2441 Ok(action) => action,
2442 Err(_) => return -EINVAL,
2443 };
2444
2445 esyd(&format!("{action}/chattr"), glob, b'^')
2447}
2448
2449#[no_mangle]
2453pub extern "C" fn syd_chroot_add(action: action_t, glob: *const c_char) -> c_int {
2454 let action = match Action::try_from(action) {
2456 Ok(action) => action,
2457 Err(_) => return -EINVAL,
2458 };
2459
2460 esyd(&format!("{action}/chroot"), glob, b'+')
2462}
2463
2464#[no_mangle]
2469pub extern "C" fn syd_chroot_del(action: action_t, glob: *const c_char) -> c_int {
2470 let action = match Action::try_from(action) {
2472 Ok(action) => action,
2473 Err(_) => return -EINVAL,
2474 };
2475
2476 esyd(&format!("{action}/chroot"), glob, b'-')
2478}
2479
2480#[no_mangle]
2484pub extern "C" fn syd_chroot_rem(action: action_t, glob: *const c_char) -> c_int {
2485 let action = match Action::try_from(action) {
2487 Ok(action) => action,
2488 Err(_) => return -EINVAL,
2489 };
2490
2491 esyd(&format!("{action}/chroot"), glob, b'^')
2493}
2494
2495#[no_mangle]
2499pub extern "C" fn syd_utime_add(action: action_t, glob: *const c_char) -> c_int {
2500 let action = match Action::try_from(action) {
2502 Ok(action) => action,
2503 Err(_) => return -EINVAL,
2504 };
2505
2506 esyd(&format!("{action}/utime"), glob, b'+')
2508}
2509
2510#[no_mangle]
2515pub extern "C" fn syd_utime_del(action: action_t, glob: *const c_char) -> c_int {
2516 let action = match Action::try_from(action) {
2518 Ok(action) => action,
2519 Err(_) => return -EINVAL,
2520 };
2521
2522 esyd(&format!("{action}/utime"), glob, b'-')
2524}
2525
2526#[no_mangle]
2530pub extern "C" fn syd_utime_rem(action: action_t, glob: *const c_char) -> c_int {
2531 let action = match Action::try_from(action) {
2533 Ok(action) => action,
2534 Err(_) => return -EINVAL,
2535 };
2536
2537 esyd(&format!("{action}/utime"), glob, b'^')
2539}
2540
2541#[no_mangle]
2545pub extern "C" fn syd_mkbdev_add(action: action_t, glob: *const c_char) -> c_int {
2546 let action = match Action::try_from(action) {
2548 Ok(action) => action,
2549 Err(_) => return -EINVAL,
2550 };
2551
2552 esyd(&format!("{action}/mkbdev"), glob, b'+')
2554}
2555
2556#[no_mangle]
2561pub extern "C" fn syd_mkbdev_del(action: action_t, glob: *const c_char) -> c_int {
2562 let action = match Action::try_from(action) {
2564 Ok(action) => action,
2565 Err(_) => return -EINVAL,
2566 };
2567
2568 esyd(&format!("{action}/mkbdev"), glob, b'-')
2570}
2571
2572#[no_mangle]
2576pub extern "C" fn syd_mkbdev_rem(action: action_t, glob: *const c_char) -> c_int {
2577 let action = match Action::try_from(action) {
2579 Ok(action) => action,
2580 Err(_) => return -EINVAL,
2581 };
2582
2583 esyd(&format!("{action}/mkbdev"), glob, b'^')
2585}
2586
2587#[no_mangle]
2591pub extern "C" fn syd_mkcdev_add(action: action_t, glob: *const c_char) -> c_int {
2592 let action = match Action::try_from(action) {
2594 Ok(action) => action,
2595 Err(_) => return -EINVAL,
2596 };
2597
2598 esyd(&format!("{action}/mkcdev"), glob, b'+')
2600}
2601
2602#[no_mangle]
2607pub extern "C" fn syd_mkcdev_del(action: action_t, glob: *const c_char) -> c_int {
2608 let action = match Action::try_from(action) {
2610 Ok(action) => action,
2611 Err(_) => return -EINVAL,
2612 };
2613
2614 esyd(&format!("{action}/mkcdev"), glob, b'-')
2616}
2617
2618#[no_mangle]
2622pub extern "C" fn syd_mkcdev_rem(action: action_t, glob: *const c_char) -> c_int {
2623 let action = match Action::try_from(action) {
2625 Ok(action) => action,
2626 Err(_) => return -EINVAL,
2627 };
2628
2629 esyd(&format!("{action}/mkcdev"), glob, b'^')
2631}
2632
2633#[no_mangle]
2637pub extern "C" fn syd_mkfifo_add(action: action_t, glob: *const c_char) -> c_int {
2638 let action = match Action::try_from(action) {
2640 Ok(action) => action,
2641 Err(_) => return -EINVAL,
2642 };
2643
2644 esyd(&format!("{action}/mkfifo"), glob, b'+')
2646}
2647
2648#[no_mangle]
2653pub extern "C" fn syd_mkfifo_del(action: action_t, glob: *const c_char) -> c_int {
2654 let action = match Action::try_from(action) {
2656 Ok(action) => action,
2657 Err(_) => return -EINVAL,
2658 };
2659
2660 esyd(&format!("{action}/mkfifo"), glob, b'-')
2662}
2663
2664#[no_mangle]
2668pub extern "C" fn syd_mkfifo_rem(action: action_t, glob: *const c_char) -> c_int {
2669 let action = match Action::try_from(action) {
2671 Ok(action) => action,
2672 Err(_) => return -EINVAL,
2673 };
2674
2675 esyd(&format!("{action}/mkfifo"), glob, b'^')
2677}
2678
2679#[no_mangle]
2683pub extern "C" fn syd_mktemp_add(action: action_t, glob: *const c_char) -> c_int {
2684 let action = match Action::try_from(action) {
2686 Ok(action) => action,
2687 Err(_) => return -EINVAL,
2688 };
2689
2690 esyd(&format!("{action}/mktemp"), glob, b'+')
2692}
2693
2694#[no_mangle]
2699pub extern "C" fn syd_mktemp_del(action: action_t, glob: *const c_char) -> c_int {
2700 let action = match Action::try_from(action) {
2702 Ok(action) => action,
2703 Err(_) => return -EINVAL,
2704 };
2705
2706 esyd(&format!("{action}/mktemp"), glob, b'-')
2708}
2709
2710#[no_mangle]
2714pub extern "C" fn syd_mktemp_rem(action: action_t, glob: *const c_char) -> c_int {
2715 let action = match Action::try_from(action) {
2717 Ok(action) => action,
2718 Err(_) => return -EINVAL,
2719 };
2720
2721 esyd(&format!("{action}/mktemp"), glob, b'^')
2723}
2724
2725#[no_mangle]
2729pub extern "C" fn syd_net_bind_add(action: action_t, glob: *const c_char) -> c_int {
2730 let action = match Action::try_from(action) {
2732 Ok(action) => action,
2733 Err(_) => return -EINVAL,
2734 };
2735
2736 esyd(&format!("{action}/net/bind"), glob, b'+')
2738}
2739
2740#[no_mangle]
2745pub extern "C" fn syd_net_bind_del(action: action_t, glob: *const c_char) -> c_int {
2746 let action = match Action::try_from(action) {
2748 Ok(action) => action,
2749 Err(_) => return -EINVAL,
2750 };
2751
2752 esyd(&format!("{action}/net/bind"), glob, b'-')
2754}
2755
2756#[no_mangle]
2760pub extern "C" fn syd_net_bind_rem(action: action_t, glob: *const c_char) -> c_int {
2761 let action = match Action::try_from(action) {
2763 Ok(action) => action,
2764 Err(_) => return -EINVAL,
2765 };
2766
2767 esyd(&format!("{action}/net/bind"), glob, b'^')
2769}
2770
2771#[no_mangle]
2775pub extern "C" fn syd_net_connect_add(action: action_t, glob: *const c_char) -> c_int {
2776 let action = match Action::try_from(action) {
2778 Ok(action) => action,
2779 Err(_) => return -EINVAL,
2780 };
2781
2782 esyd(&format!("{action}/net/connect"), glob, b'+')
2784}
2785
2786#[no_mangle]
2791pub extern "C" fn syd_net_connect_del(action: action_t, glob: *const c_char) -> c_int {
2792 let action = match Action::try_from(action) {
2794 Ok(action) => action,
2795 Err(_) => return -EINVAL,
2796 };
2797
2798 esyd(&format!("{action}/net/connect"), glob, b'-')
2800}
2801
2802#[no_mangle]
2806pub extern "C" fn syd_net_connect_rem(action: action_t, glob: *const c_char) -> c_int {
2807 let action = match Action::try_from(action) {
2809 Ok(action) => action,
2810 Err(_) => return -EINVAL,
2811 };
2812
2813 esyd(&format!("{action}/net/connect"), glob, b'^')
2815}
2816
2817#[no_mangle]
2821pub extern "C" fn syd_net_sendfd_add(action: action_t, glob: *const c_char) -> c_int {
2822 let action = match Action::try_from(action) {
2824 Ok(action) => action,
2825 Err(_) => return -EINVAL,
2826 };
2827
2828 esyd(&format!("{action}/net/sendfd"), glob, b'+')
2830}
2831
2832#[no_mangle]
2837pub extern "C" fn syd_net_sendfd_del(action: action_t, glob: *const c_char) -> c_int {
2838 let action = match Action::try_from(action) {
2840 Ok(action) => action,
2841 Err(_) => return -EINVAL,
2842 };
2843
2844 esyd(&format!("{action}/net/sendfd"), glob, b'-')
2846}
2847
2848#[no_mangle]
2852pub extern "C" fn syd_net_sendfd_rem(action: action_t, glob: *const c_char) -> c_int {
2853 let action = match Action::try_from(action) {
2855 Ok(action) => action,
2856 Err(_) => return -EINVAL,
2857 };
2858
2859 esyd(&format!("{action}/net/sendfd"), glob, b'^')
2861}
2862
2863#[no_mangle]
2867pub extern "C" fn syd_net_link_add(action: action_t, family: *const c_char) -> c_int {
2868 let action = match Action::try_from(action) {
2870 Ok(action) => action,
2871 Err(_) => return -EINVAL,
2872 };
2873
2874 esyd(&format!("{action}/net/link"), family, b'+')
2876}
2877
2878#[no_mangle]
2883pub extern "C" fn syd_net_link_del(action: action_t, family: *const c_char) -> c_int {
2884 let action = match Action::try_from(action) {
2886 Ok(action) => action,
2887 Err(_) => return -EINVAL,
2888 };
2889
2890 esyd(&format!("{action}/net/link"), family, b'-')
2892}
2893
2894#[no_mangle]
2898pub extern "C" fn syd_net_link_rem(action: action_t, family: *const c_char) -> c_int {
2899 let action = match Action::try_from(action) {
2901 Ok(action) => action,
2902 Err(_) => return -EINVAL,
2903 };
2904
2905 esyd(&format!("{action}/net/link"), family, b'^')
2907}
2908
2909#[no_mangle]
2915pub extern "C" fn syd_mem_max(size: *const c_char) -> c_int {
2916 esyd("mem/max", size, b':')
2917}
2918
2919#[no_mangle]
2925pub extern "C" fn syd_mem_vm_max(size: *const c_char) -> c_int {
2926 esyd("mem/vm_max", size, b':')
2927}
2928
2929#[no_mangle]
2933pub extern "C" fn syd_pid_max(size: usize) -> c_int {
2934 stat(&format!("/dev/syd/pid/max:{size}"))
2935}
2936
2937#[no_mangle]
2942pub extern "C" fn syd_segvguard_expiry(timeout: u64) -> c_int {
2943 stat(&format!("/dev/syd/segvguard/expiry:{timeout}"))
2944}
2945
2946#[no_mangle]
2950pub extern "C" fn syd_segvguard_suspension(timeout: u64) -> c_int {
2951 stat(&format!("/dev/syd/segvguard/suspension:{timeout}"))
2952}
2953
2954#[no_mangle]
2958pub extern "C" fn syd_segvguard_maxcrashes(max: u8) -> c_int {
2959 stat(&format!("/dev/syd/segvguard/maxcrashes:{max}"))
2960}
2961
2962#[no_mangle]
2988pub unsafe extern "C" fn syd_exec(file: *const c_char, argv: *const *const c_char) -> c_int {
2989 if file.is_null() || argv.is_null() {
2990 return -EFAULT;
2991 }
2992
2993 let file = CStr::from_ptr(file);
2995 let file = OsStr::from_bytes(file.to_bytes());
2996
2997 let mut path = OsString::from("/dev/syd/cmd/exec!");
2998 path.push(file);
2999
3000 let mut idx: isize = 0;
3001 while !(*argv.offset(idx)).is_null() {
3002 let arg = CStr::from_ptr(*argv.offset(idx));
3004 let arg = OsStr::from_bytes(arg.to_bytes());
3005
3006 path.push(OsStr::from_bytes(&[b'\x1F'])); path.push(arg);
3008
3009 idx = idx.saturating_add(1);
3010 }
3011
3012 let path = PathBuf::from(path);
3013 stat(path)
3014}