github.com/bir3/gocompiler@v0.9.2202/src/cmd/gocmd/internal/toolchain/path_unix.go (about) 1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build unix 6 7 package toolchain 8 9 import ( 10 "github.com/bir3/gocompiler/src/xvendor/golang.org/x/sys/unix" 11 "io/fs" 12 "os" 13 "path/filepath" 14 "syscall" 15 16 "github.com/bir3/gocompiler/src/cmd/gocmd/internal/gover" 17 ) 18 19 // pathDirs returns the directories in the system search path. 20 func pathDirs() []string { 21 return filepath.SplitList(os.Getenv("PATH")) 22 } 23 24 // pathVersion returns the Go version implemented by the file 25 // described by de and info in directory dir. 26 // The analysis only uses the name itself; it does not run the program. 27 func pathVersion(dir string, de fs.DirEntry, info fs.FileInfo) (string, bool) { 28 v := gover.FromToolchain(de.Name()) 29 if v == "" { 30 return "", false 31 } 32 33 // Mimicking exec.findExecutable here. 34 // ENOSYS means Eaccess is not available or not implemented. 35 // EPERM can be returned by Linux containers employing seccomp. 36 // In both cases, fall back to checking the permission bits. 37 err := unix.Eaccess(filepath.Join(dir, de.Name()), unix.X_OK) 38 if (err == syscall.ENOSYS || err == syscall.EPERM) && info.Mode()&0111 != 0 { 39 err = nil 40 } 41 if err != nil { 42 return "", false 43 } 44 45 return v, true 46 }