summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2022-10-27 12:28:40 +0000
committerArne Juul <arnej@yahooinc.com>2022-10-27 12:29:14 +0000
commitf2fbeb7650ce2d6e4e4cc20aa216d71f7c674bca (patch)
tree7b9a3feb1b6a8f529683b716c60f5040f4cbc430
parent66705589eabecefd5e4c0442b050afe6b65c4527 (diff)
we will need execvp() more places, move to util
-rw-r--r--client/go/script-utils/startcbinary/execvp_windows.go14
-rw-r--r--client/go/script-utils/startcbinary/startcbinary.go4
-rw-r--r--client/go/util/execvp.go (renamed from client/go/script-utils/startcbinary/execvp.go)17
-rw-r--r--client/go/util/execvp_windows.go22
-rw-r--r--client/go/util/io.go9
5 files changed, 46 insertions, 20 deletions
diff --git a/client/go/script-utils/startcbinary/execvp_windows.go b/client/go/script-utils/startcbinary/execvp_windows.go
deleted file mode 100644
index f0642dcf9a0..00000000000
--- a/client/go/script-utils/startcbinary/execvp_windows.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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/startcbinary.go b/client/go/script-utils/startcbinary/startcbinary.go
index 7a2b13ebf87..ca1ab181f7e 100644
--- a/client/go/script-utils/startcbinary/startcbinary.go
+++ b/client/go/script-utils/startcbinary/startcbinary.go
@@ -6,6 +6,8 @@ package startcbinary
import (
"fmt"
"os"
+
+ "github.com/vespa-engine/vespa/client/go/util"
)
func startCbinary(spec *ProgSpec) int {
@@ -40,5 +42,5 @@ func (spec *ProgSpec) run() error {
spec.setenv(ENV_LD_PRELOAD, spec.vespaMallocPreload)
}
envv := spec.effectiveEnv()
- return myexecvp(prog, args, envv)
+ return util.Execvpe(prog, args, envv)
}
diff --git a/client/go/script-utils/startcbinary/execvp.go b/client/go/util/execvp.go
index 6ca34c4076b..2b47af4de1b 100644
--- a/client/go/script-utils/startcbinary/execvp.go
+++ b/client/go/util/execvp.go
@@ -3,7 +3,7 @@
//go:build !windows
-package startcbinary
+package util
import (
"fmt"
@@ -11,7 +11,6 @@ import (
"strings"
"github.com/vespa-engine/vespa/client/go/trace"
- "github.com/vespa-engine/vespa/client/go/util"
"golang.org/x/sys/unix"
)
@@ -19,19 +18,27 @@ func findInPath(prog string) string {
if strings.Contains(prog, "/") {
return prog
}
- path := strings.Split(os.Getenv(ENV_PATH), ":")
+ path := strings.Split(os.Getenv("PATH"), ":")
for _, dir := range path {
fn := dir + "/" + prog
- if util.IsRegularFile(fn) {
+ if IsExecutableFile(fn) {
return fn
}
}
return prog
}
-func myexecvp(prog string, argv []string, envv []string) error {
+func Execvp(prog string, argv []string) error {
+ return Execvpe(prog, argv, os.Environ())
+}
+
+func Execvpe(prog string, argv []string, envv []string) error {
prog = findInPath(prog)
argv[0] = prog
+ return Execve(prog, argv, envv)
+}
+
+func Execve(prog string, argv []string, envv []string) error {
trace.Trace("run cmd:", strings.Join(argv, " "))
err := unix.Exec(prog, argv, envv)
return fmt.Errorf("cannot execute '%s': %v", prog, err)
diff --git a/client/go/util/execvp_windows.go b/client/go/util/execvp_windows.go
new file mode 100644
index 00000000000..24b67e221c8
--- /dev/null
+++ b/client/go/util/execvp_windows.go
@@ -0,0 +1,22 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Author: arnej
+
+//go:build windows
+
+package util
+
+import (
+ "fmt"
+)
+
+func Execvp(prog string, argv []string) error {
+ return fmt.Errorf("cannot execvp on windows: %s", prog)
+}
+
+func Execvpe(prog string, argv []string, envv []string) error {
+ return fmt.Errorf("cannot execvp on windows: %s", prog)
+}
+
+func Execve(prog string, argv []string, envv []string) error {
+ return fmt.Errorf("cannot execvp on windows: %s", prog)
+}
diff --git a/client/go/util/io.go b/client/go/util/io.go
index 6aab64b8827..50122324fae 100644
--- a/client/go/util/io.go
+++ b/client/go/util/io.go
@@ -32,6 +32,15 @@ func IsRegularFile(path string) bool {
return !errors.Is(err, os.ErrNotExist) && info != nil && info.Mode().IsRegular()
}
+// Returns true if the given path points to an executable
+func IsExecutableFile(path string) bool {
+ info, err := os.Stat(path)
+ return !errors.Is(err, os.ErrNotExist) &&
+ info != nil &&
+ info.Mode().IsRegular() &&
+ ((info.Mode() & 0111) == 0111)
+}
+
// Returns the content of a reader as a string
func ReaderToString(reader io.Reader) string {
var buffer strings.Builder