diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-03-17 13:35:48 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-03-17 13:39:26 +0900 |
| commit | cd5959fe5ab04786cd5dee3cf09f725229ae7c7b (patch) | |
| tree | c0dae3f950528e7c3b6d7359441ee8aeb9a488cd /ext/ext.go | |
| parent | 08c35ca24fabc41268411cec14ea386a6d87ece9 (diff) | |
ext: isolate from container/std
These are too general to belong in the container package. This targets the v0.4 release to reduce the wrapper maintenance burden.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'ext/ext.go')
| -rw-r--r-- | ext/ext.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ext/ext.go b/ext/ext.go new file mode 100644 index 00000000..12fd2550 --- /dev/null +++ b/ext/ext.go @@ -0,0 +1,78 @@ +// Package ext provides wrappers around nonportable system interfaces. +package ext + +import ( + "encoding/json" + "iter" + "strconv" +) + +// checked in container/seccomp +type ( + // Uint is equivalent to C.uint. + Uint = uint32 + // Int is equivalent to C.int. + Int = int32 +) + +// SyscallNum represents an architecture-specific, Linux syscall number. +type SyscallNum Int + +// Syscalls returns an iterator over all wired syscalls. +func Syscalls() iter.Seq2[string, SyscallNum] { + return func(yield func(string, SyscallNum) bool) { + for name, num := range syscallNum { + if !yield(name, num) { + return + } + } + for name, num := range syscallNumExtra { + if !yield(name, num) { + return + } + } + } +} + +// SyscallResolveName resolves a syscall number from its string representation. +func SyscallResolveName(name string) (num SyscallNum, ok bool) { + if num, ok = syscallNum[name]; ok { + return + } + num, ok = syscallNumExtra[name] + return +} + +// MarshalJSON resolves the name of [Syscall] and encodes it as a [json] string. +// If such a name does not exist, the syscall number is encoded instead. +func (num *SyscallNum) MarshalJSON() ([]byte, error) { + n := *num + for name, cur := range Syscalls() { + if cur == n { + return json.Marshal(name) + } + } + return json.Marshal(n) +} + +// SyscallNameError is returned when trying to unmarshal an invalid syscall name into [ScmpSyscall]. +type SyscallNameError string + +func (e SyscallNameError) Error() string { + return "invalid syscall name " + strconv.Quote(string(e)) +} + +// UnmarshalJSON looks up the syscall number corresponding to name encoded in data +// by calling [SyscallResolveName]. +func (num *SyscallNum) UnmarshalJSON(data []byte) error { + var name string + if err := json.Unmarshal(data, &name); err != nil { + return err + } + if n, ok := SyscallResolveName(name); !ok { + return SyscallNameError(name) + } else { + *num = n + return nil + } +} |
