diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-06-30 15:34:22 +0200 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-06-30 15:34:22 +0200 | 
| commit | d39f5aa373a4422f7a5f3ee764fb0f6b0b719d61 (patch) | |
| tree | 1833f8b72a4b3a8f00d0d143b079a8fcad01c6ae /src/pkg/exec/lp_unix.go | |
| parent | 8652e6c371b8905498d3d314491d36c58d5f68d5 (diff) | |
| download | golang-d39f5aa373a4422f7a5f3ee764fb0f6b0b719d61.tar.gz | |
Imported Upstream version 58upstream/58
Diffstat (limited to 'src/pkg/exec/lp_unix.go')
| -rw-r--r-- | src/pkg/exec/lp_unix.go | 21 | 
1 files changed, 14 insertions, 7 deletions
| diff --git a/src/pkg/exec/lp_unix.go b/src/pkg/exec/lp_unix.go index 44f84347b..3fc3be832 100644 --- a/src/pkg/exec/lp_unix.go +++ b/src/pkg/exec/lp_unix.go @@ -9,12 +9,18 @@ import (  	"strings"  ) -func canExec(file string) bool { +// 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 false +		return err +	} +	if d.IsRegular() && d.Permission()&0111 != 0 { +		return nil  	} -	return d.IsRegular() && d.Permission()&0111 != 0 +	return os.EPERM  }  // LookPath searches for an executable binary named file @@ -26,10 +32,11 @@ func LookPath(file string) (string, os.Error) {  	// but that would not match all the Unix shells.  	if strings.Contains(file, "/") { -		if canExec(file) { +		err := findExecutable(file) +		if err == nil {  			return file, nil  		} -		return "", &PathError{file} +		return "", &Error{file, err}  	}  	pathenv := os.Getenv("PATH")  	for _, dir := range strings.Split(pathenv, ":", -1) { @@ -37,9 +44,9 @@ func LookPath(file string) (string, os.Error) {  			// Unix shell semantics: path element "" means "."  			dir = "."  		} -		if canExec(dir + "/" + file) { +		if err := findExecutable(dir + "/" + file); err == nil {  			return dir + "/" + file, nil  		}  	} -	return "", &PathError{file} +	return "", &Error{file, ErrNotFound}  } | 
