aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/seccomp/seccomp.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-07-03 02:59:43 +0900
committerOphestra <cat@gensokyo.uk>2025-07-03 02:59:43 +0900
commit1b5ecd9eaf3289d164d8ed1bce6013e0e4ef8e86 (patch)
tree047fe5fabdfb37d5c0088f7f572cebc8b13853bb /container/seccomp/seccomp.go
parent82561d62b66f17c05604e87f18187bb3a91f00d2 (diff)
container: move out of toplevel
This allows slightly easier use of the vanity url. This also provides some disambiguation between low level containers and hakurei app containers. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/seccomp/seccomp.go')
-rw-r--r--container/seccomp/seccomp.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/container/seccomp/seccomp.go b/container/seccomp/seccomp.go
new file mode 100644
index 00000000..664b31c6
--- /dev/null
+++ b/container/seccomp/seccomp.go
@@ -0,0 +1,60 @@
+// Package seccomp provides high level wrappers around libseccomp.
+package seccomp
+
+import (
+ "os"
+ "runtime"
+ "sync"
+)
+
+type exporter struct {
+ rules []NativeRule
+ flags ExportFlag
+ r, w *os.File
+
+ prepareOnce sync.Once
+ prepareErr error
+ closeOnce sync.Once
+ closeErr error
+ exportErr <-chan error
+}
+
+func (e *exporter) prepare() error {
+ e.prepareOnce.Do(func() {
+ if r, w, err := os.Pipe(); err != nil {
+ e.prepareErr = err
+ return
+ } else {
+ e.r, e.w = r, w
+ }
+
+ ec := make(chan error, 1)
+ go func(fd uintptr) {
+ ec <- Export(int(fd), e.rules, e.flags)
+ close(ec)
+ _ = e.closeWrite()
+ runtime.KeepAlive(e.w)
+ }(e.w.Fd())
+ e.exportErr = ec
+ runtime.SetFinalizer(e, (*exporter).closeWrite)
+ })
+ return e.prepareErr
+}
+
+func (e *exporter) closeWrite() error {
+ e.closeOnce.Do(func() {
+ if e.w == nil {
+ panic("closeWrite called on invalid exporter")
+ }
+ e.closeErr = e.w.Close()
+
+ // no need for a finalizer anymore
+ runtime.SetFinalizer(e, nil)
+ })
+
+ return e.closeErr
+}
+
+func newExporter(rules []NativeRule, flags ExportFlag) *exporter {
+ return &exporter{rules: rules, flags: flags}
+}