1package reexec // import "github.com/docker/docker/pkg/reexec"
2
3import (
4	"fmt"
5	"os"
6	"os/exec"
7	"path/filepath"
8)
9
10var registeredInitializers = make(map[string]func())
11
12// Register adds an initialization func under the specified name
13func Register(name string, initializer func()) {
14	if _, exists := registeredInitializers[name]; exists {
15		panic(fmt.Sprintf("reexec func already registered under name %q", name))
16	}
17
18	registeredInitializers[name] = initializer
19}
20
21// Init is called as the first part of the exec process and returns true if an
22// initialization function was called.
23func Init() bool {
24	initializer, exists := registeredInitializers[os.Args[0]]
25	if exists {
26		initializer()
27
28		return true
29	}
30	return false
31}
32
33func naiveSelf() string {
34	name := os.Args[0]
35	if filepath.Base(name) == name {
36		if lp, err := exec.LookPath(name); err == nil {
37			return lp
38		}
39	}
40	// handle conversion of relative paths to absolute
41	if absName, err := filepath.Abs(name); err == nil {
42		return absName
43	}
44	// if we couldn't get absolute name, return original
45	// (NOTE: Go only errors on Abs() if os.Getwd fails)
46	return name
47}
48