Source file
src/os/exec/lp_unix.go
1
2
3
4
5
6
7 package exec
8
9 import (
10 "errors"
11 "internal/syscall/unix"
12 "io/fs"
13 "os"
14 "path/filepath"
15 "strings"
16 "syscall"
17 )
18
19
20 var ErrNotFound = errors.New("executable file not found in $PATH")
21
22 func findExecutable(file string) error {
23 d, err := os.Stat(file)
24 if err != nil {
25 return err
26 }
27 m := d.Mode()
28 if m.IsDir() {
29 return syscall.EISDIR
30 }
31 err = unix.Eaccess(file, unix.X_OK)
32
33
34
35 if err == nil || (err != syscall.ENOSYS && err != syscall.EPERM) {
36 return err
37 }
38 if m&0111 != 0 {
39 return nil
40 }
41 return fs.ErrPermission
42 }
43
44
45
46
47
48
49
50
51
52 func LookPath(file string) (string, error) {
53
54
55
56
57 if err := validateLookPath(file); err != nil {
58 return "", &Error{file, err}
59 }
60
61 if strings.Contains(file, "/") {
62 err := findExecutable(file)
63 if err == nil {
64 return file, nil
65 }
66 return "", &Error{file, err}
67 }
68 path := os.Getenv("PATH")
69 for _, dir := range filepath.SplitList(path) {
70 if dir == "" {
71
72 dir = "."
73 }
74 path := filepath.Join(dir, file)
75 if err := findExecutable(path); err == nil {
76 if !filepath.IsAbs(path) {
77 if execerrdot.Value() != "0" {
78 return path, &Error{file, ErrDot}
79 }
80 execerrdot.IncNonDefault()
81 }
82 return path, nil
83 }
84 }
85 return "", &Error{file, ErrNotFound}
86 }
87
88
89
90 func lookExtensions(path, dir string) (string, error) {
91 return path, nil
92 }
93
View as plain text