| | |
| | |
| | |
| |
|
| | package exec |
| |
|
| | import ( |
| | "errors" |
| | "io/fs" |
| | "os" |
| | "path/filepath" |
| | "strings" |
| | ) |
| |
|
| | |
| | var ErrNotFound = errors.New("executable file not found in $path") |
| |
|
| | func findExecutable(file string) error { |
| | d, err := os.Stat(file) |
| | if err != nil { |
| | return err |
| | } |
| | if m := d.Mode(); !m.IsDir() && m&0111 != 0 { |
| | return nil |
| | } |
| | return fs.ErrPermission |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | func LookPath(file string) (string, error) { |
| | if err := validateLookPath(filepath.Clean(file)); err != nil { |
| | return "", &Error{file, err} |
| | } |
| |
|
| | |
| | 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 filepath.SplitList(path) { |
| | path := filepath.Join(dir, file) |
| | if err := findExecutable(path); err == nil { |
| | if !filepath.IsAbs(path) { |
| | if execerrdot.Value() != "0" { |
| | return path, &Error{file, ErrDot} |
| | } |
| | execerrdot.IncNonDefault() |
| | } |
| | return path, nil |
| | } |
| | } |
| | return "", &Error{file, ErrNotFound} |
| | } |
| |
|
| | |
| | |
| | func lookExtensions(path, dir string) (string, error) { |
| | return path, nil |
| | } |
| |
|