diff options
author | Arne Juul <arnej@yahooinc.com> | 2022-10-27 12:28:40 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2022-10-27 12:29:14 +0000 |
commit | f2fbeb7650ce2d6e4e4cc20aa216d71f7c674bca (patch) | |
tree | 7b9a3feb1b6a8f529683b716c60f5040f4cbc430 | |
parent | 66705589eabecefd5e4c0442b050afe6b65c4527 (diff) |
we will need execvp() more places, move to util
-rw-r--r-- | client/go/script-utils/startcbinary/execvp_windows.go | 14 | ||||
-rw-r--r-- | client/go/script-utils/startcbinary/startcbinary.go | 4 | ||||
-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.go | 22 | ||||
-rw-r--r-- | client/go/util/io.go | 9 |
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 |