summaryrefslogtreecommitdiffstats
path: root/client/go/script-utils
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2022-09-29 13:06:45 +0000
committerArne Juul <arnej@yahooinc.com>2022-09-29 13:06:45 +0000
commit791b304870044f478fcd7fcd095157c63c55b978 (patch)
tree02ad55ee3739cea719ce89657751804862c9bb8b /client/go/script-utils
parent4814a02927ba9490f58ed1c0b043b3ee8e853752 (diff)
use unix.Exec
Diffstat (limited to 'client/go/script-utils')
-rw-r--r--client/go/script-utils/startcbinary/execvp.go42
-rw-r--r--client/go/script-utils/startcbinary/execvp_windows.go14
-rw-r--r--client/go/script-utils/startcbinary/progspec.go28
-rw-r--r--client/go/script-utils/startcbinary/startcbinary.go29
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)
}