38 lines
915 B
Go
38 lines
915 B
Go
// 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)
|