| | |
| | |
| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | package main |
| |
|
| | import ( |
| | "fmt" |
| | "internal/poll" |
| | "io" |
| | "os" |
| | "os/exec" |
| | "os/exec/internal/fdtest" |
| | "runtime" |
| | ) |
| |
|
| | func main() { |
| | fd3 := os.NewFile(3, "fd3") |
| | defer fd3.Close() |
| |
|
| | bs, err := io.ReadAll(fd3) |
| | if err != nil { |
| | fmt.Printf("ReadAll from fd 3: %v\n", err) |
| | os.Exit(1) |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | for fd := uintptr(4); fd <= 100; fd++ { |
| | if poll.IsPollDescriptor(fd) { |
| | continue |
| | } |
| |
|
| | if !fdtest.Exists(fd) { |
| | continue |
| | } |
| |
|
| | fmt.Printf("leaked parent file. fdtest.Exists(%d) got true want false\n", fd) |
| |
|
| | fdfile := fmt.Sprintf("/proc/self/fd/%d", fd) |
| | link, err := os.Readlink(fdfile) |
| | fmt.Printf("readlink(%q) = %q, %v\n", fdfile, link, err) |
| |
|
| | var args []string |
| | switch runtime.GOOS { |
| | case "plan9": |
| | args = []string{fmt.Sprintf("/proc/%d/fd", os.Getpid())} |
| | case "aix", "solaris", "illumos": |
| | args = []string{fmt.Sprint(os.Getpid())} |
| | default: |
| | args = []string{"-p", fmt.Sprint(os.Getpid())} |
| | } |
| |
|
| | |
| | ofcmd := "lsof" |
| | switch runtime.GOOS { |
| | case "dragonfly", "freebsd", "netbsd", "openbsd": |
| | ofcmd = "fstat" |
| | case "plan9": |
| | ofcmd = "/bin/cat" |
| | case "aix": |
| | ofcmd = "procfiles" |
| | case "solaris", "illumos": |
| | ofcmd = "pfiles" |
| | } |
| |
|
| | cmd := exec.Command(ofcmd, args...) |
| | out, err := cmd.CombinedOutput() |
| | if err != nil { |
| | fmt.Fprintf(os.Stderr, "%#q failed: %v\n", cmd, err) |
| | } |
| | fmt.Printf("%s", out) |
| | os.Exit(1) |
| | } |
| |
|
| | os.Stdout.Write(bs) |
| | } |
| |
|