diff options
author | Arne Juul <arnej@yahooinc.com> | 2022-09-29 13:06:45 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2022-09-29 13:06:45 +0000 |
commit | 791b304870044f478fcd7fcd095157c63c55b978 (patch) | |
tree | 02ad55ee3739cea719ce89657751804862c9bb8b /client/go/script-utils | |
parent | 4814a02927ba9490f58ed1c0b043b3ee8e853752 (diff) |
use unix.Exec
Diffstat (limited to 'client/go/script-utils')
-rw-r--r-- | client/go/script-utils/startcbinary/execvp.go | 42 | ||||
-rw-r--r-- | client/go/script-utils/startcbinary/execvp_windows.go | 14 | ||||
-rw-r--r-- | client/go/script-utils/startcbinary/progspec.go | 28 | ||||
-rw-r--r-- | client/go/script-utils/startcbinary/startcbinary.go | 29 |
4 files changed, 91 insertions, 22 deletions
diff --git a/client/go/script-utils/startcbinary/execvp.go b/client/go/script-utils/startcbinary/execvp.go new file mode 100644 index 00000000000..a39f76ebc3b --- /dev/null +++ b/client/go/script-utils/startcbinary/execvp.go @@ -0,0 +1,42 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +//go:build !windows + +package startcbinary + +import ( + "fmt" + "os" + "strings" + + "github.com/vespa-engine/vespa/client/go/trace" + "github.com/vespa-engine/vespa/client/go/util" + "golang.org/x/sys/unix" +) + +func findInPath(prog string) string { + if strings.Contains(prog, "/") { + return prog + } + path := strings.Split(os.Getenv(ENV_PATH), ":") + for _, dir := range path { + fn := dir + "/" + prog + if util.IsRegularFile(fn) { + return fn + } + } + return prog +} + +func myexecvp(prog string, args []string, envv []string) error { + argv := make([]string, 0, 1+len(args)) + argv = append(argv, prog) + for _, arg := range args { + argv = append(argv, arg) + } + trace.Trace("run cmd", strings.Join(argv, " ")) + prog = findInPath(prog) + err := unix.Exec(prog, argv, envv) + return fmt.Errorf("cannot execute '%s': %v", prog, err) +} diff --git a/client/go/script-utils/startcbinary/execvp_windows.go b/client/go/script-utils/startcbinary/execvp_windows.go new file mode 100644 index 00000000000..f0642dcf9a0 --- /dev/null +++ b/client/go/script-utils/startcbinary/execvp_windows.go @@ -0,0 +1,14 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +//go:build windows + +package startcbinary + +import ( + "fmt" +) + +func myexecvp(prog string, args []string, envv []string) error { + return fmt.Errorf("cannot execvp: %s", prog) +} diff --git a/client/go/script-utils/startcbinary/progspec.go b/client/go/script-utils/startcbinary/progspec.go index a531a862afe..10097419395 100644 --- a/client/go/script-utils/startcbinary/progspec.go +++ b/client/go/script-utils/startcbinary/progspec.go @@ -105,3 +105,31 @@ func (p *ProgSpec) valueFromListString(env string) string { } return "" } + +func (spec *ProgSpec) effectiveEnv() []string { + env := make(map[string]string) + for _, entry := range os.Environ() { + addInMap := func(kv string) bool { + for idx, elem := range kv { + if elem == '=' { + k := kv[:idx] + env[k] = kv + return true + } + } + return false + } + if !addInMap(entry) { + env[entry] = "" + } + } + for k, v := range spec.Env { + trace.Trace("add to environment:", k, "=", v) + env[k] = k + "=" + v + } + envv := make([]string, 0, len(env)) + for _, v := range env { + envv = append(envv, v) + } + return envv +} diff --git a/client/go/script-utils/startcbinary/startcbinary.go b/client/go/script-utils/startcbinary/startcbinary.go index 54b92d3ef06..92f09d9098c 100644 --- a/client/go/script-utils/startcbinary/startcbinary.go +++ b/client/go/script-utils/startcbinary/startcbinary.go @@ -6,9 +6,6 @@ package startcbinary import ( "fmt" "os" - "os/exec" - - "github.com/vespa-engine/vespa/client/go/trace" ) func startCbinary(spec ProgSpec) int { @@ -32,28 +29,16 @@ func startCbinary(spec ProgSpec) int { func (spec *ProgSpec) run() error { prog := spec.Program + "-bin" args := spec.Args - cmd := exec.Command(prog, args...) if spec.shouldUseValgrind { - cmd.Path = spec.valgrindBinary() - cmd.Args = spec.prependValgrind(prog, args) + args = spec.prependValgrind(prog, args) + prog = spec.valgrindBinary() } else if spec.shouldUseNumaCtl { - cmd.Path = spec.numaCtlBinary() - cmd.Args = spec.prependNumaCtl(prog, args) + args = spec.prependNumaCtl(prog, args) + prog = spec.numaCtlBinary() } if spec.shouldUseVespaMalloc { - spec.setenv("LD_PRELOAD", spec.vespaMallocPreload) - } - if len(spec.Env) > 0 { - env := os.Environ() - for k, v := range spec.Env { - trace.Trace("add to environment:", k, "=", v) - env = append(env, k+"="+v) - } - cmd.Env = env + spec.setenv(ENV_LD_PRELOAD, spec.vespaMallocPreload) } - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - trace.Trace("run cmd", cmd) - return cmd.Run() + envv := spec.effectiveEnv() + return myexecvp(prog, args, envv) } |