diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-01-22 01:51:10 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-01-22 01:52:57 +0900 |
| commit | 9a239fa1a5ad2ff248ca7a9d39342f66926c9fef (patch) | |
| tree | 09efadb2ddf4eaeaf153d7e4b7d73e1b20d2fc1a /helper/bwrap/seccomp.go | |
| parent | 82029948e6d8d047edc02ccff354e16c419e5742 (diff) | |
helper/bwrap: integrate seccomp into helper interface
This makes API usage much cleaner, and encapsulates all bwrap arguments in argsWt.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper/bwrap/seccomp.go')
| -rw-r--r-- | helper/bwrap/seccomp.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/helper/bwrap/seccomp.go b/helper/bwrap/seccomp.go new file mode 100644 index 00000000..abc2738b --- /dev/null +++ b/helper/bwrap/seccomp.go @@ -0,0 +1,83 @@ +package bwrap + +/* +#cgo linux pkg-config: --static libseccomp + +#include "seccomp-export.h" +*/ +import "C" +import ( + "errors" + "fmt" + "os" + "runtime" +) + +var CPrintln func(v ...any) + +var resErr = [...]error{ + 0: nil, + 1: errors.New("seccomp_init failed"), + 2: errors.New("seccomp_arch_add failed"), + 3: errors.New("seccomp_arch_add failed (multiarch)"), + 4: errors.New("internal libseccomp failure"), + 5: errors.New("seccomp_rule_add failed"), + 6: errors.New("seccomp_export_bpf failed"), +} + +type ( + syscallOpts = C.f_syscall_opts +) + +const ( + flagDenyNS syscallOpts = C.F_DENY_NS + flagDenyTTY syscallOpts = C.F_DENY_TTY + flagDenyDevel syscallOpts = C.F_DENY_DEVEL + flagMultiarch syscallOpts = C.F_MULTIARCH + flagLinux32 syscallOpts = C.F_LINUX32 + flagCan syscallOpts = C.F_CAN + flagBluetooth syscallOpts = C.F_BLUETOOTH +) + +func tmpfile() (*os.File, error) { + fd, err := C.f_tmpfile_fd() + if err != nil { + return nil, err + } + return os.NewFile(uintptr(fd), "tmpfile"), err +} + +func exportFilter(fd uintptr, opts syscallOpts) error { + var ( + arch C.uint32_t = 0 + multiarch C.uint32_t = 0 + ) + switch runtime.GOARCH { + case "386": + arch = C.SCMP_ARCH_X86 + case "amd64": + arch = C.SCMP_ARCH_X86_64 + multiarch = C.SCMP_ARCH_X86 + case "arm": + arch = C.SCMP_ARCH_ARM + case "arm64": + arch = C.SCMP_ARCH_AARCH64 + multiarch = C.SCMP_ARCH_ARM + } + + res, err := C.f_export_bpf(C.int(fd), arch, multiarch, opts) + if re := resErr[res]; re != nil { + if err == nil { + return re + } + return fmt.Errorf("%s: %v", re.Error(), err) + } + return err +} + +//export F_println +func F_println(v *C.char) { + if CPrintln != nil { + CPrintln(C.GoString(v)) + } +} |
