|  | // 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) |