1 // Copyright 2009 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.
15 // FIXME: pathconf returns long, not int.
17 func libc_pathconf(*byte, int) int
19 func clen(n
[]byte) int {
20 for i
:= 0; i
< len(n
); i
++ {
30 func (file
*File
) readdirnames(n
int) (names
[]string, err error
) {
31 if file
.dirinfo
== nil {
32 p
, err
:= syscall
.BytePtrFromString(file
.name
)
37 elen
:= int(atomic
.LoadInt32(&nameMax
))
39 syscall
.Entersyscall()
40 plen
:= libc_pathconf(p
, syscall
.PC_NAME_MAX
)
45 var dummy syscall
.Dirent
46 elen
= int(unsafe
.Offsetof(dummy
.Name
)) + plen
+ 1
47 atomic
.StoreInt32(&nameMax
, int32(elen
))
50 syscall
.Entersyscall()
52 errno
:= syscall
.GetErrno()
55 return nil, &PathError
{"opendir", file
.name
, errno
}
58 file
.dirinfo
= new(dirInfo
)
59 file
.dirinfo
.buf
= make([]byte, elen
)
63 entryDirent
:= (*syscall
.Dirent
)(unsafe
.Pointer(&file
.dirinfo
.buf
[0]))
71 names
= make([]string, 0, size
) // Empty with room to grow.
74 var dirent
*syscall
.Dirent
76 syscall
.Entersyscall()
77 i
:= libc_readdir_r(file
.dirinfo
.dir
, entryDirent
, pr
)
79 // On AIX when readdir_r hits EOF it sets dirent to nil and returns 9.
80 // https://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.basetrf2/readdir_r.htm
81 if runtime
.GOOS
== "aix" && i
== 9 && dirent
== nil {
85 return names
, NewSyscallError("readdir_r", i
)
90 bytes
:= (*[10000]byte)(unsafe
.Pointer(&dirent
.Name
[0]))
91 var name
= string(bytes
[0:clen(bytes
[:])])
92 if name
== "." || name
== ".." { // Useless names
95 names
= append(names
, name
)
98 if n
>= 0 && len(names
) == 0 {