summaryrefslogtreecommitdiff
path: root/src/lib/os/dir_amd64_darwin.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/os/dir_amd64_darwin.go')
-rw-r--r--src/lib/os/dir_amd64_darwin.go20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/lib/os/dir_amd64_darwin.go b/src/lib/os/dir_amd64_darwin.go
index 681a710d1..2803ecee2 100644
--- a/src/lib/os/dir_amd64_darwin.go
+++ b/src/lib/os/dir_amd64_darwin.go
@@ -32,25 +32,31 @@ func readdirnames(file *File, count int) (names []string, err Error) {
for count != 0 {
// Refill the buffer if necessary
if d.bufp >= d.nbuf {
- var errno int64;
- // Final argument is (basep *int64) and the syscall doesn't take nil.
- d.nbuf, errno = syscall.Getdirentries(file.fd, &d.buf[0], int64(len(d.buf)), new(int64));
- if d.nbuf < 0 {
+ var errno int;
+ d.bufp = 0;
+ // Final argument is (basep *uintptr) and the syscall doesn't take nil.
+ d.nbuf, errno = syscall.Getdirentries(file.fd, d.buf, new(uintptr));
+ if errno != 0 {
+ d.nbuf = 0;
return names, ErrnoToError(errno)
}
if d.nbuf == 0 {
break // EOF
}
- d.bufp = 0;
}
// Drain the buffer
for count != 0 && d.bufp < d.nbuf {
dirent := (*syscall.Dirent)(unsafe.Pointer(&d.buf[d.bufp]));
- d.bufp += int64(dirent.Reclen);
+ if dirent.Reclen == 0 {
+ d.bufp = d.nbuf;
+ break
+ }
+ d.bufp += int(dirent.Reclen);
if dirent.Ino == 0 { // File absent in directory.
continue
}
- var name = string(dirent.Name[0:dirent.Namlen]);
+ bytes := (*[len(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]));
+ var name = string(bytes[0:dirent.Namlen]);
if name == "." || name == ".." { // Useless names
continue
}