| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package poll |
| |
| import ( |
| "syscall" |
| _ "unsafe" // for go:linkname |
| ) |
| |
| // OpenDir returns a pointer to a DIR structure suitable for |
| // ReadDir. In case of an error, the name of the failed |
| // syscall is returned along with a syscall.Errno. |
| func (fd *FD) OpenDir() (uintptr, string, error) { |
| // fdopendir(3) takes control of the file descriptor, |
| // so use a dup. |
| fd2, call, err := fd.Dup() |
| if err != nil { |
| return 0, call, err |
| } |
| var dir uintptr |
| for { |
| dir, err = fdopendir(fd2) |
| if err != syscall.EINTR { |
| break |
| } |
| } |
| if err != nil { |
| syscall.Close(fd2) |
| return 0, "fdopendir", err |
| } |
| return dir, "", nil |
| } |
| |
| // Implemented in syscall/syscall_darwin.go. |
| //go:linkname fdopendir syscall.fdopendir |
| func fdopendir(fd int) (dir uintptr, err error) |