-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
exec.LookPath() unix/windows separation
R=brainman, rsc, vcc, rsc1 CC=golang-dev https://golang.org/cl/2068041
- Loading branch information
1 parent
e181bf6
commit b155a76
Showing
5 changed files
with
153 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// Copyright 2010 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" | ||
) | ||
|
||
func canExec(file string) bool { | ||
d, err := os.Stat(file) | ||
if err != nil { | ||
return false | ||
} | ||
return d.IsRegular() && d.Permission()&0111 != 0 | ||
} | ||
|
||
// LookPath searches for an executable binary named file | ||
// in the directories named by the PATH environment variable. | ||
// If file contains a slash, it is tried directly and the PATH is not consulted. | ||
func LookPath(file string) (string, os.Error) { | ||
// NOTE(rsc): I wish we could use the Plan 9 behavior here | ||
// (only bypass the path if file begins with / or ./ or ../) | ||
// but that would not match all the Unix shells. | ||
|
||
if strings.Index(file, "/") >= 0 { | ||
if canExec(file) { | ||
return file, nil | ||
} | ||
return "", os.ENOENT | ||
} | ||
pathenv := os.Getenv("PATH") | ||
for _, dir := range strings.Split(pathenv, ":", -1) { | ||
if dir == "" { | ||
// Unix shell semantics: path element "" means "." | ||
dir = "." | ||
} | ||
if canExec(dir + "/" + file) { | ||
return dir + "/" + file, nil | ||
} | ||
} | ||
return "", os.ENOENT | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright 2010 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" | ||
) | ||
|
||
func chkStat(file string) bool { | ||
d, err := os.Stat(file) | ||
if err != nil { | ||
return false | ||
} | ||
return d.IsRegular() | ||
} | ||
|
||
func canExec(file string, exts []string) (string, bool) { | ||
if len(exts) == 0 { | ||
return file, chkStat(file) | ||
} | ||
f := strings.ToLower(file) | ||
for _, e := range exts { | ||
if strings.HasSuffix(f, e) { | ||
return file, chkStat(file) | ||
} | ||
} | ||
for _, e := range exts { | ||
if f := file + e; chkStat(f) { | ||
return f, true | ||
} | ||
} | ||
return ``, false | ||
} | ||
|
||
func LookPath(file string) (string, os.Error) { | ||
exts := []string{} | ||
if x := os.Getenv(`PATHEXT`); x != `` { | ||
exts = strings.Split(strings.ToLower(x), `;`, -1) | ||
for i, e := range exts { | ||
if e == `` || e[0] != '.' { | ||
exts[i] = `.` + e | ||
} | ||
} | ||
} | ||
if strings.Index(file, `\`) >= 0 || strings.Index(file, `/`) >= 0 { | ||
if f, ok := canExec(file, exts); ok { | ||
return f, nil | ||
} | ||
return ``, os.ENOENT | ||
} | ||
if pathenv := os.Getenv(`PATH`); pathenv == `` { | ||
if f, ok := canExec(`.\`+file, exts); ok { | ||
return f, nil | ||
} | ||
} else { | ||
for _, dir := range strings.Split(pathenv, `;`, -1) { | ||
if f, ok := canExec(dir+`\`+file, exts); ok { | ||
return f, nil | ||
} | ||
} | ||
} | ||
return ``, os.ENOENT | ||
} |