aboutsummaryrefslogtreecommitdiffhomepage
path: root/container
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-02-28 20:42:33 +0900
committerOphestra <cat@gensokyo.uk>2026-02-28 20:44:44 +0900
commitc74c269b66770f0eddde255d2805b79f274409e9 (patch)
tree02cb3e1bed01d24776d8d47a9c8fca47ed3d7343 /container
parent4b0cce4db5f8e75c79e104f8c5ec02cb4541ed76 (diff)
container: use /proc/self/exe directly
This is a more reliable form of pathname to self and also cheaper than os.Executable. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container')
-rw-r--r--container/container.go2
-rw-r--r--container/container_test.go5
-rw-r--r--container/executable.go3
-rw-r--r--container/fhs/abs.go2
-rw-r--r--container/fhs/fhs.go4
5 files changed, 12 insertions, 4 deletions
diff --git a/container/container.go b/container/container.go
index a6457714..8b5ec01d 100644
--- a/container/container.go
+++ b/container/container.go
@@ -525,7 +525,7 @@ func New(ctx context.Context, msg message.Msg) *Container {
p := &Container{ctx: ctx, msg: msg, Params: Params{Ops: new(Ops)}}
c, cancel := context.WithCancel(ctx)
p.cancel = cancel
- p.cmd = exec.CommandContext(c, MustExecutable(msg))
+ p.cmd = exec.CommandContext(c, fhs.ProcSelfExe)
return p
}
diff --git a/container/container_test.go b/container/container_test.go
index 852304e7..e00a63c7 100644
--- a/container/container_test.go
+++ b/container/container_test.go
@@ -773,14 +773,13 @@ func TestMain(m *testing.M) {
func helperNewContainerLibPaths(ctx context.Context, libPaths *[]*check.Absolute, args ...string) (c *container.Container) {
msg := message.New(nil)
msg.SwapVerbose(testing.Verbose())
- executable := check.MustAbs(container.MustExecutable(msg))
c = container.NewCommand(ctx, msg, absHelperInnerPath, "helper", args...)
c.Env = append(c.Env, envDoCheck+"=1")
- c.Bind(executable, absHelperInnerPath, 0)
+ c.Bind(fhs.AbsProcSelfExe, absHelperInnerPath, 0)
// in case test has cgo enabled
- if entries, err := ldd.Resolve(ctx, msg, executable); err != nil {
+ if entries, err := ldd.Resolve(ctx, msg, nil); err != nil {
log.Fatalf("ldd: %v", err)
} else {
*libPaths = ldd.Path(entries)
diff --git a/container/executable.go b/container/executable.go
index 67c43a70..b825306a 100644
--- a/container/executable.go
+++ b/container/executable.go
@@ -28,6 +28,9 @@ func copyExecutable(msg message.Msg) {
}
}
+// MustExecutable calls [os.Executable] and terminates the process on error.
+//
+// Deprecated: This is no longer used and will be removed in 0.4.
func MustExecutable(msg message.Msg) string {
executableOnce.Do(func() { copyExecutable(msg) })
return executable
diff --git a/container/fhs/abs.go b/container/fhs/abs.go
index fda6971d..45c50bfd 100644
--- a/container/fhs/abs.go
+++ b/container/fhs/abs.go
@@ -42,6 +42,8 @@ var (
AbsDevShm = unsafeAbs(DevShm)
// AbsProc is [Proc] as [check.Absolute].
AbsProc = unsafeAbs(Proc)
+ // AbsProcSelfExe is [ProcSelfExe] as [check.Absolute].
+ AbsProcSelfExe = unsafeAbs(ProcSelfExe)
// AbsSys is [Sys] as [check.Absolute].
AbsSys = unsafeAbs(Sys)
)
diff --git a/container/fhs/fhs.go b/container/fhs/fhs.go
index e0c1d861..6d098d0c 100644
--- a/container/fhs/fhs.go
+++ b/container/fhs/fhs.go
@@ -41,6 +41,10 @@ const (
// ProcSys points to a hierarchy below /proc/ that exposes a number of
// kernel tunables.
ProcSys = Proc + "sys/"
+ // ProcSelf resolves to the process's own /proc/pid directory.
+ ProcSelf = Proc + "self/"
+ // ProcSelfExe is a symbolic link to program pathname.
+ ProcSelfExe = ProcSelf + "exe"
// Sys points to a virtual kernel file system exposing discovered devices
// and other functionality.
Sys = "/sys/"