diff options
| author | Anthony Martin <ality@pbrane.org> | 2011-06-20 13:34:10 +1000 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2011-06-20 13:34:10 +1000 |
| commit | 20943baed3da37226b1c2a5006d8c8e64d7b869d (patch) | |
| tree | 2a6bc7f894c25810fd5eb013c111882de0e2dc5a /src/pkg/exec | |
| parent | c319fb07bcae09589f83f060a4fdfef93a521348 (diff) | |
| download | go-20943baed3da37226b1c2a5006d8c8e64d7b869d.tar.xz | |
exec: add support for Plan 9
R=paulzhol, mirtchovski, fshahriar, alex.brainman, r
CC=golang-dev
https://golang.org/cl/4386041
Diffstat (limited to 'src/pkg/exec')
| -rw-r--r-- | src/pkg/exec/Makefile | 3 | ||||
| -rw-r--r-- | src/pkg/exec/lp_plan9.go | 51 |
2 files changed, 54 insertions, 0 deletions
diff --git a/src/pkg/exec/Makefile b/src/pkg/exec/Makefile index 262ecac85e..90bb74b41c 100644 --- a/src/pkg/exec/Makefile +++ b/src/pkg/exec/Makefile @@ -20,6 +20,9 @@ GOFILES_linux=\ GOFILES_windows=\ lp_windows.go\ +GOFILES_plan9=\ + lp_plan9.go\ + GOFILES+=$(GOFILES_$(GOOS)) include ../../Make.pkg diff --git a/src/pkg/exec/lp_plan9.go b/src/pkg/exec/lp_plan9.go new file mode 100644 index 0000000000..d0912f9e9e --- /dev/null +++ b/src/pkg/exec/lp_plan9.go @@ -0,0 +1,51 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package exec + +import ( + "os" + "strings" +) + +// ErrNotFound is the error resulting if a path search failed to find an executable file. +var ErrNotFound = os.ErrorString("executable file not found in $path") + +func findExecutable(file string) os.Error { + d, err := os.Stat(file) + if err != nil { + return err + } + if d.IsRegular() && d.Permission()&0111 != 0 { + return nil + } + return os.EPERM +} + +// LookPath searches for an executable binary named file +// in the directories named by the path environment variable. +// If file begins with "/", "#", "./", or "../", it is tried +// directly and the path is not consulted. +func LookPath(file string) (string, os.Error) { + // skip the path lookup for these prefixes + skip := []string{"/", "#", "./", "../"} + + for _, p := range skip { + if strings.HasPrefix(file, p) { + err := findExecutable(file) + if err == nil { + return file, nil + } + return "", &Error{file, err} + } + } + + path := os.Getenv("path") + for _, dir := range strings.Split(path, "\000", -1) { + if err := findExecutable(dir + "/" + file); err == nil { + return dir + "/" + file, nil + } + } + return "", &Error{file, ErrNotFound} +} |
