aboutsummaryrefslogtreecommitdiffhomepage
path: root/system/dispatcher.go
diff options
context:
space:
mode:
Diffstat (limited to 'system/dispatcher.go')
-rw-r--r--system/dispatcher.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/system/dispatcher.go b/system/dispatcher.go
new file mode 100644
index 00000000..c483c818
--- /dev/null
+++ b/system/dispatcher.go
@@ -0,0 +1,30 @@
+package system
+
+import "hakurei.app/system/acl"
+
+// syscallDispatcher provides methods that make state-dependent system calls as part of their behaviour.
+// syscallDispatcher is embedded in [I], so all methods must be unexported.
+type syscallDispatcher interface {
+ // new starts a goroutine with a new instance of syscallDispatcher.
+ // A syscallDispatcher must never be used in any goroutine other than the one owning it,
+ // just synchronising access is not enough, as this is for test instrumentation.
+ new(f func(k syscallDispatcher))
+
+ // aclUpdate provides [acl.Update].
+ aclUpdate(name string, uid int, perms ...acl.Perm) error
+
+ verbose(v ...any)
+ verbosef(format string, v ...any)
+}
+
+// direct implements syscallDispatcher on the current kernel.
+type direct struct{}
+
+func (k direct) new(f func(k syscallDispatcher)) { go f(k) }
+
+func (k direct) aclUpdate(name string, uid int, perms ...acl.Perm) error {
+ return acl.Update(name, uid, perms...)
+}
+
+func (direct) verbose(v ...any) { msg.Verbose(v...) }
+func (direct) verbosef(format string, v ...any) { msg.Verbosef(format, v...) }