diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-21 20:29:52 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-21 20:29:52 +0900 |
| commit | b1a4d801be033b41c559e9642ee05e2f0ec43d5b (patch) | |
| tree | c6792307b993c1fa715285518debb95c858630ef /hst | |
| parent | 56beae17fe7b208c144539821a3c34c395870372 (diff) | |
hst/container: flags string representation
This is useful for a user-facing representation other than JSON. This also gets rid of the ugly, outdated flags string builder in cmd/hakurei.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'hst')
| -rw-r--r-- | hst/container.go | 47 | ||||
| -rw-r--r-- | hst/container_test.go | 25 |
2 files changed, 70 insertions, 2 deletions
diff --git a/hst/container.go b/hst/container.go index 617d22db..75643913 100644 --- a/hst/container.go +++ b/hst/container.go @@ -2,6 +2,7 @@ package hst import ( "encoding/json" + "strings" "syscall" "time" @@ -38,9 +39,12 @@ const ( ExitRequest = 254 ) +// Flags are options held by [ContainerConfig]. +type Flags uintptr + const ( // FMultiarch unblocks syscalls required for multiarch to work on applicable targets. - FMultiarch uintptr = 1 << iota + FMultiarch Flags = 1 << iota // FSeccompCompat changes emitted seccomp filter programs to be identical to that of Flatpak. FSeccompCompat @@ -74,6 +78,45 @@ const ( FAll = fMax - 1 ) +func (flags Flags) String() string { + switch flags { + case FMultiarch: + return "multiarch" + case FSeccompCompat: + return "compat" + case FDevel: + return "devel" + case FUserns: + return "userns" + case FHostNet: + return "net" + case FHostAbstract: + return "abstract" + case FTty: + return "tty" + case FMapRealUID: + return "mapuid" + case FDevice: + return "device" + case FShareRuntime: + return "runtime" + case FShareTmpdir: + return "tmpdir" + + default: + s := make([]string, 0, 1<<4) + for f := Flags(1); f < fMax; f <<= 1 { + if flags&f != 0 { + s = append(s, f.String()) + } + } + if len(s) == 0 { + return "none" + } + return strings.Join(s, ", ") + } +} + // ContainerConfig describes the container configuration to be applied to an underlying [container]. type ContainerConfig struct { // Container UTS namespace hostname. @@ -106,7 +149,7 @@ type ContainerConfig struct { Args []string `json:"args"` // Flags holds boolean options of [ContainerConfig]. - Flags uintptr `json:"-"` + Flags Flags `json:"-"` } // ContainerConfigF is [ContainerConfig] stripped of its methods. diff --git a/hst/container_test.go b/hst/container_test.go index cdeb5023..df84827e 100644 --- a/hst/container_test.go +++ b/hst/container_test.go @@ -3,6 +3,7 @@ package hst_test import ( "encoding/json" "errors" + "math" "reflect" "syscall" "testing" @@ -10,6 +11,30 @@ import ( "hakurei.app/hst" ) +func TestFlagsString(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + flags hst.Flags + want string + }{ + {"none", 0, "none"}, + {"none high", hst.FAll + 1, "none"}, + {"all", hst.FAll, "multiarch, compat, devel, userns, net, abstract, tty, mapuid, device, runtime, tmpdir"}, + {"all high", math.MaxUint, "multiarch, compat, devel, userns, net, abstract, tty, mapuid, device, runtime, tmpdir"}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + if got := tc.flags.String(); got != tc.want { + t.Errorf("String(%#b): %q, want %q", tc.flags, got, tc.want) + } + }) + } +} + func TestContainerConfig(t *testing.T) { t.Parallel() |
