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 func lookPath(file string) (string, error) {
45
46
47
48
49 if err := validateLookPath(file); err != nil {
50 return "", &Error{file, err}
51 }
52
53 if strings.Contains(file, "/") {
54 err := findExecutable(file)
55 if err == nil {
56 return file, nil
57 }
58 return "", &Error{file, err}
59 }
60 path := os.Getenv("PATH")
61 for _, dir := range filepath.SplitList(path) {
62 if dir == "" {
63
64 dir = "."
65 }
66 path := filepath.Join(dir, file)
67 if err := findExecutable(path); err == nil {
68 if !filepath.IsAbs(path) {
69 if execerrdot.Value() != "0" {
70 return path, &Error{file, ErrDot}
71 }
72 execerrdot.IncNonDefault()
73 }
74 return path, nil
75 }
76 }
77 return "", &Error{file, ErrNotFound}
78 }
79
80
81
82 func lookExtensions(path, dir string) (string, error) {
83 return path, nil
84 }
85
View as plain text