aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/container.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-11 02:52:32 +0900
committerOphestra <cat@gensokyo.uk>2025-08-11 04:56:42 +0900
commite99d7affb0c128fa82722f9b3d79c99b5e5918cd (patch)
tree387e08d6c4363d8b9e0462f069c140fbdb15c917 /container/container.go
parent41ac2be9658b49c68cb793f3a6f0c5932d82e1c2 (diff)
container: use absolute for pathname
This is simultaneously more efficient and less error-prone. This change caused minor API changes in multiple other packages. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/container.go')
-rw-r--r--container/container.go21
1 files changed, 11 insertions, 10 deletions
diff --git a/container/container.go b/container/container.go
index 54cee25f..3d6caa66 100644
--- a/container/container.go
+++ b/container/container.go
@@ -9,7 +9,6 @@ import (
"io"
"os"
"os/exec"
- "path"
"strconv"
. "syscall"
"time"
@@ -53,11 +52,11 @@ type (
// Params holds container configuration and is safe to serialise.
Params struct {
// Working directory in the container.
- Dir string
+ Dir *Absolute
// Initial process environment.
Env []string
- // Absolute path of initial process in the container. Overrides name.
- Path string
+ // Pathname of initial process in the container.
+ Path *Absolute
// Initial process argv.
Args []string
// Deliver SIGINT to the initial process on context cancellation.
@@ -188,14 +187,16 @@ func (p *Container) Serve() error {
setup := p.setup
p.setup = nil
- if !path.IsAbs(p.Path) {
+ if p.Path == nil {
p.cancel()
- return msg.WrapErr(EINVAL,
- fmt.Sprintf("invalid executable path %q", p.Path))
+ return msg.WrapErr(EINVAL, "invalid executable pathname")
}
+ // do not transmit nil
+ if p.Dir == nil {
+ p.Dir = AbsFHSRoot
+ }
if p.SeccompRules == nil {
- // do not transmit nil
p.SeccompRules = make([]seccomp.NativeRule, 0)
}
@@ -232,11 +233,11 @@ func (p *Container) ProcessState() *os.ProcessState {
// New returns the address to a new instance of [Container] that requires further initialisation before use.
func New(ctx context.Context) *Container {
- return &Container{ctx: ctx, Params: Params{Dir: FHSRoot, Ops: new(Ops)}}
+ return &Container{ctx: ctx, Params: Params{Ops: new(Ops)}}
}
// NewCommand calls [New] and initialises the [Params.Path] and [Params.Args] fields.
-func NewCommand(ctx context.Context, pathname, name string, args ...string) *Container {
+func NewCommand(ctx context.Context, pathname *Absolute, name string, args ...string) *Container {
z := New(ctx)
z.Path = pathname
z.Args = append([]string{name}, args...)